ABV.UNICODE.FAILED_MAP
バッファオーバーフロー - 失敗したマッピング関数で配列インデックスが範囲外
ABV.UNICODE.FAILED_MAP は、MultiByteToWideChar マッピング関数と WideCharToMultiByte マッピング関数の失敗によって引き起こされるバッファオーバーラン状態をチェックします。通常、このチェッカーは、ソースとターゲットのポインターが同じであるか、または変換された文字列を受け取るバッファを指すポインターが NULL であるが、次のパラメーター (バッファサイズ、文字単位) が 0 にセットされていない状態を検出します。
MultiByteToWideChar マッピング関数と WideCharToMultiByte マッピング関数の詳細については、MSDN の Web サイトを参照してください。
脆弱性とリスク
これらのマッピング関数を不適切に使用すると、バッファオーバーフローを引き起こしてアプリケーションのセキュリティが低下する可能性があります。この潜在的な状態を避けるには、バッファが受け取るデータ型に適したバッファサイズを指定することが重要です。
脆弱コード例 1
コピー
int
foo1 (void *src, int size) {
int res;
res = WideCharToMultiByte(CP_ACP, 0, src, -1, 0, 3, 0, 0);
if (res) return res;
res = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, size, 0, 0);
if (res) return res;
return WideCharToMultiByte(CP_ACP, 0, src, -1, 0, 0, 0, 0);
Klocwork は、変換された文字列を受け取るバッファを指すポインターが NULL であるが、4 行目でサイズのバイト数が 0 ではなく 3 に設定されているため、無効なパラメーターをレポートします。この場合は、バッファサイズのパラメーターは変換された文字列のバッファポインターに対応していません。
関連チェッカー
外部参考資料
- CERT ARR00-C: 配列の仕組みを理解する
- CERT ARR30-C: 範囲外のポインターまたは配列添え字を形成したり使用したりしない
- CERT ENV01-C: 環境変数のサイズについて仮定を行わない
- CWE-119: メモリバッファの範囲内の操作の不適切な制限
- CWE-124: バッファアンダーライト ('バッファアンダーフロー')
- CWE-125: 範囲外の読み取り
- CWE-176: ユニコードエンコーディングの不適切な取り扱い
- CWE-787: 範囲外の作成
- CWE-806: ソースバッファのサイズを使用したバッファアクセス
- セキュリティの考慮事項: 国際的な特徴
- STIG-ID:APP3590.1 バッファオーバーフローに脆弱なアプリケーション
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。