Upgrade to Pro — share decks privately, control downloads, hide ads and more …

脆弱性を自動発見してみたい

anko
March 27, 2022
200

 脆弱性を自動発見してみたい

anko

March 27, 2022
Tweet

Transcript

  1. 自己紹介  名前 あんこ  学年 1年生  所属 CTF班など

     Twitter @Anko_9801  Github anko9801  大学に入って好きになったもの  ラーメン、イラストを描くこと  変わらず好きなもの  アニメ、Vtuber  低レイヤー、CTF(分野: Pwn, Crypto) 1
  2. 実際の脆弱性ってどんなもの?  世の中には様々な種類の脆弱性がありますが、例えば脆弱性の1つである無限ループが 起きると無駄にCPUコアのリソースを使い果たし、フリーズしたり処理を妨害させら れてしまいます。 int exp2(int limit) { int

    index = 1; while (index < limit) { index *= 2; } return index; } 脆弱性の具体例  例えば右のプログラムはlimitより 大きい2の累乗数を返すものです。  一見シンプルで”良い”プログラムに 見えますが、実はここには脆弱性 が存在します。 4
  3. 実際の脆弱性ってどんなもの?  世の中には様々な種類の脆弱性がありますが、例えば脆弱性の1つである無限ループが 起きると無駄にCPUコアのリソースを使い果たし、フリーズしたり処理を妨害させら れてしまいます。 int exp2(int limit) { int

    index = 1; while (index < limit) { index *= 2; } return index; } 無限ループの具体例 limitに2147483647を入れると無限ループする  例えば右のプログラムはlimitより 大きい2の累乗数を返すものです。  一見シンプルで”良い”プログラムに 見えますが、実はここには脆弱性 が存在します。  limitをintの最大値付近にすること でオーバーフローし、indexは最終 的に0になります。するとループは ずっと回り続け、無限ループに陥 ります。 5
  4. シンボリック実行の具体例 (a, b) = (2, 3), (3, 2), (6, 1)

    ab = 6 ab != 6 & c = 0 ab = 6 & a <= 1 & c = 3 ab = 6 & a > 1 & c = 1 int test(int a, int b) { int c = 0; if (a * b == 6) { c = 1; if (a <= 1) c = 3; } assert(a * b * c == 6); } ∅ 11 [1]
  5. 自作シンボリック実行エンジン  Intel x86_64 の命令セットをシンボリック実行します。  必要最低限の命令しか実装しません。  言語はRust。SMTソルバライブラリはz3を用いる。 

    開発期間: 丸3日  (自己/相互参照構造体に苦しめられた…)  うまく動いたときの嬉しさは半端じゃない…!!ゴゴゴゴ…(うまく動いたときの音)  リポジトリ https://github.com/anko9801/mini_symbolic 13
  6. デモ(OpenSSLの脆弱性: CVE-2022-0778)  2022年3月16日に公表されたOpenSSLの重大な脆弱性。サーバーに悪意ある証 明書を送ることで無限ループを起こさせることが出来る。 cmp r12, 1 je 19

    mov rax, r12 imul rax, r12 cdq idiv rbx mov rax, rdx cmp rdx, 1 je 12 cmp rbp, 2 je 10 mov rcx, 2 imul rax, rax cdq idiv rbx mov rax, rdx … Initialized … Symbolic Executing … Solved! rax: 193 rbx: 185 rcx: 6 rdx: 64 rdi: 2 rsi: 128 rbp: 192 r12: 181 … [2] 14
  7. シンボリック実行エンジンの壁  パス爆発 条件分岐やループに到達する度、指数的にパスが増える。 -> Symbolic Backward Execution  探索空間の指数的増大

    入力のシンボルを増やすとそれを解く時間は指数的に増加する。 -> Fuzzingとの併用で探索空間を縮める 16
  8. シンボリック実行エンジンの壁  パス爆発 条件分岐やループに到達する度、指数的にパスが増える。 -> Symbolic Backward Execution  探索空間の指数的増大

    入力のシンボルを増やすとそれを解く時間は指数的に増加する。 -> Fuzzingとの併用で探索空間を縮める  量子コンピュータを使えたらSATは高速で解ける! 17