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

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

Aa692d43ce51c6dde4cb1f2956c6c151?s=128

happynote3966

March 08, 2019
Tweet

Transcript

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

  2. 2 Summary

  3. SeQEMU Secure QEMU

  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
  5. 5 Overview

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

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

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

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

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

  11. 11 Function Overview

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

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

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

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

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

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

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

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

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

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

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

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

    (...) call printf (jmp to .plt) (...) HOOOOOOK!
  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
  25. 25 Function Detail

  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
  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
  28. 28 1. Filtering Dangerous Function 危険な関数(getsなど)をバイナリの中から探し出す printf gets scanf Functions

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

  30. 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
  31. 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
  32. 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. 実験 33 gets関数の使用 (危険な関数を使っている) ※C11でなくなった関数

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

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

    w x p Overview
  36. 2. Implementation of Self-NX (Detail) 36 data code heap stack

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

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

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

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

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

    DO NOT USE !!! Overview
  42. 3. Detecting Use After Free (Detail) 42 function.txt Proposal

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

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

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

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

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

    !!! Proposal 0xabadbabe 0xbaddcafe 0x12345678 0xfacefeed 0xfee1dead free-ed
  48. 実験 48 freeしたメモリを 再度使おうとしている

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

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

    open(“data.txt”) Filter Overview
  51. 4. Filtering System Call (Detail) 51 filter.txt Proposal

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

    (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY)
  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 ...
  54. 4. Filtering System Call (Detail) 54 filter.txt EAX EBX ECX

    EDX ... 5 (open), 1, (“flag.txt”) 5 (open), 2, (O_RDONLY) Proposal
  55. 実験 55 フィルタルールに設定した flag.txtを開こうとしている

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

  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
  58. 5. Collection of Function Argument (Detail) 58 function_list.txt Proposal

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

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

    “gets,1” fgets(buf,sizeof(buf),stdin)
  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”
  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
  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
  64. 実験 64 今回はこのfgets関数の 入力されたデータを ハニポログとして収集する

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

  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
  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
  68. 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
  69. 書式文字列と引数の関係(x86の場合) 69 printf(“%d%s%x”,int,str,hex) Problem

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

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

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

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

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

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

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

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

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

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

    “%n%n%n” スタック 上書きアドレス 上書きアドレス 上書きアドレス 参照 データ上書き %n指定子を使われると データ上書きをされてしまう Problem
  80. 6. Restricting the Format String (Detail) 80 "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn] Regular

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

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

    Expression “%3$n” “%n” ‘x’ Proposal
  83. 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. 実験 84 危険な書式指定子 (%nや%3$n)の使用 →攻撃に使われる

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

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

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

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

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

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

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

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

    Address Buffer EBP Return Address Before Call Func Proposal Saved Area
  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
  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
  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
  96. 実験 96 バッファの大きさを超えて 入力することができる (≒Return Addressを 上書きできる)

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

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

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

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

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

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

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

    チャンク1 チャンク2 freeリストの 最初が割当て Problem
  104. 2度freeすると困ること 104 プログラムA プログラムB free リスト malloc チャンク1 チャンク2 malloc-ed

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2つのプログラムが 同じチャンクを共有 同じチャンク(アドレス)が 2回freeされるとまずい Problem
  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
  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
  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
  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
  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
  128. 実験 128 同じアドレスを 2回freeしようとしている (Double Free)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    (printf関数の本体) 悪意あるコード GOTが書き換えられると コントロールが奪われてしまう 攻撃時
  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
  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
  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
  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
  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
  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
  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
  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
  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
  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
  156. 実験 156 既存のputs関数のGOTを 書き換えようとしている (GOT Overwrite)

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

  158. 158 Demo

  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
  160. デモのルールは… _人人人人人人人人人人人人人_ > core dumpedが無ければ勝ち <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄ 160

  161. 161 Epilogue (後少しです)

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

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

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

  167. 167 Summary

  168. SeQEMU Secure QEMU

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

  171. Thank you for your attention! SeQEMU Logo Illustration by Kanna

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