Adobe Readerの
JavaScript APIの悪用
Brian Gorenc, 脆弱性リサーチのマネージャー
AbdulAziz Hariri, セキュリティリサーチャー
アジェンダ
• 序論
• 攻撃対象領域の理解
• 脆弱性の発見
• エクスプロイトの構築
序論
序論
HP Zero Day Initiative
AbdulAziz Hariri - @abdhariri
Zero Day Initiativeのセキュリティリサーチャー
根本原因分析、脆弱性の発見、 エクスプロイトの開発
Brian Gorenc - @maliciousinput
Zero Day Initiativeのトップ
Pwn2Own ハッキングコンテストの主催者
4
バグハンター
2014年の12月に開始した調査
パッチが当てられた脆弱性 パッチが当てられていない脆弱性
CVE-2015-5085, CVE-2015-5086, CVE-2015-5090,
CVE-2015-5091, CVE-2015-4438, CVE-2015-4447,
CVE-2015-4452, CVE-2015-5093, CVE-2015-5094,
CVE-2015-5095, CVE-2015-5101, CVE-2015-5102,
CVE-2015-5103, CVE-2015-5104, CVE-2015-5113,
CVE-2015-5114, CVE-2015-5115, CVE-2015-5100,
CVE-2015-5111, CVE-2015-4435, CVE-2015-4441,
CVE-2015-4445, CVE-2015-3053, CVE-2015-3055,
CVE-2015-3057, CVE-2015-3058, CVE-2015-3065,
CVE-2015-3066, CVE-2015-3067, CVE-2015-3068,
CVE-2015-3071, CVE-2015-3072, CVE-2015-3073,
CVE-2015-3054, CVE-2015-3056, CVE-2015-3061,
CVE-2015-3063, CVE-2015-3064, CVE-2015-3069,
CVE-2015-3060, CVE-2015-3062
…more to come.
5
ZDI-CAN-3058, ZDI-CAN-3059, ZDI-CAN-3060,
ZDI-CAN-3061, ZDI-CAN-3062, ZDI-CAN-3063,
ZDI-CAN-3065, ZDI-CAN-3066, ZDI-CAN-3067,
ZDI-CAN-3079, ZDI-CAN-3081, ZDI-CAN-3083,
ZDI-CAN-3085, ZDI-CAN-3086, ZDI-CAN-3087,
ZDI-CAN-3088, ZDI-CAN-3089, ZDI-CAN-3090,
ZDI-CAN-3091, ZDI-CAN-3068, ZDI-CAN-3069,
ZDI-CAN-3070, ZDI-CAN-3073, ZDI-CAN-3074,
ZDI-CAN-3080, ZDI-CAN-3082, ZDI-CAN-3084,
ZDI-CAN-3103, ZDI-CAN-3111, ZDI-CAN-3051,
ZDI-CAN-3050, ZDI-CAN-3049, ZDI-CAN-3048,
ZDI-CAN-3047, ZDI-CAN-3046, ZDI-CAN-3043,
ZDI-CAN-3036, ZDI-CAN-3022, ZDI-CAN-3021,
ZDI-CAN-2019, ZDI-CAN-3018, ZDI-CAN-3017,
ZDI-CAN-3016, ZDI-CAN-3015, ZDI-CAN-2998,
ZDI-CAN-2997, ZDI-CAN-2958, ZDI-CAN-2816,
ZDI-CAN-2892, ZDI-CAN-2893
攻撃対象領域の理解
攻撃対象領域の理解
初期調査と資源
• Adobe Reader JavaScript のバグ (CVE-2014-0521) - Gábor Molnár
• はじめにJS APIのバイパス問題について取り上げる
• バグはAPSB14-15でパッチが当てられ、CVE-2014-0521に割り当てられた
• Adobeによると、これは情報公開につながる可能性がある
• https://molnarg.github.io/cve-2014-0521/#/
• 何故人気のあるソフトウェアの検証をするのか? – MWR Labs
• Adobe readerへの様々な攻撃ベクトルをハイライトする
• https://labs.mwrinfosecurity.com/system/assets/979/original/Why_bother_assessing_popular_software.pdf
7
攻撃対象領域の理解
ZDI 調査統計
• 最初のAdobe調査は2014年の12月に始まった
• 我々はReader/Acrobatに関して多くのケースを得ていなかった
• 主な目的はできるだけ多くのバグをなくすこと
• 発見された様々なタイプのバグ
– JavaScript API の制限のバイパス
– メモリリーク
– 解放済みメモリ使用(Use-After-Frees)
– 特権昇格
– etc.
8
攻撃対象領域の理解
ReaderのJavaScript APIの識見
• Adobe Acrobat/Readerは豊富なJS APIがある
• JavaScript API documentationはAdobeのウェブサイトで公開されている
• JavaScript APIで様々なことができる (フォーム(入力欄)、アノテーション(注釈機能)、コラボレーション(共同作業) etc..
• JavaScript APIには、脆弱性緩和機能が存在する
• いくつかのAPIは Acrobat Pro/Acrobatのみで使用可能である
• 基本的にJavaScript APIは2つのコンテキストで実行される:
– 特権コンテキスト
– 非特権コンテキスト
9
攻撃対象領域の理解
ReaderのJavaScript APIの識見
• JS API documentationでは特権 vs 非特権コンテキストが定義されている:
• たくさんの特権コンテキストがあり、非特権コンテキストからは実行できない:
10
攻撃対象領域の理解
ReaderのJavaScript APIの識見
• 非特権コンテキストからの特権APIの警告の例:
11
信頼できる関数
特権メソッドを非特権コンテキストで実行する
12
攻撃対象領域の理解
フォルダレベルのスクリプト
• Acrobat/Readerフォルダの中のJavaScriptフォルダにスクリプトが格納されている
• 自動化機能の実装のために使用される
• 特権APIを実行する信頼できる関数が含まれる
• デフォルトのAcrobat/ReaderにはJSByteCodeWin.binがある
• Acrobat/Readerが起動するとJSByteCodeWin.binがロードされる
• Rootでロードされ、ドキュメントが開かれるとDocで実行される
13
攻撃対象領域の理解
デコンパイリング
• JSByteCodeWin.binはSpiderMoney 1.8 XDRバイトコードにコンパイルされる
• JSByteCodeWin.binには興味深い信頼できる関数がある
• MolnargはSpiderMonkeyの逆コンパイラを公開している
– https://github.com/molnarg/dead0007
– 使い方: ./dead0007 JSByteCodeWin.bin > output.js
– 出力は清書する必要がある
– ~27,000行のJavascript
14
脆弱性の発見
脆弱性の発見
JavaScriptのImplicitメソッドの呼び出し
16
脆弱性の発見
JavaScriptメソッド/プロパティ オーバーロード
• __defineGetter__ and __defineSetter__
17
脆弱性の発見
JavaScriptメソッド/プロパティ オーバーロード
• __proto__
18
脆弱性の発見
オーバーロードの機会のためのコード監査
• ‘eval’の検索
19
脆弱性の発見
オーバーロードの機会のためのコード監査
• ‘app.beginPriv(“の検索
20
脆弱性の発見
システムレベルのeval()を成し遂げる
• カスタム関数でオーバーロードプロパティへのアクセス
21
脆弱性の発見
特権APIの実行
• 特権関数でプロパティの置き換え
22
脆弱性の発見
脆弱性の連鎖
• ペイロードの大部分を実行するためにシステムレベルのevalを設定する
• 特権APIを呼び出すための代替の属性をつくる
• 呼び出しの実行
23
脆弱性の発見
コンセプトの証明 – CVE-2015-3073
24
正常な挙動
25
特権昇格エクスプロイト
26
脆弱性の発見
Adobe Reader 11.0.10 – パッチ前
27
脆弱性の発見
Adobe Reader DC – パッチ後
28
脆弱性の発見
要点
• 必要なJavaScriptバイパスを成し遂げる
• システムコンテキスト内での実行を実現する
• オブジェクトメソッドをオーバーライドすることで特権昇格する
– 信頼された関数内の特権ブロックでなくてはならない
29
エクスプロイトの構築
エクスプロイト構築
概要
• https://helpx.adobe.com/security/products/reader/apsb14-15.htmlから研究は始まった
• チャレンジ: バイパス問題からリモートコード実行を得る
• 既知のJS APIからできるかもしれない
31
エクスプロイトの構築
documentationがひどいから..
• ディスクにファイルをdumpする方法を探さなくてはならない
• ファイルはどの形式でも良い(制限は避けたほうが良い)
• AdobeのJS APIでCollabオブジェクトを見てみましょう…
32
エクスプロイトの構築
“秘密を守りたいのなら自分からも隠せ” – G. Orwell
• ドキュメント化されていない128のメソッドの中では、Collab.uri* が興味深い:
33
エクスプロイトの構築
“より多くを除外すると、 より残したものが目立つ” - H. Green
• うますぎる話なのでGoogle先生に相談しました:
34
エクスプロイトの構築
何があるのか...
• 興味深いメソッドの簡単な概要:
35
エクスプロイトの構築
• Collab.uri* APIの概要:
– APIは“Collaboration”に使用される
– uriDeleteFolder/uriDeleteFile/uriPutData/uriCreateFolderは特権API
– uriEnumerateFilesは非特権
– Collab.uri* メソッドは引数としてURIパスが必要(少なくとも)
– UNCパスでなくてはならない
– UNCパスはsmb:// もしくはfile:// ではじまる
• APIは失敗する:
– UNCパスをサニタイズする (smb://localhost/C$/XXX works)
– ディスクに書き込むファイル名のファイルタイプを確認する(uriPutDataの場合)
– ダンプされるoDataオブジェクトの内容をチェックする (uriPutDataの場合)
36
エクスプロイトの構築
• 今のところ我々は:
– Collab.uriPutData()メソッドを使用してディスクにファイルをdumpすることができる
– dumpしたいファイルの内容はoDataオブジェクトに渡す必要がある
– ストリームオブジェクトは動く!
37
エクスプロイトの構築
– PDF文書を添付し、内容を抽出することができる
– uriPutData呼び出しと前述したバイパスとを連結する必要がある
じゃあ何? RCEを得るどうすれば良いのか? 実際には2つの明確な方法がある...
38
エクスプロイトの構築
RCEを得る
• 一つ目の方法…a la Chaouki:
基本的にスタートアップにファイルを書き込みlogoff/logonを待つ JJ
• 二つ目の方法はAdobe AcrobatによってロードされるDLLを書く
39
エクスプロイトの構築
Windows MacOSX
Adobe Reader Vulnerable – Limited (Sandbox) Vulnerable
Adobe Reader DC Vulnerable – Limited (Sandbox) Vulnerable
Adobe Acrobat Pro Vulnerable Vulnerable
Adobe Acrobat Pro DC Vulnerable Vulnerable
40
エクスプロイトの構築
まとめる(Adobe Acrobat Pro)
1. PDFにペイロードを添付する
2. ドキュメントを開いた時に実行されるJS を作る
3. JSは以下で構成されている:
1.
2.
3.
Extract Bypass JS
Attachment Privileges
41
RCE
Call uriPutData
with the extracted
attachment
添付ファイルの抽出
JS権限のバイパス
ペイロードを出力するためにCollab.uriPutDataを実行する(startup/dll)
Windows エクスプロイトデモ
42
MacOSX のReaderのデモ
43
結論
要約
Adobe ReaderのJavaScript APIの悪用
• ゴール
– JavaScript APIでAdobe Reader/Acrobatのリモート実行権限を得る
– メモリ破壊をしない
• 攻撃の計画
1.
2.
3.
4.
45
JavaScriptのプロパティのオーバーロードと再定義で任意のeval()を得る
app.trustedFunctionを通じた特権昇格とeval()を連結する
悪用コードを実行するためにドキュメント化されていないAPIを使用する
Profit?
Thank you

Adobe ReaderのJavaScript APIの悪用 by Abdul-Aziz Hariri & Brian Gorenc - CODE BLUE 2015