Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
QEMUを用いた自動バイナリ防御機構の開発_公開版.pdf
Search
happynote3966
March 08, 2019
Technology
6
3.6k
QEMUを用いた自動バイナリ防御機構の開発_公開版.pdf
happynote3966
March 08, 2019
Tweet
Share
More Decks by happynote3966
See All by happynote3966
open()の実装を読んでみる
happynote3966
1
730
CWEから学ぶ脆弱性
happynote3966
3
1k
Other Decks in Technology
See All in Technology
Lexical Analysis
shigashiyama
1
150
OCI Network Firewall 概要
oracle4engineer
PRO
0
4.2k
OCI 運用監視サービス 概要
oracle4engineer
PRO
0
4.8k
Can We Measure Developer Productivity?
ewolff
1
150
組織成長を加速させるオンボーディングの取り組み
sudoakiy
2
210
飲食店データの分析事例とそれを支えるデータ基盤
kimujun
0
160
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
130
Taming you application's environments
salaboy
0
190
EventHub Startup CTO of the year 2024 ピッチ資料
eventhub
0
120
ノーコードデータ分析ツールで体験する時系列データ分析超入門
negi111111
0
420
FlutterアプリにおけるSLI/SLOを用いたユーザー体験の可視化と計測基盤構築
ostk0069
0
100
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
760
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
20
1.1k
KATA
mclloyd
29
14k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
For a Future-Friendly Web
brad_frost
175
9.4k
Building Adaptive Systems
keathley
38
2.3k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Automating Front-end Workflow
addyosmani
1366
200k
RailsConf 2023
tenderlove
29
900
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
A designer walks into a library…
pauljervisheath
204
24k
Transcript
QEMUを用いた 自動バイナリ防御機構の開発 開発駆動コース / 坂井ゼミ / 宮口誠
2 Summary
SeQEMU Secure QEMU
4 Buffer Overflow Format String RELRO Double Free Mitigation Detection
System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
5 Overview
6 提案アイディア 稼働しているサービスが攻撃を受けるのは困る Attack! Service Cracker
提案アイディア [ 攻撃を受けても動作を継続 | 被害前に停止 ] する仕組みを作る 7 Attack! Service
Cracker
提案アイディア [ 攻撃を受けても動作を継続 | 被害前に停止 ] する仕組みを作る 8 Attack! Service
Cracker キーワード:緩和 (Mitigation)
よくわからんという方へ 「いじめ」を想像してください いじめる側(攻撃者)は 相手(稼働サービス)の 反応が楽しくてやっている 9
よくわからんという方へ 「いじめ」を想像してください いじめる側(攻撃者)は 相手(稼働サービス)の 反応が楽しくてやっている →無視・無反応を貫く (=挙動から脆弱性を悟られない) 10 ※いじめに対しこのような対応を推奨するものではありません、悪しからず
11 Function Overview
12 実装概要 オープンソースのエミュレータ オリジナルの3.0.0を元に改造
QEMUの動作の仕組み 13 実行したい プログラム TCG (中間表現) 実行可能 コード
QEMUの動作の仕組み 14 実行したい プログラム TCG (中間表現) 実行可能 コード この途中で動作を変更するのは難しい (開発コストが高い)
TCGへの変換とその「隙間」 15 プログラム
TCGへの変換とその「隙間」 16 プログラム call、jmp命令など
TCGへの変換とその「隙間」 17 プログラム call、jmp命令など TCG 変換
TCGへの変換とその「隙間」 18 プログラム call、jmp命令など TCG 変換
TCGへの変換とその「隙間」 19 プログラム TCG call、jmp命令など TCG 変換 変換
TCGへの変換とその「隙間」 20 プログラム TCG call、jmp命令など TCG 変換 変換 開発コストを抑えて 実装したい機能を実現
21 緩和の仕組み .plt section printf (jmp to library) .text section
(...) call printf (jmp to .plt) (...)
緩和の仕組み 22 .plt section printf (jmp to library) .text section
(...) call printf (jmp to .plt) (...)
緩和の仕組み 23 .plt section printf (jmp to library) .text section
(...) call printf (jmp to .plt) (...) HOOOOOOK!
緩和の仕組み 24 .plt section printf (jmp to library) .text section
(...) call printf (jmp to .plt) (...) in Context Register ESP EBP EIP EAX Memory Stack Heap
25 Function Detail
26 Buffer Overflow Format String RELRO Double Free Mitigation Detection
System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
27 Buffer Overflow Format String RELRO Double Free Mitigation Detection
System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
28 1. Filtering Dangerous Function 危険な関数(getsなど)をバイナリの中から探し出す printf gets scanf Functions
!!! Overview
1. Filtering Dangerous Function (Detail) 29 ①Elf32_Rel構造体のr_infoから対応するElf32_Sym構造体へのインデックスを取得 Elf32_Rel ... Proposal
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
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
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
実験 33 gets関数の使用 (危険な関数を使っている) ※C11でなくなった関数
結果 実行しないようにできた 34
2. Implementation of Self-NX No Excute (NX bit)の機能を擬似的に再現する 35 r
w x p Overview
2. Implementation of Self-NX (Detail) 36 data code heap stack
EIP Proposal
2. Implementation of Self-NX (Detail) 37 data heap stack EIP
Proposal code
2. Implementation of Self-NX (Detail) 38 data code heap stack
EIP Proposal
実験 39 /bin/shが立ち上がる シェルコードがある (今回はそれを実行する)
結果 /bin/shが実行されることなく終了している 40
3. Detecting Use After Free freeしたメモリが使われるのを防止する 41 free-ed memory !!!
DO NOT USE !!! Overview
3. Detecting Use After Free (Detail) 42 function.txt Proposal
3. Detecting Use After Free (Detail) 43 function.txt Proposal fgets(0x12345678,0x20,stdin)
3. Detecting Use After Free (Detail) 44 function.txt Proposal fgets(0x12345678,0x20,stdin)
3. Detecting Use After Free (Detail) 45 function.txt Proposal fgets(0x12345678,0x20,stdin)
0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed
3. Detecting Use After Free (Detail) 46 function.txt Proposal fgets(0x12345678,0x20,stdin)
0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed
3. Detecting Use After Free (Detail) 47 function.txt fgets(0x12345678,0x20,stdin) !!!
!!! Proposal 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed
実験 48 freeしたメモリを 再度使おうとしている
結果 Use After Freeが発動する前に動作を停止することができた 49
4. Filtering System Call システムコールのフィルタリングを作成する 50 User-mode Kernel-mode open(“data.txt”) open(“flag.txt”)
open(“data.txt”) Filter Overview
4. Filtering System Call (Detail) 51 filter.txt Proposal
4. Filtering System Call (Detail) 52 filter.txt Proposal filter.txt 5
(open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY)
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 ...
4. Filtering System Call (Detail) 54 filter.txt EAX EBX ECX
EDX ... 5 (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY) Proposal
実験 55 フィルタルールに設定した flag.txtを開こうとしている
結果 flag.txtがオープンされる前に終了することができた 56
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
5. Collection of Function Argument (Detail) 58 function_list.txt Proposal
5. Collection of Function Argument (Detail) 59 function_list.txt Proposal “fgets,1”
“gets,1”
5. Collection of Function Argument (Detail) 60 function_list.txt Proposal “fgets,1”
“gets,1” fgets(buf,sizeof(buf),stdin)
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”
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
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
実験 64 今回はこのfgets関数の 入力されたデータを ハニポログとして収集する
結果 入力した内容を時刻付きでログに収めることができた 65
66 Buffer Overflow Format String RELRO Double Free Mitigation Detection
System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
67 Buffer Overflow Format String RELRO Double Free Mitigation Detection
System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
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
書式文字列と引数の関係(x86の場合) 69 printf(“%d%s%x”,int,str,hex) Problem
書式文字列と引数の関係(x86の場合) 70 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック Problem
書式文字列と引数の関係(x86の場合) 71 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 Problem
書式文字列と引数の関係(x86の場合) 72 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 Problem
書式文字列と引数の関係(x86の場合) 73 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 Problem
書式文字列と引数の関係(x86の場合) 74 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”)
Problem
書式文字列と引数の関係(x86の場合) 75 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”)
“%n%n%n” スタック ??? ??? ??? Problem
書式文字列と引数の関係(x86の場合) 76 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”)
“%n%n%n” スタック ??? ??? ??? 参照 Problem
書式文字列と引数の関係(x86の場合) 77 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”)
“%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 Problem
書式文字列と引数の関係(x86の場合) 78 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”)
“%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 データ上書き Problem
書式文字列と引数の関係(x86の場合) 79 printf(“%d%s%x”,int,str,hex) “%d%s%x” 数値 文字列 数値 スタック 参照 printf(“%n%n%n”)
“%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 データ上書き %n指定子を使われると データ上書きをされてしまう Problem
6. Restricting the Format String (Detail) 80 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular
Expression Proposal
6. Restricting the Format String (Detail) 81 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular
Expression “%3$n” “%n” Proposal
6. Restricting the Format String (Detail) 82 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular
Expression “%3$n” “%n” ‘x’ Proposal
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
実験 84 危険な書式指定子 (%nや%3$n)の使用 →攻撃に使われる
結果 危険な書式指定子を置き換えることができた (引数も対応している) 85 %x %n %x 1 2 3
%x xx %x 1 3 3
7. Protecting the Return Address リターンアドレスを保護し、書き換えられると元の値に戻す 86 Argument Return Address
Buffer Overview
バッファオーバーフローとは? 87 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック
引数 [リターンアドレス] Problem
バッファオーバーフローとは? 88 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック
引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ スタック Problem
バッファオーバーフローとは? 89 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック
引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ この部分が 上書きされる スタック Problem
バッファオーバーフローとは? 90 下位アドレス (数字が小さい) 上位アドレス (数字が大きい) バッファ (入力データの場所) ローカル変数など スタック
引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ この部分が 上書きされる スタック リターンアドレスが書き換わると プログラムの流れも変わる Problem
7. Protecting the Return Address (Detail) 91 Argument EBP Return
Address Buffer Before Call Func Proposal
7. Protecting the Return Address (Detail) 92 Argument EBP Return
Address Buffer EBP Return Address Before Call Func Proposal Saved Area
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
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
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
実験 96 バッファの大きさを超えて 入力することができる (≒Return Addressを 上書きできる)
結果 上書きされたリターンアドレスを元に戻すことができた 97
8. Detection of Double Free 同じアドレスが2回freeされる(=Double Free)のを防ぐ 98 free(address) ×
2 = Overview
2度freeすると困ること 99 Problem ヒープ 必要に応じて 割り当てるメモリ
2度freeすると困ること 100 ヒープ チャンク1 チャンク2 Problem
2度freeすると困ること 101 ヒープ チャンク1 チャンク2 free リスト チャンク1 チャンク2 Problem
2度freeすると困ること 102 ヒープ プログラムA プログラムB チャンク1 チャンク2 free リスト チャンク1
チャンク2 Problem
2度freeすると困ること 103 ヒープ プログラムA プログラムB チャンク1 free リスト チャンク1 チャンク2
チャンク1 チャンク2 freeリストの 最初が割当て Problem
2度freeすると困ること 104 プログラムA プログラムB free リスト malloc チャンク1 チャンク2 malloc-ed
ヒープ チャンク1 チャンク2 Problem
2度freeすると困ること 105 プログラムA プログラムB free リスト チャンク2 ヒープ チャンク1 チャンク2
Problem
2度freeすると困ること 106 プログラムA プログラムB free リスト malloc チャンク2 malloc-ed ヒープ
チャンク1 チャンク2 Problem
2度freeすると困ること 107 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 Problem
2度freeすると困ること 108 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 free
Problem
2度freeすると困ること 109 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 free
Problem
2度freeすると困ること 110 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1
free-ed Problem
2度freeすると困ること 111 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1
free Problem
2度freeすると困ること 112 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1
free Problem
2度freeすると困ること 113 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2
チャンク1 free-ed Problem
2度freeすると困ること 114 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2
チャンク1 Double Free Problem
2度freeすると困ること 115 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 Double
Free チャンク2 チャンク2 チャンク1 free-ed Problem
2度freeすると困ること 116 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2
チャンク2 チャンク1 同じチャンクが 連続している Problem
2度freeすると困ること 117 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2
チャンク2 チャンク1 malloc malloc-ed Problem
2度freeすると困ること 118 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2
チャンク1 Problem
2度freeすると困ること 119 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク2
チャンク1 malloc-ed malloc Problem
2度freeすると困ること 120 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1
Problem
2度freeすると困ること 121 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1
2つのプログラムが 同じチャンクを共有 Problem
2度freeすると困ること 122 プログラムA プログラムB free リスト ヒープ チャンク1 チャンク2 チャンク1
2つのプログラムが 同じチャンクを共有 同じチャンク(アドレス)が 2回freeされるとまずい Problem
8. Detection of Double Free (Detail) 123 0xdeadbeef 0xcafebabe 0xdefec8ed
0xbaadf00d 0xbeadface malloc-ed 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed malloc() free() Proposal
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
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
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
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
実験 128 同じアドレスを 2回freeしようとしている (Double Free)
結果 129 glibcのDouble Free検知機能を使うこと無く終了した
9. Protecting the Global Offset Table GOTの不正な書き換えを検知して元の値に戻す 130 PLT Library
Evil Code GOT Overview
Global Offset Tableの仕組みと書換え 131 Problem プログラム (printf関数呼び出し) ライブラリ (printf関数の本体) PLT
GOT
Global Offset Tableの仕組みと書換え 132 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 初回呼び出し
Global Offset Tableの仕組みと書換え 133 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 初回呼び出し
Global Offset Tableの仕組みと書換え 134 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 初回呼び出し
Global Offset Tableの仕組みと書換え 135 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 初回呼び出し
Global Offset Tableの仕組みと書換え 136 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 初回呼び出し
Global Offset Tableの仕組みと書換え 137 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 2回目以降
Global Offset Tableの仕組みと書換え 138 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 2回目以降
Global Offset Tableの仕組みと書換え 139 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 悪意あるコード 攻撃時
Global Offset Tableの仕組みと書換え 140 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 悪意あるコード 攻撃 攻撃時
Global Offset Tableの仕組みと書換え 141 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 悪意あるコード 攻撃 攻撃時
Global Offset Tableの仕組みと書換え 142 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 悪意あるコード 攻撃時
Global Offset Tableの仕組みと書換え 143 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 悪意あるコード 攻撃時
Global Offset Tableの仕組みと書換え 144 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 悪意あるコード 攻撃時
Global Offset Tableの仕組みと書換え 145 Problem PLT GOT プログラム (printf関数呼び出し) ライブラリ
(printf関数の本体) 悪意あるコード GOTが書き換えられると コントロールが奪われてしまう 攻撃時
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
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
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
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
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
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
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
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
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
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
実験 156 既存のputs関数のGOTを 書き換えようとしている (GOT Overwrite)
結果 GOT Overwriteを検知して元のアドレスに戻すことができた 157
158 Demo
159 Buffer Overflow Format String RELRO Double Free Mitigation Detection
System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
デモのルールは… _人人人人人人人人人人人人人_ > core dumpedが無ければ勝ち <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ 160
161 Epilogue (後少しです)
残された課題 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
残された課題 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 実用段階に向けて改良していく
今後の目標 ・RELRO適用済みのバイナリに対応したものを作る →実際のサービスに関数ハニーポットを適用できる 164 ・ヒープ領域のさらなる堅牢化を行う →割り当てたメモリサイズやフリーリストの状況などから防御する ・TCGを改造してcall命令が実行された際にフックできるようにする →リターンアドレス書き換えに対する防御が 関数起点じゃなくてもよくなる
作りたいものが増えた ・今回の開発で作った機能を ptraceシステムコールを使って一から再現するものを作りたい 165 ・ネットワークに興味が出てきたので OpenGLか何かでネットワークの可視化をするものを作りたい ・などなど、開発の意欲が湧いてきていて モチベーションが高めなのでとても嬉しい (一時期これからどうしようか本当に悩んだ)
感想 ・やる気を出すために「小さなこと」から少しずつやるのを心がけた →「やる気は存在しない」ということを意識した 166 ・細かいタスク(開発に関係のないこと)は先に済ませておくか 紙にメモして脳から追い出してやる →気が散りやすかったのが、集中しやすくなった ・寝る時間を管理して良質な睡眠を心がけた →しっかり寝るのは翌日の開発に繋がる。寝るのって大切!
167 Summary
SeQEMU Secure QEMU
169 Buffer Overflow Format String RELRO Double Free Mitigation Detection
System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
課題や展望のまとめ 170 ①緩和に主眼を置いた セキュリティ機構を作成した ②ハニーポットなど 別の用途の可能性を見出した ③SecHack365に参加することで 開発のモチベーションが出てきた
Thank you for your attention! SeQEMU Logo Illustration by Kanna
Mizuguchi https://github.com/happynote3966/SeQEMU @happynote3966