QEMUを用いた自動バイナリ防御機構の開発_公開版.pdf

 QEMUを用いた自動バイナリ防御機構の開発_公開版.pdf

Aa692d43ce51c6dde4cb1f2956c6c151?s=128

happynote3966

March 08, 2019
Tweet

Transcript

  1. 4.

    4 Buffer Overflow Format String RELRO Double Free Mitigation Detection

    System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
  2. 23.

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

    (...) call printf (jmp to .plt) (...) HOOOOOOK!
  3. 24.

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

    (...) call printf (jmp to .plt) (...) in Context Register ESP EBP EIP EAX Memory Stack Heap
  4. 26.

    26 Buffer Overflow Format String RELRO Double Free Mitigation Detection

    System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
  5. 27.

    27 Buffer Overflow Format String RELRO Double Free Mitigation Detection

    System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
  6. 45.

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

    0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed
  7. 46.

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

    0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed
  8. 47.

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

    !!! Proposal 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed
  9. 52.

    4. Filtering System Call (Detail) 52 filter.txt Proposal filter.txt 5

    (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY)
  10. 53.

    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 ...
  11. 54.

    4. Filtering System Call (Detail) 54 filter.txt EAX EBX ECX

    EDX ... 5 (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY) Proposal
  12. 57.

    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
  13. 61.

    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”
  14. 62.

    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
  15. 63.

    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
  16. 66.

    66 Buffer Overflow Format String RELRO Double Free Mitigation Detection

    System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
  17. 67.

    67 Buffer Overflow Format String RELRO Double Free Mitigation Detection

    System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
  18. 77.

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

    “%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 Problem
  19. 78.

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

    “%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 データ上書き Problem
  20. 79.

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

    “%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 データ上書き %n指定子を使われると データ上書きをされてしまう Problem
  21. 88.

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

    引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ スタック Problem
  22. 89.

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

    引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ この部分が 上書きされる スタック Problem
  23. 90.

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

    引数 [リターンアドレス] 入力後 バッファ (入力データの場所) Variable 引数 Return Address 入力 データ この部分が 上書きされる スタック リターンアドレスが書き換わると プログラムの流れも変わる Problem
  24. 91.

    7. Protecting the Return Address (Detail) 91 Argument EBP Return

    Address Buffer Before Call Func Proposal
  25. 92.

    7. Protecting the Return Address (Detail) 92 Argument EBP Return

    Address Buffer EBP Return Address Before Call Func Proposal Saved Area
  26. 93.

    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
  27. 94.

    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
  28. 95.

    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
  29. 122.

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

    2つのプログラムが 同じチャンクを共有 同じチャンク(アドレス)が 2回freeされるとまずい Problem
  30. 123.

    8. Detection of Double Free (Detail) 123 0xdeadbeef 0xcafebabe 0xdefec8ed

    0xbaadf00d 0xbeadface malloc-ed 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed malloc() free() Proposal
  31. 124.

    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
  32. 125.

    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
  33. 126.

    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
  34. 127.

    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
  35. 145.

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

    (printf関数の本体) 悪意あるコード GOTが書き換えられると コントロールが奪われてしまう 攻撃時
  36. 146.

    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
  37. 147.

    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
  38. 148.

    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
  39. 149.

    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
  40. 150.

    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
  41. 151.

    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
  42. 152.

    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
  43. 153.

    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
  44. 154.

    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
  45. 155.

    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
  46. 158.
  47. 159.

    159 Buffer Overflow Format String RELRO Double Free Mitigation Detection

    System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
  48. 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に対応しなければあまり意味が無い (実際のサービスに使えない) 162
  49. 163.

    残された課題 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 実用段階に向けて改良していく
  50. 169.

    169 Buffer Overflow Format String RELRO Double Free Mitigation Detection

    System Call Use After Free No Execute Dangerous Function Collection Function Argument 9 Function
  51. 171.

    Thank you for your attention! SeQEMU Logo Illustration by Kanna

    Mizuguchi https://github.com/happynote3966/SeQEMU @happynote3966