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
720
CWEから学ぶ脆弱性
happynote3966
3
1k
Other Decks in Technology
See All in Technology
新卒1年目が挑む!生成AI × マルチエージェントで実現する次世代オンボーディング / operation-ai-onboarding
cyberagentdevelopers
PRO
1
180
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
290k
話題のGraphRAG、その可能性と課題を理解する
hide212131
4
1.6k
Autify Company Deck
autifyhq
1
39k
Observability を実現するためにアセットを活用しよう(AWS 秋の Observability 祭り ~明日使えるアセット祭り~ )
tsujiba
0
100
IDOLY PRIDEのバックエンドリーダーになって2年半取り組んできたこと / idoly-pride-knowledge
cyberagentdevelopers
PRO
2
100
チームを主語にしてみる / Making "Team" the Subject
ar_tama
4
330
10分でわかるfreee エンジニア向け会社説明資料
freee
18
520k
軽量DDDはもういらない! スタイルガイド本で OOPの実装パターンを学ぼう
panda_program
7
480
20241031_AWS_生成AIハッカソン_GenMuck
tsumita
0
110
使えそうで使われないCloudHSM
maikamibayashi
1
240
[JAWS-UG金沢支部×コンテナ支部合同企画]コンテナとは何か
furuton
3
320
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
167
14k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
43
6.6k
Designing the Hi-DPI Web
ddemaree
280
34k
A better future with KSS
kneath
238
17k
A Philosophy of Restraint
colly
203
16k
Designing for Performance
lara
604
68k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
328
21k
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
Fireside Chat
paigeccino
32
3k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Visualization
eitanlees
145
15k
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