Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

957 views

Published on

Adobe ReaderのJavaScript APIはドキュメントの作成者にとって豊富な機能を提供します。 例えばフォームの変換や、マルチメディアのイベント管理、データベースの照会などを可能にし、これら全てはエンドユーザーにとって多機能なドキュメント作成の手段となります。しかしこうした豊富な機能は、攻撃者がAdobe ReaderのJavaScript APIに存在している弱点を利用する有効な手段にもなりえます。この講談ではAdobe Readerで扱える公式、非公式のAPIの両方の識見を提供します。
脆弱性の発見を助けるためにいくつかのコード監査技術を、現実の例を強調するようなたくさんの概念実証と共に紹介し、どのように複数の独特な課題を繋げて特権環境での実行を可能にするかを説明します。最後に、メモリ破壊を行わずにリモートからのコードを実行させるエクスプロイトの作り方を説明します。

Published in: Software
  • Login to see the comments

  • Be the first to like this

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

  1. 1. Adobe Readerの JavaScript APIの悪用 Brian Gorenc, 脆弱性リサーチのマネージャー AbdulAziz Hariri, セキュリティリサーチャー
  2. 2. アジェンダ • 序論 • 攻撃対象領域の理解 • 脆弱性の発見 • エクスプロイトの構築
  3. 3. 序論
  4. 4. 序論 HP Zero Day Initiative AbdulAziz Hariri - @abdhariri Zero Day Initiativeのセキュリティリサーチャー 根本原因分析、脆弱性の発見、 エクスプロイトの開発 Brian Gorenc - @maliciousinput Zero Day Initiativeのトップ Pwn2Own ハッキングコンテストの主催者 4
  5. 5. バグハンター 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
  6. 6. 攻撃対象領域の理解
  7. 7. 攻撃対象領域の理解 初期調査と資源 • 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
  8. 8. 攻撃対象領域の理解 ZDI 調査統計 • 最初のAdobe調査は2014年の12月に始まった • 我々はReader/Acrobatに関して多くのケースを得ていなかった • 主な目的はできるだけ多くのバグをなくすこと • 発見された様々なタイプのバグ – JavaScript API の制限のバイパス – メモリリーク – 解放済みメモリ使用(Use-After-Frees) – 特権昇格 – etc. 8
  9. 9. 攻撃対象領域の理解 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
  10. 10. 攻撃対象領域の理解 ReaderのJavaScript APIの識見 • JS API documentationでは特権 vs 非特権コンテキストが定義されている: • たくさんの特権コンテキストがあり、非特権コンテキストからは実行できない: 10
  11. 11. 攻撃対象領域の理解 ReaderのJavaScript APIの識見 • 非特権コンテキストからの特権APIの警告の例: 11
  12. 12. 信頼できる関数 特権メソッドを非特権コンテキストで実行する 12
  13. 13. 攻撃対象領域の理解 フォルダレベルのスクリプト • Acrobat/Readerフォルダの中のJavaScriptフォルダにスクリプトが格納されている • 自動化機能の実装のために使用される • 特権APIを実行する信頼できる関数が含まれる • デフォルトのAcrobat/ReaderにはJSByteCodeWin.binがある • Acrobat/Readerが起動するとJSByteCodeWin.binがロードされる • Rootでロードされ、ドキュメントが開かれるとDocで実行される 13
  14. 14. 攻撃対象領域の理解 デコンパイリング • JSByteCodeWin.binはSpiderMoney 1.8 XDRバイトコードにコンパイルされる • JSByteCodeWin.binには興味深い信頼できる関数がある • MolnargはSpiderMonkeyの逆コンパイラを公開している – https://github.com/molnarg/dead0007 – 使い方: ./dead0007 JSByteCodeWin.bin > output.js – 出力は清書する必要がある – ~27,000行のJavascript 14
  15. 15. 脆弱性の発見
  16. 16. 脆弱性の発見 JavaScriptのImplicitメソッドの呼び出し 16
  17. 17. 脆弱性の発見 JavaScriptメソッド/プロパティ オーバーロード • __defineGetter__ and __defineSetter__ 17
  18. 18. 脆弱性の発見 JavaScriptメソッド/プロパティ オーバーロード • __proto__ 18
  19. 19. 脆弱性の発見 オーバーロードの機会のためのコード監査 • ‘eval’の検索 19
  20. 20. 脆弱性の発見 オーバーロードの機会のためのコード監査 • ‘app.beginPriv(“の検索 20
  21. 21. 脆弱性の発見 システムレベルのeval()を成し遂げる • カスタム関数でオーバーロードプロパティへのアクセス 21
  22. 22. 脆弱性の発見 特権APIの実行 • 特権関数でプロパティの置き換え 22
  23. 23. 脆弱性の発見 脆弱性の連鎖 • ペイロードの大部分を実行するためにシステムレベルのevalを設定する • 特権APIを呼び出すための代替の属性をつくる • 呼び出しの実行 23
  24. 24. 脆弱性の発見 コンセプトの証明 – CVE-2015-3073 24
  25. 25. 正常な挙動 25
  26. 26. 特権昇格エクスプロイト 26
  27. 27. 脆弱性の発見 Adobe Reader 11.0.10 – パッチ前 27
  28. 28. 脆弱性の発見 Adobe Reader DC – パッチ後 28
  29. 29. 脆弱性の発見 要点 • 必要なJavaScriptバイパスを成し遂げる • システムコンテキスト内での実行を実現する • オブジェクトメソッドをオーバーライドすることで特権昇格する – 信頼された関数内の特権ブロックでなくてはならない 29
  30. 30. エクスプロイトの構築
  31. 31. エクスプロイト構築 概要 • https://helpx.adobe.com/security/products/reader/apsb14-15.htmlから研究は始まった • チャレンジ: バイパス問題からリモートコード実行を得る • 既知のJS APIからできるかもしれない 31
  32. 32. エクスプロイトの構築 documentationがひどいから.. • ディスクにファイルをdumpする方法を探さなくてはならない • ファイルはどの形式でも良い(制限は避けたほうが良い) • AdobeのJS APIでCollabオブジェクトを見てみましょう… 32
  33. 33. エクスプロイトの構築 “秘密を守りたいのなら自分からも隠せ” – G. Orwell • ドキュメント化されていない128のメソッドの中では、Collab.uri* が興味深い: 33
  34. 34. エクスプロイトの構築 “より多くを除外すると、 より残したものが目立つ” - H. Green • うますぎる話なのでGoogle先生に相談しました: 34
  35. 35. エクスプロイトの構築 何があるのか... • 興味深いメソッドの簡単な概要: 35
  36. 36. エクスプロイトの構築 • 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
  37. 37. エクスプロイトの構築 • 今のところ我々は: – Collab.uriPutData()メソッドを使用してディスクにファイルをdumpすることができる – dumpしたいファイルの内容はoDataオブジェクトに渡す必要がある – ストリームオブジェクトは動く! 37
  38. 38. エクスプロイトの構築 – PDF文書を添付し、内容を抽出することができる – uriPutData呼び出しと前述したバイパスとを連結する必要がある じゃあ何? RCEを得るどうすれば良いのか? 実際には2つの明確な方法がある... 38
  39. 39. エクスプロイトの構築 RCEを得る • 一つ目の方法…a la Chaouki: 基本的にスタートアップにファイルを書き込みlogoff/logonを待つ JJ • 二つ目の方法はAdobe AcrobatによってロードされるDLLを書く 39
  40. 40. エクスプロイトの構築 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
  41. 41. エクスプロイトの構築 まとめる(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)
  42. 42. Windows エクスプロイトデモ 42
  43. 43. MacOSX のReaderのデモ 43
  44. 44. 結論
  45. 45. 要約 Adobe ReaderのJavaScript APIの悪用 • ゴール – JavaScript APIでAdobe Reader/Acrobatのリモート実行権限を得る – メモリ破壊をしない • 攻撃の計画 1. 2. 3. 4. 45 JavaScriptのプロパティのオーバーロードと再定義で任意のeval()を得る app.trustedFunctionを通じた特権昇格とeval()を連結する 悪用コードを実行するためにドキュメント化されていないAPIを使用する Profit?
  46. 46. Thank you

×