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. アンチウイルスをオラクルとした
    Windows Defenderに対する
    新しい攻撃手法
    市川 遼
    (icchy)
    CODE BLUE 2019, 10/29

    View full-size slide

  2. 自己紹介

    icchy (a.k.a. t0nk42)

    CTF

    TokyoWesterns
    リーダー

    Web, Forensics

    CTF
    運営

    TokyoWesterns CTF
    ■ 問題作成
    ,
    インフラ管理

    CODE BLUE CTF

    Bull's Eye
    システム開発

    View full-size slide

  3. 問題:
    ● 以下のコードに脆弱性を指摘できますか?
    ○ この発表を聞くと脆弱性が何かわかります

    View full-size slide

  4. https://www.rambus.com/blogs/an-introduction-to-side-channel-attacks/

    イドチ
    ャネ



    View full-size slide

  5. サイドチャネル攻撃の基本
    ● 通常の攻撃
    ○ リモートコード実行
    ○ パストラバーサル
    ● サイドチャネル攻撃
    ○ あらゆる場所から重要データをサイドエフェクトからリークする
    ○ スペクトル
    :
    キャッシュヒットの時間差
    ○ クロスサイトサーチ
    : JavaScript
    の保護されていない属性
    (

    : iframe.length)
    ○ パディングオラクル
    :
    パディングエラーから平文を推測
    ● サイドエフェクトから情報を復元
    (i.e.
    オラクル
    )

    View full-size slide

  6. サイドチャネル攻撃の標的

    CPU

    Spectre

    Content auditor

    XSS auditor
    ● 暗号
    ○ パディングオラクル
    (

    : POODLE)
    ● ハードウェア
    ○ 電力解析

    View full-size slide

  7. Content auditors

    Content auditor
    はユーザを守る

    XSS Auditor

    WAF (
    ウェブアプリケーションファイアウォール
    )
    ○ アンチウイルス

    Content auditor
    は検査するデータの中身を知っている

    Content auditors
    は評価器を持っていることがある

    View full-size slide

  8. 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
    と呼ぶ
    ● アンチウイルスソフトはどうか

    View full-size slide

  9. アンチウイルス
    ● 我々が普段最も使うソフトウェアの一つ

    Avast

    ESET

    Kaspersky Security

    McAfee

    Norton Security

    Symantec Endpoint Protection

    Trendmicro Virus Buster Cloud

    Windows Defender


    ● ユーザを悪意のある試行から守る
    ○ ファイル
    ○ ネットワーク

    etc.

    View full-size slide

  10. audit([secret] + [user input])

    View full-size slide

  11. アンチウイルスの悪用
    ● もし攻撃者がデータを部分的にコントロールできたら
    ○ 例えばユーザ入力と秘密のデータを一緒に保存する場合
    ○ 攻撃者が誤検知
    (
    偽陽性
    )
    を引き起こせる

    [secret] + [user input] =>
    検知されたか?
    ○ 攻撃者は入力を変化させていくことによって秘密データをリークできるかもしれない
    ● アンチウイルスはオラクルになりうる
    ○ 様々な種類のデータに対する解析器がある

    View full-size slide

  12. アンチウイルスの悪用
    ● アンチウイルスはブラックボックス
    ○ いつ動くか
    ○ 何をするのか
    ○ どうやってマルウェアを検知するのか
    ○ アーキテクチャはどうなっているのか
    ○ 必要なファイルは何か?

    etc.

    Windows Defender
    を調査
    ○ 最も有名
    ○ 普通の
    Windows
    でデフォルトで動いている

    View full-size slide

  13. Windows Defender
    ● 悪意あるコンテンツとして認識されるものはなにか

    Microsoft
    から公開されているマルウェアのリスト
    ■ https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes
    ○ 他のベンダーも似たようなものを持っていると考えられる
    ○ 詳しい情報は出ていない

    Windows Defender
    を解析する必要

    View full-size slide

  14. Windows Defenderのブラックボックス解析
    ● 検査プロセスを走らせる対象
    ○ ファイルアクセス
    ○ コマンド実行
    ○ 悪意のあるコンテンツが検知された場合
    ■ ユーザからのアクセスをブロックし、通知する
    ● 解析対象
    ○ エンコード

    Base64
    ○ アーカイブ
    ,
    圧縮

    ZIP, GZip, …
    ○ 実行可能ファイル

    PE, WSH (VBS, JScript), …
    ● ブラックボックス解析は非常に面倒

    View full-size slide

  15. Windows Defenderをもっと効率的に解析するには

    View full-size slide

  16. Windows Defenderの解析は手間がかかる

    "MpCmdRun.exe"
    で解析エンジンを直接呼び出すことが可能
    ○ いくつかの問題点がある

    View full-size slide

  17. Windows Defenderの解析は手間がかかる

    Windows Defender
    の予期しない挙動
    ○ タイミング問題
    ○ 悪意あるコンテンツの無効化
    (
    削除
    )
    ● ペイロードを何度も再生成する必要がある
    ● デバッグのための情報がない
    ○ 検知理由を知るのが難しい
    ● 何か便利なツールはないか?
    ○ いくつかのツールが既にある

    View full-size slide

  18. 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.

    View full-size slide

  19. Tips: taviso/loadlibrary
    ● 古いバージョンの
    PDB
    シンボルファイル

    github.com/0xAlexei/WindowsDefenderTools
    を参照

    MD5=e95d3f9e90ba3ccd1a4b8d63cbd88d1b => 1.271.81.0
    ○ 古い
    mpam-fe.exe
    をダウンロード、
    cabextract
    で展開

    mpengine.dll
    がコアのエンジン
    ● デバッグ機能

    DEBUG
    フラグで
    API
    コールがトレース可能

    View full-size slide

  20. Windows Defender internals

    Windows Defender
    シグネチャフォーマット
    :
    *.vdm

    mpasbase.vdm
    ○ 何らかの方法で暗号化されている

    WDExtract
    を使うと便利

    github.com/hfiref0x/WDExtract
    ● 復号されたシグネチャを見てみる

    View full-size slide

  21. Windows Defender internals

    Windows Defender

    Lua
    を使っている

    View full-size slide

  22. Windows Defender internals
    シグネチャ名
    シグネチャ定義
    (
    文字列
    )

    View full-size slide

  23. Windows Defender internals
    ● 様々なファイルフォーマット用のハンドラがある

    View full-size slide

  24. Windows Defenderのホワイトボックス (?) 解析

    Windows Defender

    JScript
    の解析器を内包している

    DOM API
    も利用可能
    ● パースするだけでなくエミュレートする

    JScript
    が eval(str) を呼んだ場合、strも検査対象になる
    ○ eval("EICAR")
    =>
    検知される
    ● これらを組み合わせると何が起こるか?

    View full-size slide

  25. デモアプリケーションへの攻撃

    PoC
    のために用意したアプリケーション
    ○ GET /?c1=controllable1&c2=controllable2
    ■ 単純な形式でデータを保存
    ■ ユーザはSecretの中身を見られない
    ○ GET /:name
    ■ ファイルの存在と完全性を確認
    ● どうやってSecretをリークするか

    View full-size slide

  26. 攻撃コードの開発

    Windows Defender
    のエミュレータが使える
    ○ デバッグ情報付き

    JScript
    の eval 関数は引数を評価する
    ○ 引数が悪意のあるデータを含んでいた場合は検知される
    ● eval("EICA" + input)
    => ?
    ○ 検知された場合 →
    input

    "R"
    ○ 検知されなかった場合 →
    input

    "R"
    以外

    View full-size slide

  27. JScriptエンジンにあるいくつかの問題点

    if
    文は絶対に評価されない
    ○ if (true) {eval("EICA" + "R")} → 検知されない

    object
    アクセス が役に立つ
    :
    {0: "a", 1: "b", ...}[input]
    ● パーサがヌル文字で止まる
    ○ eval("EICA" + "R[NULL]") →
    syntax error
    ○ どうやってヌル文字を扱うか

    View full-size slide

  28. mpengine.dllの他の機能

    HTML
    ドキュメントを解析可能
    ○ いくつかの
    html
    タグがトリガーとなる
    (

    : )<br/>○ パーサはヌル文字で止まらない<br/>●<br/>JScript<br/>は要素にアクセス可能<br/>○<br/><body><br/>タグがある場合<br/>○<br/><script>document.body.innerHTML[0][secret]
    ● オラクルに必要な要素が揃った

    View full-size slide

  29. 攻撃コードの開発

    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);

    View full-size slide

  30. 攻撃コードの開発
    ● 高速化する

    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);

    View full-size slide

  31. 攻撃コードの開発
    ● 今までの要素を組み合わせる

    Controllable1:
    ...

    Secret:
    [secret]

    Controllable2:

    ● オラクルを得るには
    :
    / に送信したあとに /:name にアクセスする
    ○ 検知された場合 →
    Internal Server Error
    ○ 検知されなかった場合 → 通常のレスポンスが見える
    ...[script]...[secret]......

    View full-size slide

  32. デモ
    ● デモアプリケーションに対する
    AVOracle
    攻撃

    View full-size slide

  33. 利点と欠点
    ● 利点
    ○ この手法をブラインドで使える
    ○ 攻撃対象の構造を知る必要はなく、単にペイロードを散りばめれば良い
    ● 欠点

    2
    箇所にペイロードを置く必要がある
    ○ ペイロードに挟まれた部分しかリークできない
    ● 別のタイプは無いか
    ○ インプットの前後のデータをリークできれば理想的
    ○ いまのところ
    PoC
    はない

    View full-size slide

  34. 他の標的は?

    View full-size slide

  35. 標的になりうるもの
    ● かなり多くのアプリケーションがユーザ入力と秘密データを一緒に保存
    ● セッションファイル

    TokyoWesterns CTF 2019 phpnote

    PHP
    セッションに保存された
    HMAC
    の秘密鍵
    (
    ユーザからは見えない
    )
    をリーク
    ● ログファイル

    Apache, Nginx, IIS
    ● データベース
    ○ ファイルベースの
    DBMS (

    : SQLite3)
    ● キャッシュファイル
    ○ ブラウザ
    ,
    バイトコードなど

    View full-size slide

  36. アンチウイルスをファイル編集に使う
    ● 検知した場合アンチウイルスがファイルの中身を変更したり消したりする

    Windows Defender
    はマッチした部分をスペースで置き換える
    (HTML script
    タグの場合
    )
    ● 攻撃者はデータを部分的に消去できる
    ● データがリークできなくても、何かできそう
    dataeval('EICAR');data
    data data

    View full-size slide

  37. 証拠の消去
    ● 攻撃者はログの一部を消去できる
    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')"

    View full-size slide

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

    View full-size slide

  39. アンチウイルスをDoSに使う
    ● 悪意あるデータを消す際に構造体の境界にまたがって消す
    ● 構造体のメタデータは破壊される
    ○ スペースで置き換えられる
    ● 2つのペイロードが境界を跨がない場合
    ○ 攻撃者は別のデータを書き換えられる

    View full-size slide

  40. 他のアンチウイルスはどうか?

    View full-size slide

  41. 他のアンチウイルスの調査

    VirusTotal
    が最高の友達
    :)
    ● どのアンチウイルスが
    JScript
    エミュレータをサポートしているか
    ○ eval('EICA'+'R'); // 検知されるはず
    ○ eval('EICA'+'#'); // 検知されないはず

    4
    つヒットした

    Cyren

    DrWeb

    Microsoft

    NANO-Antivirus

    TrendMicro
    ○ 誤検知
    (
    偽陽性
    )

    View full-size slide

  42. 他のアンチウイルスの調査
    ● さらに調べてみる
    ● どのアンチウイルスが
    DOM API
    をサポートしているか
    ○ eval('EICA'+innerHTML[0]);R // 検知されるはず
    ○ eval('EICA'+innerHTML[0]);# // 検知されないはず

    Microsoft
    のみヒット
    ○ 故に
    AVOracle
    に脆弱な理由

    SUPERAntiSpyware
    ○ 誤検知
    (
    偽陽性
    )

    View full-size slide

  43. Windows Defenderは賢すぎた

    View full-size slide

  44. どうやってこの攻撃を防ぐか
    ● 私見
    :
    汎用的な対策は存在しない
    ○ 通常の動作の範囲であって脆弱性ではないため
    ● 検知エンジンを無効化するのもあり
    ○ 実際に
    Chromium XSS auditor
    は無効化された
    ○ しかし
    Microsoft
    は検知エンジンを無効化しないだろう
    ● アプリケーション開発者が気をつけるべきこと
    ○ この攻撃手法を知る
    ○ コントロール可能なデータと秘密データを一緒に保存しない


    しかしこれは開発者のみの責任ではない
    ○ アンチウイルスベンダーも気をつけるべき

    View full-size slide

  45. 結論

    Auditor Based Oracle
    は至るところにある
    ○ アンチウイルスは大きな一例
    ○ インテリジェントエンジンを持っているとオラクルになりうる

    Windows Defender
    は他のアンチウイルスより賢すぎる
    ○ 結果として効果的なオラクルにつながる
    ○ より賢いエンジンはより多くのオラクルを得る
    ● アンチウイルスの挙動は有害になることがある
    ○ データリークだけではなく
    DoS

    ● 決してユーザ入力に囲まれた部分に秘密データを保存しないこと
    ○ さもなくば
    AVOracle
    の脅威にさらされる

    View full-size slide

  46. Any Questions?
    @icchyr
    icchy

    View full-size slide