山田巧からの情報
脆弱性識別番号:JVN#15205734
脆弱性タイトル:DXライブラリにおいて任意のコードが実行可能な脆弱性
ステータス:該当製品あり
以下の情報は、製品開発者から JVN に提供されたものです。
脆弱性の存在するバージョン
Ver3.13f から Ver3.16b までのバージョン。
脆弱性の内容
該当バージョンでは DrawFormatString や printfDx などの書式指定文字列を引数とする関数で書式指定子 %f や %e で生成される文字列の長さが 1023文字を超えるとバッファオーバーフローが発生します。( そのような状況とは、例えば %.1500f や %.2000e など、有効桁数に 1023 前後以上を指定した場合などです )
また、該当バージョンでは printfDx で2重に書式指定の処理を行ってしまうというバグも存在します。( 例えば printfDx( "%s", "%d" ); を実行すると、"%s" の部分を "%d" に置き換えた後、更に "%d" を整数値の文字列に置き換えようとします )
このバグでは不正なアドレスへのメモリ書き込みは発生しませんが、不正なメモリアドレスへのメモリ読み込みが発生します。
上記二つのバグを利用すると、幾つかの条件が揃うことで任意のコードを実行することができてしまいます。
任意のコードが実行されてしまう条件( 1 ~ 3 の全ての条件を満たしている場合任意のコードが実行されてしまいます )
1.該当バージョンの Unicode版を使用している。
2.VisualStudio2012以降を使用していない、又は VisualStudio2012以降でコンパイルオプションに /GS- リンカオプションに /DYNAMICBASE:NO /NXCOMPAT:NO /SAFESEH:NO を指定し、各種セキュリティ設定を無効にしている。
3.printfDx の引数として任意のコードが実行できるように調整された書式指定子 %e を用いた文字列を渡している。
脆弱性によって発生しうる影響
任意のコードを実行される可能性があります。
脆弱性への対応方法
下記の何れかの方法があります
・DXライブラリ Ver3.16d か、それ以降のバージョンを使用する。
・VisualStudio2012以降を使用し、且つプロジェクトのセキュリティ設定を無効にしない。
・該当バージョンの Unicode版を使用しない。( DXライブラリの一般的な使用方法説明ではマルチバイト版を使用しているので、意図的に Unicode版を使用していなければ本件の脆弱性の影響はありません )
・該当バージョンで printfDx にユーザー入力の文字列を使用しない。