46
Adobe Read JavaScript Brian Gorenc, 脆脆脆脆脆脆脆脆脆脆脆脆 AbdulAziz Hariri, 脆脆脆脆脆脆脆脆

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

Embed Size (px)

Citation preview

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

Adobe Reader のJavaScript API の悪用Brian Gorenc, 脆弱性リサーチのマネージャー

AbdulAziz Hariri, セキュリティリサーチャー

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

アジェンダ• 序論

• 攻撃対象領域の理解

• 脆弱性の発見

• エクスプロイトの構築

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

序論

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

序論HP Zero Day Initiative

AbdulAziz Hariri - @abdhaririZero Day Initiative のセキュリティリサーチャー

根本原因分析、脆弱性の発見、 エクスプロイトの開発

Brian Gorenc - @maliciousinputZero Day Initiative のトップ

Pwn2Own ハッキングコンテストの主催者

4

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

バグハンター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

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

攻撃対象領域の理解

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

攻撃対象領域の理解初期調査と資源

• 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

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

攻撃対象領域の理解ZDI 調査統計

• 最初の Adobe 調査は 2014 年の 12 月に始まった

• 我々は Reader/Acrobat に関して多くのケースを得ていなかった

• 主な目的はできるだけ多くのバグをなくすこと• 発見された様々なタイプのバグ– JavaScript API の制限のバイパス

– メモリリーク– 解放済みメモリ使用 (Use-After-Frees)– 特権昇格– etc.

8

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

攻撃対象領域の理解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

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

攻撃対象領域の理解Reader の JavaScript API の識見

• JS API documentation では特権 vs 非特権コンテキストが定義されている :

• たくさんの特権コンテキストがあり、非特権コンテキストからは実行できない :

10

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

攻撃対象領域の理解Reader の JavaScript API の識見

• 非特権コンテキストからの特権 API の警告の例 :

11

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

信頼できる関数特権メソッドを非特権コンテキストで実行する

12

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

攻撃対象領域の理解フォルダレベルのスクリプト

• Acrobat/Reader フォルダの中の JavaScript フォルダにスクリプトが格納されている

• 自動化機能の実装のために使用される

• 特権 API を実行する信頼できる関数が含まれる

• デフォルトの Acrobat/Reader には JSByteCodeWin.bin がある

• Acrobat/Reader が起動すると JSByteCodeWin.bin がロードされる

• Root でロードされ、ドキュメントが開かれると Doc で実行される

13

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

攻撃対象領域の理解デコンパイリング

• JSByteCodeWin.bin は SpiderMoney 1.8 XDR バイトコードにコンパイルされる

• JSByteCodeWin.bin には興味深い信頼できる関数がある

• Molnarg は SpiderMonkey の逆コンパイラを公開している– https://github.com/molnarg/dead0007– 使い方 : ./dead0007 JSByteCodeWin.bin > output.js– 出力は清書する必要がある

– ~27,000 行の Javascript

14

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

脆弱性の発見

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

脆弱性の発見JavaScript の Implicit メソッドの呼び出し

16

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

脆弱性の発見JavaScript メソッド / プロパティ オーバーロード

• __defineGetter__ and __defineSetter__

17

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

脆弱性の発見JavaScript メソッド / プロパティ オーバーロード

• __proto__

18

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

脆弱性の発見オーバーロードの機会のためのコード監査

• ‘eval’ の検索

19

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

脆弱性の発見オーバーロードの機会のためのコード監査

• ‘app.beginPriv(“ の検索

20

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

脆弱性の発見システムレベルの eval() を成し遂げる

• カスタム関数でオーバーロードプロパティへのアクセス

21

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

脆弱性の発見特権 API の実行

• 特権関数でプロパティの置き換え

22

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

脆弱性の発見脆弱性の連鎖

• ペイロードの大部分を実行するためにシステムレベルの eval を設定する

• 特権 API を呼び出すための代替の属性をつくる

• 呼び出しの実行

23

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

脆弱性の発見コンセプトの証明 – CVE-2015-3073

24

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

正常な挙動

25

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

特権昇格エクスプロイト

26

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

脆弱性の発見Adobe Reader 11.0.10 – パッチ前

27

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

脆弱性の発見Adobe Reader DC – パッチ後

28

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

脆弱性の発見要点

• 必要な JavaScript バイパスを成し遂げる

• システムコンテキスト内での実行を実現する

• オブジェクトメソッドをオーバーライドすることで特権昇格する– 信頼された関数内の特権ブロックでなくてはならない

29

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

エクスプロイトの構築

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

エクスプロイト構築概要

• https://helpx.adobe.com/security/products/reader/apsb14-15.html から研究は始まった

• チャレンジ : バイパス問題からリモートコード実行を得る

• 既知の JS API からできるかもしれない

31

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

エクスプロイトの構築documentation がひどいから ..• ディスクにファイルを dump する方法を探さなくてはならない

• ファイルはどの形式でも良い ( 制限は避けたほうが良い )• Adobe の JS API で Collab オブジェクトを見てみましょう…

32

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

エクスプロイトの構築“ 秘密を守りたいのなら自分からも隠せ” – G. Orwell • ドキュメント化されていない 128 のメソッドの中では、 Collab.uri* が興味深い :

33

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

エクスプロイトの構築“より多くを除外すると、 より残したものが目立つ” - H. Green• うますぎる話なので Google先生に相談しました :

34

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

エクスプロイトの構築何があるのか ...• 興味深いメソッドの簡単な概要 :

35

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

エクスプロイトの構築

• 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

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

エクスプロイトの構築

• 今のところ我々は :– Collab.uriPutData() メソッドを使用してディスクにファイルを dump することができる– dump したいファイルの内容は oData オブジェクトに渡す必要がある

– ストリームオブジェクトは動く !

37

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

エクスプロイトの構築

– PDF文書を添付し、内容を抽出することができる– uriPutData 呼び出しと前述したバイパスとを連結する必要がある

じゃあ何 ? RCE を得るどうすれば良いのか ? 実際には 2 つの明確な方法がある ...

38

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

エクスプロイトの構築RCE を得る

• 一つ目の方法… a la Chaouki:

基本的にスタートアップにファイルを書き込み logoff/logon を待つ J

• 二つ目の方法は Adobe Acrobat によってロードされる DLL を書く

39

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

エクスプロイトの構築

WindowsMacOSX

Adobe Reader Vulnerable – Limited (Sandbox) VulnerableAdobe Reader DC Vulnerable – Limited (Sandbox) VulnerableAdobe Acrobat Pro Vulnerable VulnerableAdobe Acrobat Pro DC Vulnerable Vulnerable

40

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

エクスプロイトの構築まとめる (Adobe Acrobat Pro)

1. PDF にペイロードを添付する

2. ドキュメントを開いた時に実行される JS を作る

3. JS は以下で構成されている :1.2.3.

Extract Bypass JS Attachment Privileges

41

RCECall uriPutData

with the extractedattachment

添付ファイルの抽出JS 権限のバイパスペイロードを出力するために Collab.uriPutData を実行する (startup/dll)

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

Windows エクスプロイトデモ

42

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

MacOSX の Reader のデモ

43

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

結論

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

要約Adobe Reader の JavaScript API の悪用

• ゴール– JavaScript API で Adobe Reader/Acrobat のリモート実行権限を得る– メモリ破壊をしない

• 攻撃の計画1.2.3.4.

45

JavaScript のプロパティのオーバーロードと再定義で任意の eval() を得るapp.trustedFunction を通じた特権昇格と eval() を連結する

悪用コードを実行するためにドキュメント化されていない API を使用するProfit?

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

Thank you