アンチウイルスをオラクルとした
Windows Defenderに対する
新しい攻撃手法
市川 遼 (icchy)
CODE BLUE 2019, 10/29
自己紹介
● 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/?<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 と呼ぶ
● アンチウイルスソフトはどうか
アンチウイルス
● 我々が普段最も使うソフトウェアの一つ
○ 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/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.
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 タグがトリガーとなる (例: <script>)
○ パーサはヌル文字で止まらない
● JScriptは要素にアクセス可能
○ <body> タグがある場合
○ <script>document.body.innerHTML[0]</script><body>[secret]</body>
● オラクルに必要な要素が揃った
攻撃コードの開発
● 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: <script>...</script><body>
○ Secret: [secret]
○ Controllable2: </body>
● オラクルを得るには: / に送信したあとに /:name にアクセスする
○ 検知された場合 → Internal Server Error
○ 検知されなかった場合 → 通常のレスポンスが見える
...<script>[script]</script><body>...[secret]...</body>...
デモ
● デモアプリケーションに対するAVOracle攻撃
利点と欠点
● 利点
○ この手法をブラインドで使える
○ 攻撃対象の構造を知る必要はなく、単にペイロードを散りばめれば良い
● 欠点
○ 2箇所にペイロードを置く必要がある
○ ペイロードに挟まれた部分しかリークできない
● 別のタイプは無いか
○ インプットの前後のデータをリークできれば理想的
○ いまのところPoCはない
他の標的は?
標的になりうるもの
● かなり多くのアプリケーションがユーザ入力と秘密データを一緒に保存
● セッションファイル
○ TokyoWesterns CTF 2019 phpnote
○ PHPセッションに保存された HMACの秘密鍵 (ユーザからは見えない ) をリーク
● ログファイル
○ Apache, Nginx, IIS
● データベース
○ ファイルベースのDBMS (例: SQLite3)
● キャッシュファイル
○ ブラウザ, バイトコードなど
アンチウイルスをファイル編集に使う
● 検知した場合アンチウイルスがファイルの中身を変更したり消したりする
○ Windows Defenderはマッチした部分をスペースで置き換える (HTML script タグの場合)
● 攻撃者はデータを部分的に消去できる
● データがリークできなくても、何かできそう
data<script>eval('EICAR');</script>data
data<script> </script>data
証拠の消去
● 攻撃者はログの一部を消去できる
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>"
証拠の消去
1. 攻撃者はログの一部を消去できる
2. 攻撃を始める前に <script>/* を置く
3. 悪意のある行動を行う
4. 攻撃が終わったあとに */;eval('EICAR');</script> を置く
x.x.x.x - - [29/Oct/2019:00:00:00 +0000] "GET /<script>
</script>"
アンチウイルスをDoSに使う
● 悪意あるデータを消す際に構造体の境界にまたがって消す
● 構造体のメタデータは破壊される
○ スペースで置き換えられる
● 2つのペイロードが境界を跨がない場合
○ 攻撃者は別のデータを書き換えられる
他のアンチウイルスはどうか?
他のアンチウイルスの調査
● VirusTotalが最高の友達 :)
● どのアンチウイルスがJScriptエミュレータをサポートしているか
○ eval('EICA'+'R'); // 検知されるはず
○ eval('EICA'+'#'); // 検知されないはず
● 4つヒットした
○ Cyren
○ DrWeb
○ Microsoft
○ NANO-Antivirus
● TrendMicro
○ 誤検知 (偽陽性)
他のアンチウイルスの調査
● さらに調べてみる
● どのアンチウイルスがDOM APIをサポートしているか
○ eval('EICA'+innerHTML[0]);<body>R</body> // 検知されるはず
○ eval('EICA'+innerHTML[0]);<body>#</body> // 検知されないはず
● Microsoftのみヒット
○ 故にAVOracleに脆弱な理由
● SUPERAntiSpyware
○ 誤検知 (偽陽性)
Windows Defenderは賢すぎた
どうやってこの攻撃を防ぐか
● 私見: 汎用的な対策は存在しない
○ 通常の動作の範囲であって脆弱性ではないため
● 検知エンジンを無効化するのもあり
○ 実際にChromium XSS auditorは無効化された
○ しかしMicrosoftは検知エンジンを無効化しないだろう
● アプリケーション開発者が気をつけるべきこと
○ この攻撃手法を知る
○ コントロール可能なデータと秘密データを一緒に保存しない
● …しかしこれは開発者のみの責任ではない
○ アンチウイルスベンダーも気をつけるべき
結論
● Auditor Based Oracleは至るところにある
○ アンチウイルスは大きな一例
○ インテリジェントエンジンを持っているとオラクルになりうる
● Windows Defenderは他のアンチウイルスより賢すぎる
○ 結果として効果的なオラクルにつながる
○ より賢いエンジンはより多くのオラクルを得る
● アンチウイルスの挙動は有害になることがある
○ データリークだけではなく DoSも
● 決してユーザ入力に囲まれた部分に秘密データを保存しないこと
○ さもなくばAVOracleの脅威にさらされる
Any Questions?
@icchyr
icchy

[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼