DXライブラリの脆弱性情報


最新バージョン( Ver3.17c )で判明している脆弱性

 2017年2月26日時点では最新バージョン( Ver3.17c )で判明している脆弱性はありません。


旧バージョンでの脆弱性

 printfDx の2重に行われる書式指定処理の脆弱性

  対象バージョン

   Ver3.13f から Ver3.16b までのバージョン。

  脆弱性の内容

    該当のバージョンでは printfDx で2重に書式指定の処理を行ってしまうというバグが存在します。( 例えば printfDx( "%s", "%d" ); を
   実行すると、"%s" の部分を "%d" に置き換えた後、更に "%d" を整数値の文字列に置き換えようとします )

    また、該当バージョンでは DrawFormatString や printfDx などの書式指定文字列を引数とする関数で、書式指定子 %f や %e で生成される文字列の長さが
   1023文字を超えるとバッファオーバーフローが発生するというバグも存在します。( そのような状況とは、例えば %.1500f や %.2000e など、
   有効桁数に 1023 前後以上を指定した場合などです )

    このバッファオーバーフローバグを利用した任意のコードの実行には、書式指定子 %e を含んだかなり調整された文字列を「書式指定文字列」
   として DrawFormatString などの書式指定文字列を引数とする関数に渡す必要があり、一般的にはユーザー入力の文字列を「書式指定文字列」として
   関数に渡すことは無いので書式指定子 %e のバグを利用した任意のコードの実行は本来は困難なのですが、printfDx の2重に行われる書式指定処理のバグが
   存在することで「ユーザー入力の文字列を書式指定文字列として処理する」状態が発生し、攻撃が可能となってしまっています。

   任意のコードを実行するための条件( 1 〜 3 の全ての条件を満たしている場合、本件の脆弱性を利用した任意のコードの実行ができます )

     1.該当バージョンの Unicode版を使用している。

     2.VisualStudio2012以降を使用していない、又は VisualStudio2012以降でコンパイルオプションに /GS- リンカオプションに
      /DYNAMICBASE:NO /NXCOMPAT:NO /SAFESEH:NO を指定し、各種セキュリティ設定を無効にしている。

     3.DrawFormatString や printfDx などの書式指定文字列を引数とする関数の引数として任意のコードが実行できるように調整された
      書式指定子 %e を用いた文字列を渡している。

  脆弱性によって発生しうる影響

    任意のコードを実行される可能性があります。

  脆弱性の影響が発生しうる例

    例えばユーザーからの入力( ユーザーが用意するファイルからのデータ読み込み、ネットワーク通信など )で得られた文字列を printfDx の
   引数として渡している場合、2重に行われてしまう書式指定処理のバグと書式指定子 %e のバッファオーバーフローのバグを利用して
   任意のコードの実行が行えてしまいます。

    但し、DXライブラリの Unicodeバージョンを使用していない場合や、VisualStudio2012以降を使用していて且つセキュリティ設定を
   無効にしていない場合、又はユーザーが用意したファイルを読み込んで得られた文字列などを printfDx の引数として使用していなければ
   この脆弱性を利用した任意のコードの実行をすることはできません。

  脆弱性への対応方法

    下記の何れかの方法があります

   ・DXライブラリ Ver3.16d 以降のバージョンを使用する。

   ・VisualStudio2012以降を使用し、且つプロジェクトのセキュリティ設定を無効にしない。

   ・該当バージョンの Unicode版を使用しない。( DXライブラリの一般的な使用方法説明ではマルチバイトバージョンを使用しているので、
    意図的に Unicodeバージョンを使用していなければ本件の脆弱性の影響はありません )

   ・該当のバージョンでは printfDx にユーザー入力の文字列を使用しない。

  JVNに掲載された本件に関する情報へのリンク

   JVN#15205734「DXライブラリにおいて任意のコードが実行可能な脆弱性」


  謝辞

    本脆弱性を届出していただいた北川 智也様、ならびに情報提供していただいた IPA様、JPCERT/CC様、ありがとうございます。




 バッファオーバーフローの脆弱性

  対象バージョン

   Ver3.15eと、それ以前のバージョン。

  脆弱性の内容

    DrawFormatString や printfDx などの書式指定文字列を引数とする関数で、書式に基づいて生成される文字列の長さが 1023文字( 関数によっては 2047文字 )を
   超えるとバッファオーバーフローが発生します。
    スタック領域に対するメモリの不正なアクセスが発生してしまうので、引数として渡すデータを工夫することで任意のコードが実行できてしまいます。

  脆弱性によって発生しうる影響

    任意のコードを実行される可能性があります。

  脆弱性の影響が発生しうる例

    例えばユーザーからの入力( キーボードからの文字列入力、ユーザーが用意するファイルからのデータ読み込み、ネットワーク通信など )で得られた文字列を
   DrawFormatString や printfDx などの書式指定文字列を引数とする関数に渡している場合( 且つ、文字列の長さの制限などを行っていない場合、
   文字列の長さの制限を行っていても DrawFormatString などの関数の中で生成される文字列の長さが 1023文字( 関数によっては 2047文字 )を超える場合 )、
   バッファオーバーフローを利用した任意のコードの実行が行えてしまいます。

    逆にユーザーからのキーボードなどによる文字列入力や、ユーザーが用意したファイルを読み込んで得られた文字列などを最終的に DrawFormatString 等の
   書式指定文字列を使用する関数で一切使用していなければ、この脆弱性を利用して任意のコードを実行することはできません。

  脆弱性への対応方法

    下記の何れかの方法で脆弱性の影響を回避できます。

   ・DXライブラリ Ver3.16 か、それ以降のバージョンを使用する。

   ・DXライブラリ Ver3.16 より前のバージョンでは、DrawFormatString や printfDx などの書式指定文字列を引数とする関数を使用しない。
    ( 若しくは書式に基づいて生成される文字列が1023文字を超えないことを保証する処理を追加する )

   ・DXライブラリ Ver3.16 より前のバージョンでは、ユーザー入力の文字列を使用しない。

  JVNに掲載された本件に関する情報へのリンク

   JVN#49476817「DXライブラリにおけるバッファオーバーフローの脆弱性」


  謝辞

    本脆弱性を届出していただいた北川 智也様、ならびに情報提供していただいた IPA様、JPCERT/CC様、ありがとうございます。


戻る