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!" の日本語版です
アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法市川 遼(icchy)CODE BLUE 2019, 10/29
View Slide
自己紹介●icchy (a.k.a. t0nk42)●CTF○TokyoWesternsリーダー○Web, Forensics●CTF運営○TokyoWesterns CTF■ 問題作成,インフラ管理○CODE BLUE CTF■Bull's Eyeシステム開発
問題:● 以下のコードに脆弱性を指摘できますか?○ この発表を聞くと脆弱性が何かわかります
https://www.rambus.com/blogs/an-introduction-to-side-channel-attacks/サイドチャネル攻撃
サイドチャネル攻撃の基本● 通常の攻撃○ リモートコード実行○ パストラバーサル● サイドチャネル攻撃○ あらゆる場所から重要データをサイドエフェクトからリークする○ スペクトル:キャッシュヒットの時間差○ クロスサイトサーチ: JavaScriptの保護されていない属性(例: iframe.length)○ パディングオラクル:パディングエラーから平文を推測● サイドエフェクトから情報を復元(i.e.オラクル)
サイドチャネル攻撃の標的●CPU○Spectre●Content auditor○XSS auditor● 暗号○ パディングオラクル(例: POODLE)● ハードウェア○ 電力解析
Content auditors●Content auditorはユーザを守る○XSS Auditor○WAF (ウェブアプリケーションファイアウォール)○ アンチウイルス●Content auditorは検査するデータの中身を知っている●Content auditorsは評価器を持っていることがある
Content auditorに対するサイドチャネル攻撃●XS-Search○ChromeのXSS Auditorの誤検知(偽陽性)を引き起こす● 反射型XSSが検知、ブロックされる○http://target/?var secret = '1234';○secretをリークするために加工したURLにアクセス■var secret = '1232';■var secret = '1233';■var secret = '1234';←ブロックされる● この種の攻撃をAuditor Based Oracleと呼ぶ● アンチウイルスソフトはどうか
アンチウイルス● 我々が普段最も使うソフトウェアの一つ○Avast○ESET○Kaspersky Security○McAfee○Norton Security○Symantec Endpoint Protection○Trendmicro Virus Buster Cloud○Windows Defender○…● ユーザを悪意のある試行から守る○ ファイル○ ネットワーク○etc.
audit([secret] + [user input])
アンチウイルスの悪用● もし攻撃者がデータを部分的にコントロールできたら○ 例えばユーザ入力と秘密のデータを一緒に保存する場合○ 攻撃者が誤検知(偽陽性)を引き起こせる●[secret] + [user input] =>検知されたか?○ 攻撃者は入力を変化させていくことによって秘密データをリークできるかもしれない● アンチウイルスはオラクルになりうる○ 様々な種類のデータに対する解析器がある
アンチウイルスの悪用● アンチウイルスはブラックボックス○ いつ動くか○ 何をするのか○ どうやってマルウェアを検知するのか○ アーキテクチャはどうなっているのか○ 必要なファイルは何か?○etc.●Windows Defenderを調査○ 最も有名○ 普通のWindowsでデフォルトで動いている
Windows Defender● 悪意あるコンテンツとして認識されるものはなにか○Microsoftから公開されているマルウェアのリスト■ https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes○ 他のベンダーも似たようなものを持っていると考えられる○ 詳しい情報は出ていない●Windows Defenderを解析する必要
Windows Defenderのブラックボックス解析● 検査プロセスを走らせる対象○ ファイルアクセス○ コマンド実行○ 悪意のあるコンテンツが検知された場合■ ユーザからのアクセスをブロックし、通知する● 解析対象○ エンコード■Base64○ アーカイブ,圧縮■ZIP, GZip, …○ 実行可能ファイル■PE, WSH (VBS, JScript), …● ブラックボックス解析は非常に面倒
Windows Defenderをもっと効率的に解析するには
Windows Defenderの解析は手間がかかる●"MpCmdRun.exe"で解析エンジンを直接呼び出すことが可能○ いくつかの問題点がある
Windows Defenderの解析は手間がかかる●Windows Defenderの予期しない挙動○ タイミング問題○ 悪意あるコンテンツの無効化(削除)● ペイロードを何度も再生成する必要がある● デバッグのための情報がない○ 検知理由を知るのが難しい● 何か便利なツールはないか?○ いくつかのツールが既にある
LinuxでWindows Defenderが動く●github.com/taviso/loadlibrary○mpengine.dllをエミュレート○ 試行錯誤が可能になる○ デバッグ出力も見える~$ ./mpclient ../files/eicarmain(): Scanning ../files/eicar...EngineScanCallback(): Scanning inputEngineScanCallback(): ThreatVirus:DOS/EICAR_Test_File identified.~$ ./mpclient ../files/eicar.b64main(): Scanning ../files/eicar.b64...EngineScanCallback(): Scanning inputEngineScanCallback(): Scanning input->(Base64)EngineScanCallback(): ThreatVirus:DOS/EICAR_Test_File identified.
Tips: taviso/loadlibrary● 古いバージョンのPDBシンボルファイル○github.com/0xAlexei/WindowsDefenderToolsを参照○MD5=e95d3f9e90ba3ccd1a4b8d63cbd88d1b => 1.271.81.0○ 古いmpam-fe.exeをダウンロード、cabextractで展開■mpengine.dllがコアのエンジン● デバッグ機能○DEBUGフラグでAPIコールがトレース可能
Windows Defender internals●Windows Defenderシグネチャフォーマット:*.vdm○mpasbase.vdm○ 何らかの方法で暗号化されている●WDExtractを使うと便利○github.com/hfiref0x/WDExtract● 復号されたシグネチャを見てみる
Windows Defender internals●Windows DefenderはLuaを使っている
Windows Defender internalsシグネチャ名シグネチャ定義(文字列)
Windows Defender internals● 様々なファイルフォーマット用のハンドラがある
Windows Defenderのホワイトボックス (?) 解析●Windows DefenderはJScriptの解析器を内包している○DOM APIも利用可能● パースするだけでなくエミュレートする●JScriptが eval(str) を呼んだ場合、strも検査対象になる○ eval("EICAR")=>検知される● これらを組み合わせると何が起こるか?
デモアプリケーションへの攻撃●PoCのために用意したアプリケーション○ GET /?c1=controllable1&c2=controllable2■ 単純な形式でデータを保存■ ユーザはSecretの中身を見られない○ GET /:name■ ファイルの存在と完全性を確認● どうやってSecretをリークするか
攻撃コードの開発●Windows Defenderのエミュレータが使える○ デバッグ情報付き●JScriptの eval 関数は引数を評価する○ 引数が悪意のあるデータを含んでいた場合は検知される● eval("EICA" + input)=> ?○ 検知された場合 →inputは"R"○ 検知されなかった場合 →inputは"R"以外
JScriptエンジンにあるいくつかの問題点●if文は絶対に評価されない○ if (true) {eval("EICA" + "R")} → 検知されない○objectアクセス が役に立つ:{0: "a", 1: "b", ...}[input]● パーサがヌル文字で止まる○ eval("EICA" + "R[NULL]") →syntax error○ どうやってヌル文字を扱うか
mpengine.dllの他の機能●HTMLドキュメントを解析可能○ いくつかのhtmlタグがトリガーとなる(例: )<br/>○ パーサはヌル文字で止まらない<br/>●<br/>JScript<br/>は要素にアクセス可能<br/>○<br/><body><br/>タグがある場合<br/>○<br/><script>document.body.innerHTML[0][secret]● オラクルに必要な要素が揃った
攻撃コードの開発●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);
攻撃コードの開発● 高速化する○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);
攻撃コードの開発● 今までの要素を組み合わせる○Controllable1:...○Secret:[secret]○Controllable2:● オラクルを得るには:/ に送信したあとに /:name にアクセスする○ 検知された場合 →Internal Server Error○ 検知されなかった場合 → 通常のレスポンスが見える...[script]...[secret]......
デモ● デモアプリケーションに対するAVOracle攻撃
利点と欠点● 利点○ この手法をブラインドで使える○ 攻撃対象の構造を知る必要はなく、単にペイロードを散りばめれば良い● 欠点○2箇所にペイロードを置く必要がある○ ペイロードに挟まれた部分しかリークできない● 別のタイプは無いか○ インプットの前後のデータをリークできれば理想的○ いまのところPoCはない
他の標的は?
標的になりうるもの● かなり多くのアプリケーションがユーザ入力と秘密データを一緒に保存● セッションファイル○TokyoWesterns CTF 2019 phpnote○PHPセッションに保存されたHMACの秘密鍵(ユーザからは見えない)をリーク● ログファイル○Apache, Nginx, IIS● データベース○ ファイルベースのDBMS (例: SQLite3)● キャッシュファイル○ ブラウザ,バイトコードなど
アンチウイルスをファイル編集に使う● 検知した場合アンチウイルスがファイルの中身を変更したり消したりする○Windows Defenderはマッチした部分をスペースで置き換える(HTML scriptタグの場合)● 攻撃者はデータを部分的に消去できる● データがリークできなくても、何かできそうdataeval('EICAR');datadata data
証拠の消去● 攻撃者はログの一部を消去できる1.攻撃を始める前に /* を置く<br/>2.<br/>悪意のある行動を行う<br/>3.<br/>攻撃が終わったあとに */;eval('EICAR'); を置くx.x.x.x - - [29/Oct/2019:00:00:00 +0000] "GET //*"<br/>x.x.x.x - - [29/Oct/2019:00:00:10 +0900] "GET /attack.php"<br/>...<br/>[some malicious attempts]<br/>...<br/>x.x.x.x - - [29/Oct/2019:00:00:00 +0000] "GET /*/;eval('EICAR')"
証拠の消去● 攻撃者はログの一部を消去できる1.攻撃を始める前に /* を置く<br/>2.<br/>悪意のある行動を行う<br/>3.<br/>攻撃が終わったあとに */;eval('EICAR'); を置くx.x.x.x - - [29/Oct/2019:00:00:00 +0000] "GET /<br/>"
アンチウイルスをDoSに使う● 悪意あるデータを消す際に構造体の境界にまたがって消す● 構造体のメタデータは破壊される○ スペースで置き換えられる● 2つのペイロードが境界を跨がない場合○ 攻撃者は別のデータを書き換えられる
他のアンチウイルスはどうか?
他のアンチウイルスの調査●VirusTotalが最高の友達:)● どのアンチウイルスがJScriptエミュレータをサポートしているか○ eval('EICA'+'R'); // 検知されるはず○ eval('EICA'+'#'); // 検知されないはず●4つヒットした○Cyren○DrWeb○Microsoft○NANO-Antivirus●TrendMicro○ 誤検知(偽陽性)
他のアンチウイルスの調査● さらに調べてみる● どのアンチウイルスがDOM APIをサポートしているか○ eval('EICA'+innerHTML[0]);R // 検知されるはず○ eval('EICA'+innerHTML[0]);# // 検知されないはず●Microsoftのみヒット○ 故にAVOracleに脆弱な理由●SUPERAntiSpyware○ 誤検知(偽陽性)
Windows Defenderは賢すぎた
どうやってこの攻撃を防ぐか● 私見:汎用的な対策は存在しない○ 通常の動作の範囲であって脆弱性ではないため● 検知エンジンを無効化するのもあり○ 実際にChromium XSS auditorは無効化された○ しかしMicrosoftは検知エンジンを無効化しないだろう● アプリケーション開発者が気をつけるべきこと○ この攻撃手法を知る○ コントロール可能なデータと秘密データを一緒に保存しない●…しかしこれは開発者のみの責任ではない○ アンチウイルスベンダーも気をつけるべき
結論●Auditor Based Oracleは至るところにある○ アンチウイルスは大きな一例○ インテリジェントエンジンを持っているとオラクルになりうる●Windows Defenderは他のアンチウイルスより賢すぎる○ 結果として効果的なオラクルにつながる○ より賢いエンジンはより多くのオラクルを得る● アンチウイルスの挙動は有害になることがある○ データリークだけではなくDoSも● 決してユーザ入力に囲まれた部分に秘密データを保存しないこと○ さもなくばAVOracleの脅威にさらされる
Any Questions?@icchyricchy