Delphi および C++ Builder における VCL Bitmap LoadFromFile の脆弱性について

Abstract: LoadFromFileを使用した VCL BMPファイル処理における潜在的な脆弱性に対し、ソースコードの修正による対応

  2014/10/03 追記

  • 本問題に対する対策を公開したのち、VCL における BMP ファイルの処理の見直しを進めてきました。その結果として、Delphi / C++Builder / RAD Studio XE7およびXE6に対し、VCL における BMP ファイル読み込み処理を改善したホットフィックスをリリースしました。XE6またはXE7ユーザーの方は、こちらのホットフィックス(XE7用 | XE6用)をダウンロードして適用したのち、アプリケーションを再ビルドしてください。
  • それ以前のバージョンを使用している方は、http://support.embarcadero.com/article/44089 に記載された情報に従って対策を実施してください。なお、2014/09/18 に公開された対策箇所は2箇所でしたが、今回の対策では対策箇所が1箇所追加されて3箇所となっている点に注意してください。

VCL内で、不正な形式の BMPファイルを処理する際の潜在的なセキュリティ脆弱性が報告されています。

エンバカデロは、現在、VCLにおける BMPファイルの処理を見直しております。この問題に該当する VCLアプリケーションは以下の修正を行ってください。

  1. Vcl.Graphics.pasを修正します。 (修正手順は以下をご覧ください)
  2. 該当するプロジェクトに修正した Vcl.Graphics.pasを追加します。
  3. C++Builderの場合は [プロジェクト | オプション | パッケージ | 実行時パッケージ ]で「実行時パッケージを使ってリンク」を False(チェックを外す)にします。
  4. アプリケーションを再構築します。

Vcl.Graphics.pas の修正:

  • 変数名とスコープは、製品のバージョンによって多少異なる場合があります。構文と以下のスクリーンショットは XE7のものです。

コード修正 1

  • TMetafile.ReadEMFStream に対し、次のコードを、以下の画面の箇所に追加します。
  if EnhHeader.nBytes < Sizeof(EnhHeader) then
    InvalidMetafile;

Hide image
Click to see full-sized image

コード修正 2

  • TBitMap.ReadDIB に対し、次のコードを、以下の画面の箇所に追加します。
  if (biClrUsed * DIBPalSizes[OS2Format]) > (256 * SizeOf(TRGBQuad)) then
     InvalidGraphic({$IFNDEF CLR}@{$ENDIF}SInvalidBitmap);  

Hide image
Click to see full-sized image