
Foxit Reader CVE-2018-14442 用 PoC
PDFは文書を表現するためのファイル形式です。PDFは複数のデータオブジェクトで構成されています。
単純なプリミティブオブジェクト 整数、数値、ブール値、Null
複合オブジェクト
| 形式 | 名前 |
|---|---|
| [.*] | 配列 |
| (.*) | 文字列 |
| <<.*>> | 辞書 |
| <.*> | 16進文字列 |
| /.* | 名前 |
| stream.*endstream | ストリーム |
これらのオブジェクトは、PDFの外観と内容を定義します。PDF内の構造は、直接オブジェクトと間接オブジェクトの2種類で表現されます。間接オブジェクトは、オブジェクト番号と世代番号で始まり、その後に実際のオブジェクトが続きます。間接オブジェクトは、他のオブジェクトから n m R として直接参照できます。ここで n と m はそれぞれオブジェクト番号と世代番号です。
辞書オブジェクトは、ドキュメントの基本的な構成要素です。ページやドキュメント自体を構成するために必要な一般的な辞書オブジェクトがいくつかあります。最も重要なのは Root 辞書で、その他のすべての Pages、Metadata、Names などへのリンクを定義します。これらの各要素は、他のオブジェクトにすることができます。
ストリームオブジェクトには、フォント、画像、圧縮/暗号化されたデータなど、ほとんどのバイナリデータが含まれます。
PDF文書は、その内容を不正アクセスから保護するために暗号化できます。暗号化は、PDFファイル内のすべての文字列とストリームに適用されますが、Encrypt 辞書自体などの一部の例外があります。暗号化は主にストリームオブジェクトに適用されます。暗号化は、整数やブール値などの他のオブジェクトタイプには適用されません。これらのタイプは主に、ドキュメントの内容ではなく構造に関する情報を伝えるために使用されます。
暗号化に関連する情報は、ドキュメントの暗号化辞書に保存されます。この辞書は、ドキュメントのトレーラー辞書内の "Encrypt" エントリの値です。
CPDF_Parser::StartParse は、暗号化されたPDFの間接オブジェクトに対して m_pCryptoHandler を設定します。m_pCryptoHandler は、CPDF_Parser::ReleaseEncryptHandler が完了したときにnullにする必要があります。しかし、CPDF_Parser::ReleaseEncryptHandler は CPDF_Parser 内のCryptoHandlerへの参照を削除せず、ダングリングポインタになります。
その後、パーサーが Root 辞書で参照されているオブジェクトの解析を開始すると、m_pCryptoHandler+8 が呼び出されてデータを復号します。
同様のバグは、pdfium のコミット 741c362fb75fd8acd2ed2059c6e3e716a63a7ac8 で修正されました。参照: https://bugs.chromium.org/p/chromium/issues/detail?id=726503
PDFでは、ドキュメント内にJSを埋め込むことができ、Catalog タイプの辞書の OpenAction に入力されている場合、自動的に実行されます。JSが実行できるようになると、プロセス空間にオブジェクトをスプレーして、ROPチェーンを書き込む予測可能なアドレスを取得できます。
Foxit ReaderでPDF文書に署名する場合、インストールディレクトリの plugins\jrsys\x86\jrsysMSCryptoDll.dll を使用して署名情報を読み取ります。これにより、jrsysCryptoDll.dll が静的アドレス 0x10000000 にロードされます。このDLLは VirtualAlloc をインポートするため、ペイロードの実行が容易になります。添付のエクスプロイトは、ヒープスプレーを使用して予測可能なメモリレイアウトを取得し、ROPチェーンを使用してRWXページを割り当て、ペイロードをコピーして実行します。
このエクスプロイトは、MS Windows 7 Enterprise Build 7601 SP1 x86 上で動作する Foxit Reader 9.0.1.1049 x86 を使用してテストされました。このエクスプロイトは、ヒープが特定の状態にあることを必要とします。エクスプロイトが失敗した場合は、もう一度お試しください。ビデオデモ を参照してください。この脆弱性は、Android版の Foxit PDF Reader および Converter にも存在します。
bitcoins.pdf は、解放されたメモリの再割り当てを行い、根本的なバグを引き起こすように作成されたPDFです。デバッガーでクラッシュを再現したい場合は、FoxitReader.exe に対して Page Heaps を有効にし、bitcoins.pdf を開いてください。
このクラッシュは、Payatu で開発されたファジングプラットフォームである Cloudfuzz によって発見されました。さらなる分析とエクスプロイト開発は Sudhakar によって行われました。