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

アンチウイルスをオラクルとした Windows Defenderに対する 新しい攻撃手法

icchy
October 29, 2019

アンチウイルスをオラクルとした Windows Defenderに対する 新しい攻撃手法

Japanese version of https://speakerdeck.com/icchy/lets-make-windows-defender-angry-antivirus-can-be-an-oracle

CODE BLUE 2019 U25トラック "Let's Make Windows Defender Angry:
Antivirus can be an oracle!" の日本語版です

icchy

October 29, 2019
Tweet

More Decks by icchy

Other Decks in Research

Transcript

  1. 自己紹介 • icchy (a.k.a. t0nk42) • CTF ◦ TokyoWesterns リーダー

    ◦ Web, Forensics • CTF 運営 ◦ TokyoWesterns CTF ▪ 問題作成 , インフラ管理 ◦ CODE BLUE CTF ▪ Bull's Eye システム開発
  2. サイドチャネル攻撃の基本 • 通常の攻撃 ◦ リモートコード実行 ◦ パストラバーサル • サイドチャネル攻撃 ◦

    あらゆる場所から重要データをサイドエフェクトからリークする ◦ スペクトル : キャッシュヒットの時間差 ◦ クロスサイトサーチ : JavaScript の保護されていない属性 ( 例 : iframe.length) ◦ パディングオラクル : パディングエラーから平文を推測 • サイドエフェクトから情報を復元 (i.e. オラクル )
  3. サイドチャネル攻撃の標的 • CPU ◦ Spectre • Content auditor ◦ XSS

    auditor • 暗号 ◦ パディングオラクル ( 例 : POODLE) • ハードウェア ◦ 電力解析
  4. Content auditors • Content auditor はユーザを守る ◦ XSS Auditor ◦

    WAF ( ウェブアプリケーションファイアウォール ) ◦ アンチウイルス • Content auditor は検査するデータの中身を知っている • Content auditors は評価器を持っていることがある
  5. Content auditorに対するサイドチャネル攻撃 • XS-Search ◦ Chrome の XSS Auditor の誤検知

    ( 偽陽性 ) を引き起こす • 反射型 XSS が検知、ブロックされる ◦ http://target/?<script>var secret = '1234';</script> ◦ secret をリークするために加工した URL にアクセス ▪ <script>var secret = '1232';</script> ▪ <script>var secret = '1233';</script> ▪ <script>var secret = '1234';</script> ←ブロックされる • この種の攻撃を Auditor Based Oracle と呼ぶ • アンチウイルスソフトはどうか
  6. アンチウイルス • 我々が普段最も使うソフトウェアの一つ ◦ Avast ◦ ESET ◦ Kaspersky Security

    ◦ McAfee ◦ Norton Security ◦ Symantec Endpoint Protection ◦ Trendmicro Virus Buster Cloud ◦ Windows Defender ◦ … • ユーザを悪意のある試行から守る ◦ ファイル ◦ ネットワーク ◦ etc.
  7. アンチウイルスの悪用 • もし攻撃者がデータを部分的にコントロールできたら ◦ 例えばユーザ入力と秘密のデータを一緒に保存する場合 ◦ 攻撃者が誤検知 ( 偽陽性 )

    を引き起こせる • [secret] + [user input] => 検知されたか? ◦ 攻撃者は入力を変化させていくことによって秘密データをリークできるかもしれない • アンチウイルスはオラクルになりうる ◦ 様々な種類のデータに対する解析器がある
  8. アンチウイルスの悪用 • アンチウイルスはブラックボックス ◦ いつ動くか ◦ 何をするのか ◦ どうやってマルウェアを検知するのか ◦

    アーキテクチャはどうなっているのか ◦ 必要なファイルは何か? ◦ etc. • Windows Defender を調査 ◦ 最も有名 ◦ 普通の Windows でデフォルトで動いている
  9. Windows Defenderのブラックボックス解析 • 検査プロセスを走らせる対象 ◦ ファイルアクセス ◦ コマンド実行 ◦ 悪意のあるコンテンツが検知された場合

    ▪ ユーザからのアクセスをブロックし、通知する • 解析対象 ◦ エンコード ▪ Base64 ◦ アーカイブ , 圧縮 ▪ ZIP, GZip, … ◦ 実行可能ファイル ▪ PE, WSH (VBS, JScript), … • ブラックボックス解析は非常に面倒
  10. Windows Defenderの解析は手間がかかる • Windows Defender の予期しない挙動 ◦ タイミング問題 ◦ 悪意あるコンテンツの無効化

    ( 削除 ) • ペイロードを何度も再生成する必要がある • デバッグのための情報がない ◦ 検知理由を知るのが難しい • 何か便利なツールはないか? ◦ いくつかのツールが既にある
  11. LinuxでWindows Defenderが動く • github.com/taviso/loadlibrary ◦ mpengine.dll をエミュレート ◦ 試行錯誤が可能になる ◦

    デバッグ出力も見える ~$ ./mpclient ../files/eicar main(): Scanning ../files/eicar... EngineScanCallback(): Scanning input EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified. ~$ ./mpclient ../files/eicar.b64 main(): Scanning ../files/eicar.b64... EngineScanCallback(): Scanning input EngineScanCallback(): Scanning input->(Base64) EngineScanCallback(): Threat Virus:DOS/EICAR_Test_File identified.
  12. Tips: taviso/loadlibrary • 古いバージョンの PDB シンボルファイル ◦ github.com/0xAlexei/WindowsDefenderTools を参照 ◦

    MD5=e95d3f9e90ba3ccd1a4b8d63cbd88d1b => 1.271.81.0 ◦ 古い mpam-fe.exe をダウンロード、 cabextract で展開 ▪ mpengine.dll がコアのエンジン • デバッグ機能 ◦ DEBUG フラグで API コールがトレース可能
  13. Windows Defender internals • Windows Defender シグネチャフォーマット : *.vdm ◦

    mpasbase.vdm ◦ 何らかの方法で暗号化されている • WDExtract を使うと便利 ◦ github.com/hfiref0x/WDExtract • 復号されたシグネチャを見てみる
  14. Windows Defenderのホワイトボックス (?) 解析 • Windows Defender は JScript の解析器を内包している

    ◦ DOM API も利用可能 • パースするだけでなくエミュレートする • JScript が eval(str) を呼んだ場合、strも検査対象になる ◦ eval("EICAR") => 検知される • これらを組み合わせると何が起こるか?
  15. デモアプリケーションへの攻撃 • PoC のために用意したアプリケーション ◦ GET /?c1=controllable1&c2=controllable2 ▪ 単純な形式でデータを保存 ▪

    ユーザはSecretの中身を見られない ◦ GET /:name ▪ ファイルの存在と完全性を確認 • どうやってSecretをリークするか
  16. 攻撃コードの開発 • Windows Defender のエミュレータが使える ◦ デバッグ情報付き • JScript の

    eval 関数は引数を評価する ◦ 引数が悪意のあるデータを含んでいた場合は検知される • eval("EICA" + input) => ? ◦ 検知された場合 → input は "R" ◦ 検知されなかった場合 → input は "R" 以外
  17. JScriptエンジンにあるいくつかの問題点 • if 文は絶対に評価されない ◦ if (true) {eval("EICA" + "R")}

    → 検知されない ◦ object アクセス が役に立つ : {0: "a", 1: "b", ...}[input] • パーサがヌル文字で止まる ◦ eval("EICA" + "R[NULL]") → syntax error ◦ どうやってヌル文字を扱うか
  18. mpengine.dllの他の機能 • HTML ドキュメントを解析可能 ◦ いくつかの html タグがトリガーとなる ( 例

    : <script>) ◦ パーサはヌル文字で止まらない • JScript は要素にアクセス可能 ◦ <body> タグがある場合 ◦ <script>document.body.innerHTML[0]</script><body>[secret]</body> • オラクルに必要な要素が揃った
  19. 攻撃コードの開発 • JavaScript を用いる ◦ $idx と $c をイテレートする •

    $c の値が適切であれば Windows Defender が発火する • それぞれの $idx に対して 256 回ずつ試行が必要 var body = document.body.innerHTML; var eicar = "EICA"; var n = body[$idx].charCodeAt(0); eicar = eicar + String.fromCharCode(n^$c); eval(eicar);
  20. 攻撃コードの開発 • 高速化する ◦ Math.min が使えるので二分探索が可能 • $c < [input]:

    検知される • $c > [input]: 検知されない ◦ これで二分探索する var body = document.body.innerHTML; var eicar = "EICA"; var n = body[$idx].charCodeAt(0); eicar = eicar + {$c: 'k'}[Math.min($c, n)]; eval(eicar);
  21. 攻撃コードの開発 • 今までの要素を組み合わせる ◦ Controllable1: <script>...</script><body> ◦ Secret: [secret] ◦

    Controllable2: </body> • オラクルを得るには : / に送信したあとに /:name にアクセスする ◦ 検知された場合 → Internal Server Error ◦ 検知されなかった場合 → 通常のレスポンスが見える ...<script>[script]</script><body>...[secret]...</body>...
  22. 利点と欠点 • 利点 ◦ この手法をブラインドで使える ◦ 攻撃対象の構造を知る必要はなく、単にペイロードを散りばめれば良い • 欠点 ◦

    2 箇所にペイロードを置く必要がある ◦ ペイロードに挟まれた部分しかリークできない • 別のタイプは無いか ◦ インプットの前後のデータをリークできれば理想的 ◦ いまのところ PoC はない
  23. 標的になりうるもの • かなり多くのアプリケーションがユーザ入力と秘密データを一緒に保存 • セッションファイル ◦ TokyoWesterns CTF 2019 phpnote

    ◦ PHP セッションに保存された HMAC の秘密鍵 ( ユーザからは見えない ) をリーク • ログファイル ◦ Apache, Nginx, IIS • データベース ◦ ファイルベースの DBMS ( 例 : SQLite3) • キャッシュファイル ◦ ブラウザ , バイトコードなど
  24. アンチウイルスをファイル編集に使う • 検知した場合アンチウイルスがファイルの中身を変更したり消したりする ◦ Windows Defender はマッチした部分をスペースで置き換える (HTML script タグの場合

    ) • 攻撃者はデータを部分的に消去できる • データがリークできなくても、何かできそう data<script>eval('EICAR');</script>data data<script> </script>data
  25. 証拠の消去 • 攻撃者はログの一部を消去できる 1. 攻撃を始める前に <script>/* を置く 2. 悪意のある行動を行う 3.

    攻撃が終わったあとに */;eval('EICAR');</script> を置く x.x.x.x - - [29/Oct/2019:00:00:00 +0000] "GET /<script>/*" x.x.x.x - - [29/Oct/2019:00:00:10 +0900] "GET /attack.php" ... [some malicious attempts] ... x.x.x.x - - [29/Oct/2019:00:00:00 +0000] "GET /*/;eval('EICAR')</script>"
  26. 証拠の消去 • 攻撃者はログの一部を消去できる 1. 攻撃を始める前に <script>/* を置く 2. 悪意のある行動を行う 3.

    攻撃が終わったあとに */;eval('EICAR');</script> を置く x.x.x.x - - [29/Oct/2019:00:00:00 +0000] "GET /<script> </script>"
  27. 他のアンチウイルスの調査 • VirusTotal が最高の友達 :) • どのアンチウイルスが JScript エミュレータをサポートしているか ◦

    eval('EICA'+'R'); // 検知されるはず ◦ eval('EICA'+'#'); // 検知されないはず • 4 つヒットした ◦ Cyren ◦ DrWeb ◦ Microsoft ◦ NANO-Antivirus • TrendMicro ◦ 誤検知 ( 偽陽性 )
  28. 他のアンチウイルスの調査 • さらに調べてみる • どのアンチウイルスが DOM API をサポートしているか ◦ eval('EICA'+innerHTML[0]);<body>R</body>

    // 検知されるはず ◦ eval('EICA'+innerHTML[0]);<body>#</body> // 検知されないはず • Microsoft のみヒット ◦ 故に AVOracle に脆弱な理由 • SUPERAntiSpyware ◦ 誤検知 ( 偽陽性 )
  29. どうやってこの攻撃を防ぐか • 私見 : 汎用的な対策は存在しない ◦ 通常の動作の範囲であって脆弱性ではないため • 検知エンジンを無効化するのもあり ◦

    実際に Chromium XSS auditor は無効化された ◦ しかし Microsoft は検知エンジンを無効化しないだろう • アプリケーション開発者が気をつけるべきこと ◦ この攻撃手法を知る ◦ コントロール可能なデータと秘密データを一緒に保存しない • … しかしこれは開発者のみの責任ではない ◦ アンチウイルスベンダーも気をつけるべき
  30. 結論 • Auditor Based Oracle は至るところにある ◦ アンチウイルスは大きな一例 ◦ インテリジェントエンジンを持っているとオラクルになりうる

    • Windows Defender は他のアンチウイルスより賢すぎる ◦ 結果として効果的なオラクルにつながる ◦ より賢いエンジンはより多くのオラクルを得る • アンチウイルスの挙動は有害になることがある ◦ データリークだけではなく DoS も • 決してユーザ入力に囲まれた部分に秘密データを保存しないこと ◦ さもなくば AVOracle の脅威にさらされる