Slide 1

Slide 1 text

QEMUを用いた 自動バイナリ防御機構の開発 開発駆動コース / 坂井ゼミ / 宮口誠

Slide 2

Slide 2 text

2 Summary

Slide 3

Slide 3 text

SeQEMU Secure QEMU

Slide 4

Slide 4 text

4 Buffer Overflow Format String RELRO Double Free Mitigation Detection System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function

Slide 5

Slide 5 text

5 Overview

Slide 6

Slide 6 text

6 提案アイディア 稼働しているサービスが攻撃を受けるのは困る Attack! Service Cracker

Slide 7

Slide 7 text

提案アイディア [ 攻撃を受けても動作を継続 | 被害前に停止 ] する仕組みを作る 7 Attack! Service Cracker

Slide 8

Slide 8 text

提案アイディア [ 攻撃を受けても動作を継続 | 被害前に停止 ] する仕組みを作る 8 Attack! Service Cracker キーワード:緩和 (Mitigation)

Slide 9

Slide 9 text

よくわからんという方へ 「いじめ」を想像してください いじめる側(攻撃者)は 相手(稼働サービス)の 反応が楽しくてやっている 9

Slide 10

Slide 10 text

よくわからんという方へ 「いじめ」を想像してください いじめる側(攻撃者)は 相手(稼働サービス)の 反応が楽しくてやっている →無視・無反応を貫く (=挙動から脆弱性を悟られない) 10 ※いじめに対しこのような対応を推奨するものではありません、悪しからず

Slide 11

Slide 11 text

11 Function Overview

Slide 12

Slide 12 text

12 実装概要 オープンソースのエミュレータ オリジナルの3.0.0を元に改造

Slide 13

Slide 13 text

QEMUの動作の仕組み 13 実行したい プログラム TCG (中間表現) 実行可能 コード

Slide 14

Slide 14 text

QEMUの動作の仕組み 14 実行したい プログラム TCG (中間表現) 実行可能 コード この途中で動作を変更するのは難しい (開発コストが高い)

Slide 15

Slide 15 text

TCGへの変換とその「隙間」 15 プログラム

Slide 16

Slide 16 text

TCGへの変換とその「隙間」 16 プログラム call、jmp命令など

Slide 17

Slide 17 text

TCGへの変換とその「隙間」 17 プログラム call、jmp命令など TCG 変換

Slide 18

Slide 18 text

TCGへの変換とその「隙間」 18 プログラム call、jmp命令など TCG 変換

Slide 19

Slide 19 text

TCGへの変換とその「隙間」 19 プログラム TCG call、jmp命令など TCG 変換 変換

Slide 20

Slide 20 text

TCGへの変換とその「隙間」 20 プログラム TCG call、jmp命令など TCG 変換 変換 開発コストを抑えて 実装したい機能を実現

Slide 21

Slide 21 text

21 緩和の仕組み .plt section printf (jmp to library) .text section (...) call printf (jmp to .plt) (...)

Slide 22

Slide 22 text

緩和の仕組み 22 .plt section printf (jmp to library) .text section (...) call printf (jmp to .plt) (...)

Slide 23

Slide 23 text

緩和の仕組み 23 .plt section printf (jmp to library) .text section (...) call printf (jmp to .plt) (...) HOOOOOOK!

Slide 24

Slide 24 text

緩和の仕組み 24 .plt section printf (jmp to library) .text section (...) call printf (jmp to .plt) (...) in Context Register ESP EBP EIP EAX Memory Stack Heap

Slide 25

Slide 25 text

25 Function Detail

Slide 26

Slide 26 text

26 Buffer Overflow Format String RELRO Double Free Mitigation Detection System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function

Slide 27

Slide 27 text

27 Buffer Overflow Format String RELRO Double Free Mitigation Detection System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function

Slide 28

Slide 28 text

28 1. Filtering Dangerous Function 危険な関数(getsなど)をバイナリの中から探し出す printf gets scanf Functions !!! Overview

Slide 29

Slide 29 text

1. Filtering Dangerous Function (Detail) 29 ①Elf32_Rel構造体のr_infoから対応するElf32_Sym構造体へのインデックスを取得 Elf32_Rel ... Proposal

Slide 30

Slide 30 text

1. Filtering Dangerous Function (Detail) 30 ①Elf32_Rel構造体のr_infoから対応するElf32_Sym構造体へのインデックスを取得 ②Elf32_Sym構造体のst_nameから対応する.dynstrへのインデックスを取得 Elf32_Rel Elf32_Sym Elf32_Sym Elf32_Sym ... ①r_info Proposal

Slide 31

Slide 31 text

1. Filtering Dangerous Function (Detail) 31 ①Elf32_Rel構造体のr_infoから対応するElf32_Sym構造体へのインデックスを取得 ②Elf32_Sym構造体のst_nameから対応する.dynstrへのインデックスを取得 ③.dynstrセクションから指定されたインデックスの文字列を調べる Elf32_Rel Elf32_Sym Elf32_Sym Elf32_Sym ... t f \0 g e t s \0 ①r_info ②st_name Proposal

Slide 32

Slide 32 text

1. Filtering Dangerous Function (Detail) 32 関数の名前を探しているだけ Elf32_Rel Elf32_Sym Elf32_Sym Elf32_Sym ... t f \0 g e t s \0 ①r_info ②st_name Proposal

Slide 33

Slide 33 text

実験 33 gets関数の使用 (危険な関数を使っている) ※C11でなくなった関数

Slide 34

Slide 34 text

結果 実行しないようにできた 34

Slide 35

Slide 35 text

2. Implementation of Self-NX No Excute (NX bit)の機能を擬似的に再現する 35 r w x p Overview

Slide 36

Slide 36 text

2. Implementation of Self-NX (Detail) 36 data code heap stack EIP Proposal

Slide 37

Slide 37 text

2. Implementation of Self-NX (Detail) 37 data heap stack EIP Proposal code

Slide 38

Slide 38 text

2. Implementation of Self-NX (Detail) 38 data code heap stack EIP Proposal

Slide 39

Slide 39 text

実験 39 /bin/shが立ち上がる シェルコードがある (今回はそれを実行する)

Slide 40

Slide 40 text

結果 /bin/shが実行されることなく終了している 40

Slide 41

Slide 41 text

3. Detecting Use After Free freeしたメモリが使われるのを防止する 41 free-ed memory !!! DO NOT USE !!! Overview

Slide 42

Slide 42 text

3. Detecting Use After Free (Detail) 42 function.txt Proposal

Slide 43

Slide 43 text

3. Detecting Use After Free (Detail) 43 function.txt Proposal fgets(0x12345678,0x20,stdin)

Slide 44

Slide 44 text

3. Detecting Use After Free (Detail) 44 function.txt Proposal fgets(0x12345678,0x20,stdin)

Slide 45

Slide 45 text

3. Detecting Use After Free (Detail) 45 function.txt Proposal fgets(0x12345678,0x20,stdin) 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed

Slide 46

Slide 46 text

3. Detecting Use After Free (Detail) 46 function.txt Proposal fgets(0x12345678,0x20,stdin) 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed

Slide 47

Slide 47 text

3. Detecting Use After Free (Detail) 47 function.txt fgets(0x12345678,0x20,stdin) !!! !!! Proposal 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed

Slide 48

Slide 48 text

実験 48 freeしたメモリを 再度使おうとしている

Slide 49

Slide 49 text

結果 Use After Freeが発動する前に動作を停止することができた 49

Slide 50

Slide 50 text

4. Filtering System Call システムコールのフィルタリングを作成する 50 User-mode Kernel-mode open(“data.txt”) open(“flag.txt”) open(“data.txt”) Filter Overview

Slide 51

Slide 51 text

4. Filtering System Call (Detail) 51 filter.txt Proposal

Slide 52

Slide 52 text

4. Filtering System Call (Detail) 52 filter.txt Proposal filter.txt 5 (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY)

Slide 53

Slide 53 text

4. Filtering System Call (Detail) 53 filter.txt Proposal filter.txt 5 (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY) EAX EBX ECX EDX ...

Slide 54

Slide 54 text

4. Filtering System Call (Detail) 54 filter.txt EAX EBX ECX EDX ... 5 (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY) Proposal

Slide 55

Slide 55 text

実験 55 フィルタルールに設定した flag.txtを開こうとしている

Slide 56

Slide 56 text

結果 flag.txtがオープンされる前に終了することができた 56

Slide 57

Slide 57 text

5. Collection of Function Argument 関数で使われたバッファなどの中身を収集する 57 123456 iloveyou football 1234567 letmein 123456789 12345 qwerty 122345678 password 2017年のパスワードTop 10 https://news.mynavi.jp/article/20171220-559970/ Overview

Slide 58

Slide 58 text

5. Collection of Function Argument (Detail) 58 function_list.txt Proposal

Slide 59

Slide 59 text

5. Collection of Function Argument (Detail) 59 function_list.txt Proposal “fgets,1” “gets,1”

Slide 60

Slide 60 text

5. Collection of Function Argument (Detail) 60 function_list.txt Proposal “fgets,1” “gets,1” fgets(buf,sizeof(buf),stdin)

Slide 61

Slide 61 text

5. Collection of Function Argument (Detail) 61 function_list.txt Proposal “fgets,1” “gets,1” fgets(buf,sizeof(buf),stdin) “I’ll be back” “SecHack365 Returns”

Slide 62

Slide 62 text

5. Collection of Function Argument (Detail) 62 function_list.txt Proposal “fgets,1” “gets,1” fgets(buf,sizeof(buf),stdin) “I’ll be back” “SecHack365 Returns” honeypot.log

Slide 63

Slide 63 text

5. Collection of Function Argument (Detail) 63 function_list.txt honeypot.log fgets(buf,sizeof(buf),stdin) “I’ll be back” “I’ll be back” “SecHack365 Returns” “fgets,1” “gets,1” “SecHack365 Returns” Proposal

Slide 64

Slide 64 text

実験 64 今回はこのfgets関数の 入力されたデータを ハニポログとして収集する

Slide 65

Slide 65 text

結果 入力した内容を時刻付きでログに収めることができた 65

Slide 66

Slide 66 text

66 Buffer Overflow Format String RELRO Double Free Mitigation Detection System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function

Slide 67

Slide 67 text

67 Buffer Overflow Format String RELRO Double Free Mitigation Detection System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function

Slide 68

Slide 68 text

6. Restricting the Format String 書式文字列の中から%n指定子を探し出して置き換える 68 %c%s%d%u%o%x%f%e %g%ld%lu%n%lo%lx%lf %c%s%d%u%o%x%f%e %g%ld%luxx%lo%lx%lf Overwrite! Overview

Slide 69

Slide 69 text

書式文字列と引数の関係(x86の場合) 69 printf(“%d%s%x”,int,str,hex) Problem

Slide 70

Slide 70 text

書式文字列と引数の関係(x86の場合) 70 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック Problem

Slide 71

Slide 71 text

書式文字列と引数の関係(x86の場合) 71 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 Problem

Slide 72

Slide 72 text

書式文字列と引数の関係(x86の場合) 72 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 Problem

Slide 73

Slide 73 text

書式文字列と引数の関係(x86の場合) 73 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 Problem

Slide 74

Slide 74 text

書式文字列と引数の関係(x86の場合) 74 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”) Problem

Slide 75

Slide 75 text

書式文字列と引数の関係(x86の場合) 75 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”) “%n%n%n” スタック ??? ??? ??? Problem

Slide 76

Slide 76 text

書式文字列と引数の関係(x86の場合) 76 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”) “%n%n%n” スタック ??? ??? ??? 参照 Problem

Slide 77

Slide 77 text

書式文字列と引数の関係(x86の場合) 77 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”) “%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 Problem

Slide 78

Slide 78 text

書式文字列と引数の関係(x86の場合) 78 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”) “%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 データ上書き Problem

Slide 79

Slide 79 text

書式文字列と引数の関係(x86の場合) 79 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”) “%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 データ上書き %n指定子を使われると データ上書きをされてしまう Problem

Slide 80

Slide 80 text

6. Restricting the Format String (Detail) 80 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular Expression Proposal

Slide 81

Slide 81 text

6. Restricting the Format String (Detail) 81 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular Expression “%3$n” “%n” Proposal

Slide 82

Slide 82 text

6. Restricting the Format String (Detail) 82 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular Expression “%3$n” “%n” ‘x’ Proposal

Slide 83

Slide 83 text

6. Restricting the Format String (Detail) 83 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular Expression “%3$n” “%n” ‘x’ “xxxx” “xx” Proposal

Slide 84

Slide 84 text

実験 84 危険な書式指定子 (%nや%3$n)の使用 →攻撃に使われる

Slide 85

Slide 85 text

結果 危険な書式指定子を置き換えることができた (引数も対応している) 85 %x %n %x 1 2 3 %x xx %x 1 3 3

Slide 86

Slide 86 text

7. Protecting the Return Address リターンアドレスを保護し、書き換えられると元の値に戻す 86 Argument Return Address Buffer Overview

Slide 87

Slide 87 text

バッファオーバーフローとは? 87 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック 引数 [リターンアドレス] Problem

Slide 88

Slide 88 text

バッファオーバーフローとは? 88 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック 引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ スタック Problem

Slide 89

Slide 89 text

バッファオーバーフローとは? 89 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック 引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ この部分が 上書きされる スタック Problem

Slide 90

Slide 90 text

バッファオーバーフローとは? 90 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック 引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ この部分が 上書きされる スタック リターンアドレスが書き換わると プログラムの流れも変わる Problem

Slide 91

Slide 91 text

7. Protecting the Return Address (Detail) 91 Argument EBP Return Address Buffer Before Call Func Proposal

Slide 92

Slide 92 text

7. Protecting the Return Address (Detail) 92 Argument EBP Return Address Buffer EBP Return Address Before Call Func Proposal Saved Area

Slide 93

Slide 93 text

7. Protecting the Return Address (Detail) 93 Argument EBP Return Address Buffer EBP Return Address Before Call Func (Overwrite) (Overwrite) (Overwrite) Buffer After Call Func Proposal Saved Area

Slide 94

Slide 94 text

7. Protecting the Return Address (Detail) 94 Argument EBP Return Address Buffer EBP Return Address Before Call Func (Overwrite) (Overwrite) (Overwrite) Buffer After Call Func Proposal Saved Area

Slide 95

Slide 95 text

7. Protecting the Return Address (Detail) 95 Argument EBP Return Address Buffer EBP Return Address Before Call Func (Overwrite) Buffer After Call Func EBP Return Address Proposal Saved Area

Slide 96

Slide 96 text

実験 96 バッファの大きさを超えて 入力することができる (≒Return Addressを 上書きできる)

Slide 97

Slide 97 text

結果 上書きされたリターンアドレスを元に戻すことができた 97

Slide 98

Slide 98 text

8. Detection of Double Free 同じアドレスが2回freeされる(=Double Free)のを防ぐ 98 free(address) × 2 = Overview

Slide 99

Slide 99 text

2度freeすると困ること 99 Problem ヒープ 必要に応じて 割り当てるメモリ

Slide 100

Slide 100 text

2度freeすると困ること 100 ヒープ チャンク1 チャンク2 Problem

Slide 101

Slide 101 text

2度freeすると困ること 101 ヒープ チャンク1 チャンク2 free リスト チャンク1 チャンク2 Problem

Slide 102

Slide 102 text

2度freeすると困ること 102 ヒープ プログラムA プログラムB チャンク1 チャンク2 free リスト チャンク1 チャンク2 Problem

Slide 103

Slide 103 text

2度freeすると困ること 103 ヒープ プログラムA プログラムB チャンク1 free リスト チャンク1 チャンク2 チャンク1 チャンク2 freeリストの 最初が割当て Problem

Slide 104

Slide 104 text

2度freeすると困ること 104 プログラムA プログラムB free リスト malloc チャンク1 チャンク2 malloc-ed ヒープ チャンク1 チャンク2 Problem

Slide 105

Slide 105 text

2度freeすると困ること 105 プログラムA プログラムB free リスト チャンク2 ヒープ チャンク1 チャンク2 Problem

Slide 106

Slide 106 text

2度freeすると困ること 106 プログラムA プログラムB free リスト malloc チャンク2 malloc-ed ヒープ チャンク1 チャンク2 Problem

Slide 107

Slide 107 text

2度freeすると困ること 107 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 Problem

Slide 108

Slide 108 text

2度freeすると困ること 108 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 free Problem

Slide 109

Slide 109 text

2度freeすると困ること 109 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 free Problem

Slide 110

Slide 110 text

2度freeすると困ること 110 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1 free-ed Problem

Slide 111

Slide 111 text

2度freeすると困ること 111 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1 free Problem

Slide 112

Slide 112 text

2度freeすると困ること 112 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1 free Problem

Slide 113

Slide 113 text

2度freeすると困ること 113 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2 チャンク1 free-ed Problem

Slide 114

Slide 114 text

2度freeすると困ること 114 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2 チャンク1 Double Free Problem

Slide 115

Slide 115 text

2度freeすると困ること 115 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 Double Free チャンク2 チャンク2 チャンク1 free-ed Problem

Slide 116

Slide 116 text

2度freeすると困ること 116 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2 チャンク2 チャンク1 同じチャンクが 連続している Problem

Slide 117

Slide 117 text

2度freeすると困ること 117 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2 チャンク2 チャンク1 malloc malloc-ed Problem

Slide 118

Slide 118 text

2度freeすると困ること 118 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2 チャンク1 Problem

Slide 119

Slide 119 text

2度freeすると困ること 119 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2 チャンク1 malloc-ed malloc Problem

Slide 120

Slide 120 text

2度freeすると困ること 120 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1 Problem

Slide 121

Slide 121 text

2度freeすると困ること 121 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1 2つのプログラムが 同じチャンクを共有 Problem

Slide 122

Slide 122 text

2度freeすると困ること 122 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1 2つのプログラムが 同じチャンクを共有 同じチャンク(アドレス)が 2回freeされるとまずい Problem

Slide 123

Slide 123 text

8. Detection of Double Free (Detail) 123 0xdeadbeef 0xcafebabe 0xdefec8ed 0xbaadf00d 0xbeadface malloc-ed 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed malloc() free() Proposal

Slide 124

Slide 124 text

8. Detection of Double Free (Detail) 124 0xdeadbeef 0xcafebabe 0xdefec8ed 0xbaadf00d 0xbeadface malloc-ed 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed malloc() free() free(0x12345678) Proposal

Slide 125

Slide 125 text

8. Detection of Double Free (Detail) 125 0xdeadbeef 0xcafebabe 0xdefec8ed 0xbaadf00d 0xbeadface malloc-ed 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed malloc() free() free(0x12345678) Proposal

Slide 126

Slide 126 text

8. Detection of Double Free (Detail) 126 0xdeadbeef 0xcafebabe 0xdefec8ed 0xbaadf00d 0xbeadface malloc-ed 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed malloc() free() free(0x12345678) !!! Proposal

Slide 127

Slide 127 text

8. Detection of Double Free (Detail) 127 0xdeadbeef 0xcafebabe 0xdefec8ed 0xbaadf00d 0xbeadface malloc-ed 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed malloc() free() free(0x12345678) !!! free(0x0) Proposal

Slide 128

Slide 128 text

実験 128 同じアドレスを 2回freeしようとしている (Double Free)

Slide 129

Slide 129 text

結果 129 glibcのDouble Free検知機能を使うこと無く終了した

Slide 130

Slide 130 text

9. Protecting the Global Offset Table GOTの不正な書き換えを検知して元の値に戻す 130 PLT Library Evil Code GOT Overview

Slide 131

Slide 131 text

Global Offset Tableの仕組みと書換え 131 Problem プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) PLT GOT

Slide 132

Slide 132 text

Global Offset Tableの仕組みと書換え 132 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 初回呼び出し

Slide 133

Slide 133 text

Global Offset Tableの仕組みと書換え 133 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 初回呼び出し

Slide 134

Slide 134 text

Global Offset Tableの仕組みと書換え 134 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 初回呼び出し

Slide 135

Slide 135 text

Global Offset Tableの仕組みと書換え 135 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 初回呼び出し

Slide 136

Slide 136 text

Global Offset Tableの仕組みと書換え 136 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 初回呼び出し

Slide 137

Slide 137 text

Global Offset Tableの仕組みと書換え 137 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 2回目以降

Slide 138

Slide 138 text

Global Offset Tableの仕組みと書換え 138 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 2回目以降

Slide 139

Slide 139 text

Global Offset Tableの仕組みと書換え 139 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 悪意あるコード 攻撃時

Slide 140

Slide 140 text

Global Offset Tableの仕組みと書換え 140 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 悪意あるコード 攻撃 攻撃時

Slide 141

Slide 141 text

Global Offset Tableの仕組みと書換え 141 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 悪意あるコード 攻撃 攻撃時

Slide 142

Slide 142 text

Global Offset Tableの仕組みと書換え 142 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 悪意あるコード 攻撃時

Slide 143

Slide 143 text

Global Offset Tableの仕組みと書換え 143 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 悪意あるコード 攻撃時

Slide 144

Slide 144 text

Global Offset Tableの仕組みと書換え 144 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 悪意あるコード 攻撃時

Slide 145

Slide 145 text

Global Offset Tableの仕組みと書換え 145 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) 悪意あるコード GOTが書き換えられると コントロールが奪われてしまう 攻撃時

Slide 146

Slide 146 text

9. Protecting the Global Offset Table (Detail) 146 GOT of func1 Saved GOT status GOT of func2 GOT of func3 GOT of func1 GOT of func2 GOT of func3 GOT in Memory Proposal

Slide 147

Slide 147 text

9. Protecting the Global Offset Table (Detail) 147 GOT of func1 Not Called Saved GOT status GOT of func2 GOT of func3 Overwrite GOT of func2 GOT of func3 GOT in Memory Proposal

Slide 148

Slide 148 text

9. Protecting the Global Offset Table (Detail) 148 GOT of func1 Not Called Saved GOT status GOT of func2 GOT of func3 Overwrite GOT of func2 GOT of func3 GOT in Memory Proposal

Slide 149

Slide 149 text

9. Protecting the Global Offset Table (Detail) 149 GOT of func1 Not Called Saved GOT status GOT of func2 GOT of func3 GOT of func1 GOT of func2 GOT of func3 GOT in Memory Proposal

Slide 150

Slide 150 text

9. Protecting the Global Offset Table (Detail) 150 GOT of func1 Not Called Saved GOT status GOT of func2 Calling... GOT of func3 GOT of func1 Overwrite GOT of func3 GOT in Memory Proposal

Slide 151

Slide 151 text

9. Protecting the Global Offset Table (Detail) 151 GOT of func1 Not Called Saved GOT status GOT of func2 Calling... GOT of func3 GOT of func1 Overwrite GOT of func3 GOT in Memory Proposal

Slide 152

Slide 152 text

9. Protecting the Global Offset Table (Detail) 152 GOT of func1 Not Called Saved GOT status GOT of func2 Calling... GOT of func3 GOT of func1 Overwrited GOT of func3 GOT in Memory Proposal

Slide 153

Slide 153 text

9. Protecting the Global Offset Table (Detail) 153 GOT of func1 Not Called Saved GOT status GOT of func2 Calling... GOT of func3 Called GOT of func1 Overwrited Overwrite GOT in Memory Proposal

Slide 154

Slide 154 text

9. Protecting the Global Offset Table (Detail) 154 GOT of func1 Not Called Saved GOT status GOT of func2 Calling... GOT of func3 Called GOT of func1 Overwrited Overwrite GOT in Memory Proposal

Slide 155

Slide 155 text

9. Protecting the Global Offset Table (Detail) 155 GOT of func1 Not Called Saved GOT status GOT of func2 Calling... GOT of func3 Called GOT of func1 Overwrited GOT of func3 GOT in Memory Proposal

Slide 156

Slide 156 text

実験 156 既存のputs関数のGOTを 書き換えようとしている (GOT Overwrite)

Slide 157

Slide 157 text

結果 GOT Overwriteを検知して元のアドレスに戻すことができた 157

Slide 158

Slide 158 text

158 Demo

Slide 159

Slide 159 text

159 Buffer Overflow Format String RELRO Double Free Mitigation Detection System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function

Slide 160

Slide 160 text

デモのルールは… _人人人人人人人人人人人人人_ > core dumpedが無ければ勝ち <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ 160

Slide 161

Slide 161 text

161 Epilogue (後少しです)

Slide 162

Slide 162 text

残された課題 1. [Dangerous] 関数の検出の際、RELROが適用済みのものには対応できない 2. [FSA]書式文字列がRead Onlyな場所に位置すると書き換えできない 3. [Buffer]関数起点のStack-BOFしか防げない 4. [Heap]callocやreallocには対応していない 5. [NX] ヒープ領域に実行可能領域を作られても正常に動作できない 6. [SystemCall]機能や使い方がまだ貧弱、単純なルールでしか動作しない 7. [UAF]関数起点のUAFしか防げない 8. [Honeypot]RELROに対応しなければあまり意味が無い (実際のサービスに使えない) 162

Slide 163

Slide 163 text

残された課題 1. [Dangerous] 関数の検出の際、RELROが適用済みのものには対応できない 2. [FSA]書式文字列がRead Onlyな場所に位置すると書き換えできない 3. [Buffer]関数起点のStack-BOFしか防げない 4. [Heap]callocやreallocには対応していない 5. [NX] ヒープ領域に実行可能領域を作られても正常に動作できない 6. [SystemCall]機能や使い方がまだ貧弱、単純なルールでしか動作しない 7. [UAF]関数起点のUAFしか防げない 8. [Honeypot]RELROに対応しなければあまり意味が無い (実際のサービスに使えない) 163 実用段階に向けて改良していく

Slide 164

Slide 164 text

今後の目標 ・RELRO適用済みのバイナリに対応したものを作る →実際のサービスに関数ハニーポットを適用できる 164 ・ヒープ領域のさらなる堅牢化を行う →割り当てたメモリサイズやフリーリストの状況などから防御する ・TCGを改造してcall命令が実行された際にフックできるようにする →リターンアドレス書き換えに対する防御が  関数起点じゃなくてもよくなる

Slide 165

Slide 165 text

作りたいものが増えた ・今回の開発で作った機能を ptraceシステムコールを使って一から再現するものを作りたい 165 ・ネットワークに興味が出てきたので OpenGLか何かでネットワークの可視化をするものを作りたい ・などなど、開発の意欲が湧いてきていて モチベーションが高めなのでとても嬉しい (一時期これからどうしようか本当に悩んだ)

Slide 166

Slide 166 text

感想 ・やる気を出すために「小さなこと」から少しずつやるのを心がけた →「やる気は存在しない」ということを意識した 166 ・細かいタスク(開発に関係のないこと)は先に済ませておくか 紙にメモして脳から追い出してやる →気が散りやすかったのが、集中しやすくなった ・寝る時間を管理して良質な睡眠を心がけた →しっかり寝るのは翌日の開発に繋がる。寝るのって大切!

Slide 167

Slide 167 text

167 Summary

Slide 168

Slide 168 text

SeQEMU Secure QEMU

Slide 169

Slide 169 text

169 Buffer Overflow Format String RELRO Double Free Mitigation Detection System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function

Slide 170

Slide 170 text

課題や展望のまとめ 170 ①緩和に主眼を置いた  セキュリティ機構を作成した ②ハニーポットなど  別の用途の可能性を見出した ③SecHack365に参加することで  開発のモチベーションが出てきた

Slide 171

Slide 171 text

Thank you for your attention! SeQEMU Logo Illustration by Kanna Mizuguchi https://github.com/happynote3966/SeQEMU @happynote3966