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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for anko anko
March 27, 2022
380

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

Avatar for anko

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