この脆弱性は、Cisco Talos の Aleksandar Nikolic によって検出されました。
PDFium は Google Chrome Web ブラウザに含まれるデフォルトの PDF リーダーです。Talos はこの Pdfium PDF リーダーにおいて、セキュリティ ホールとなるヒープ バッファ オーバーフローの脆弱性を特定しました。Jpeg2000 画像が組み込まれた PDF ファイルが閲覧されると、攻撃者は攻撃対象のシステム上で任意のコードを実行できるようになります。最も効果的な攻撃方法は、攻撃者が Web サイト上に悪意のある PDF ファイルを置いた上で、フィッシング電子メールやマルバタイジングを使用して攻撃対象をその Web サイトへ誘導するというものです。
TALOS-CAN-0174 ヒープ バッファ オーバーフローの脆弱性(CVE-2016-1681)
ヒープ バッファ オーバーフローの脆弱性は、Chrome の PDF レンダラである PDFium によって使用される jpeg2000 画像のパーサ ライブラリ内に存在します。脆弱性は基本となる jpeg2000 パーサ ライブラリ、OpenJPEG にあり、Chrome ではその特殊な製作プロセスによってセキュリティホールとなっています。
OpenJPEG ライブラリの既存のアサート コールはビルド単体ではヒープ オーバーフローを防止しますが、ビルドに Chrome のリリース バージョンが含まれる場合は、アサーションは除外されます。脆弱性のソースは「j2k.c」ファイル内の「opj_j2k_read_siz」機能にある、次のコードです。
上記の「calloc」ラッパーである「opj_calloc」に対するコールにおいて「numcomps」の値が 0 である場合、「calloc」は後に「free」へとパスされる独自のポインタを返します(これは最近の Linux OS 上では実装依存となっています)。「Calloc」が返す独自のポインタの割り当ては、通常はごく小さい(x64 コードの場合 0x20 バイト)ものです。これが、後にこのバッファが使用された際にヒープ バッファ オーバーフローへと繋がります。このオーバーフローは、先に許容されたバッファが「opj_j2k_read_SQcd_SQcc」機能の内部で逆参照された場合に起こります。 最初の領域外メモリへの書き出しは、以下のコード内で起こります。
上記のコードでは、「l_tccp」ポインタは以前誤って割り当てられたエリアを指します。以下のコードでは、その後領域外メモリへの書き出しが行われる際に同じ構造が逆参照されています。
このオーバーフローが起こる最初の要件は、コンポーネントの数が 0 であることです。この要件は関数の最初にアサート内でチェックされます。
誤った割り当てに対する必須条件が満たされた場合、OpenJPEG ライブラリのデフォルトのビルドにおいては上記のアサートがフェールします。しかし、Chrome および PDFium のリリース ビルドはバッファ オーバーフローのポイントが到達するこれらのアサートを除外します。Talos は jpeg2000 が埋め込まれた PDF ファイルを作成しました。この jpeg2000 画像に含まれる SIZ マーカーは不完全なものです(SIZマーカーは 0xFF51 で始まります)。SIZ マーカーで指定されたコンポーネントの数が 0 で各コンポーネントの詳細には続いていないため、「opj_j2k_read_siz」内の jpeg ファイルを解析するコードが短縮され、必要とされる、「calloc」への誤コールへと繋がります。有効な jpeg2000 ファイルとこの脆弱性を引き起こすものとの唯一の違いは、SIZ マーカーが 0 コンポーネントを指定していることです。
この脆弱性は、ベンダーによって、問題がある「アサート」に対しエラーを返す「if」ステートメントを推進することで対処されました。
検証されたバージョン:
Talos による今回のテストは、Google Chrome の以下のバージョンに対して行われました。
Google Chrome 50.0.2661.94 および Pdfium の Git バージョン
まとめ:
ユーザは、ネットサーフィン中にしばしば PDF フ ァイルも閲覧するため、攻撃者がこの脆弱性を悪用するのは比較的簡単です。 Talos は Google と協力してこの脆弱性を特定しました(Google bug tracker をご覧ください)。 現在 Google Chrome ブラウザを使用している場合は、最新バージョンであることを確認してください。Google Chrome ブラウザのアップデートは自動的に実行されますが、アップデートを有効にするにはブラウザを手動で再起動する必要があります。
この脆弱性は sids 39161,39162 により検出されました。
最新の関連 Snort ルールの一覧については、Firepower Management Center の FireSight Management Center を参照してください。ゼロデイや脆弱性に関するレポートや情報について、詳しくはこちらをご覧ください。
http://talosintel.com/vulnerability-reports/ のタイムライン:
2016 年 5 月 19 日:バグの報告
2016 年 5 月 19 日:バグの特定
2016 年 5 月 20 日:バグ修正、Chrome にて一般公開
2016 年 5 月 25 日:バグ修正、Chrome 最新安定版 51.0.2704.63 にて配布
2016 年 6 月 8 日:Talos による詳細の発表
本稿は 2016年6月8日に Talos Group のブログに投稿された「VULNERABILITY SPOTLIGHT: PDFIUM VULNERABILITY IN GOOGLE CHROME WEB BROWSER」の抄訳です。