EN JP CN

ABV.UNICODE.FAILED_MAP

ABV.UNICODE.FAILED_MAP

バッファ オーバーフロー - 失敗したマッピング関数で配列インデックスが範囲外

ABV.UNICODE.FAILED_MAP は、MultiByteToWideChar マッピング関数と WideCharToMultiByte マッピング関数の失敗によって引き起こされるバッファオーバーラン状態をチェックします。通常、このチェッカーは、ソースとターゲットのポインターが同じであるか、または変換された文字列を受け取るバッファを指すポインターが NULL であるが、次のパラメーター (バッファサイズ、文字単位) が 0 にセットされていない状態を検出します。

MultiByteToWideChar マッピング関数と WideCharToMultiByte マッピング関数の詳細については、MSDN の Web サイトを参照してください。

脆弱性とリスク

これらのマッピング関数を不適切に使用すると、バッファオーバーフローを引き起こしてアプリケーションのセキュリティが低下する可能性があります。この潜在的な状態を避けるには、バッファが受け取るデータ型に適したバッファサイズを指定することが重要です。

脆弱コード例 1

1  int
2  foo1 (void *src, int size) {
3    int res;
4    res = WideCharToMultiByte(CP_ACP, 0, src, -1, 0, 3, 0, 0);
5    if (res) return res;
6    res = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, size, 0, 0);
7    if (res) return res;
8    return WideCharToMultiByte(CP_ACP, 0, src, -1, 0, 0, 0, 0);

Klocwork は、変換された文字列を受け取るバッファを指すポインターが NULL であるが、4 行目でサイズのバイト数が 0 ではなく 3 に設定されているため、無効なパラメーターをレポートします。この場合は、バッファサイズのパラメーターは変換された文字列のバッファポインターに対応していません。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。