EN JP CN

ABV.UNICODE.BOUND_MAP

ABV.UNICODE.BOUND_MAP

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

ABV.UNICODE.BOUND_MAP は、MultiByteToWideChar マッピング関数と WideCharToMultiByte マッピング関数によって引き起こされるバッファオーバーラン状態をチェックします。通常、このチェックでは、WideCharToMultiByte がバッファ境界を正しくチェックできずに、バッファオーバーフローが生じる状態を検出します。

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

脆弱性とリスク

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

脆弱コード例

     1  #include "stdafx.h"
     2  #include <string.h>
     3  #include <iostream>
     4  
     5  using namespace std;
     6  
     7  void convert(WCHAR *wcsPath)
     8  {
     9      char cpszPath[5] ="";
    10      WideCharToMultiByte(CP_ACP, 0, wcsPath, -1, cpszPath, 260, 0, 0);
    11      cout << cpszPath << endl;
    12  }
    

Klocwork は 10 行目について、関数 WideCharToMultiByte がバッファ境界を正しくチェックせず、サイズ (260) のバッファ 'cpszPath' をオーバーフローさせる可能性を指摘する、バッファオーバーフローレポートを生成します。この場合は、入力バッファサイズが未検証であることから、関数 WideCharToMultiByte がバッファオーバーフローを引き起こします。

修正コード例

    1  #include "stdafx.h"
    2  #include <string.h>
    3  #include <iostream>
    4  
    5  using namespace std;
    6  
    7  
    8  void convert(WCHAR sText[100]) {
    9      char szTemp[20];
   10      int nSize = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, sText, -1, szTemp, 0, 0, 0);
   11      if (nSize > sizeof(szTemp)) 
   12      {
   13          return;
   14      }else
   15      { 
   16          WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, sText, -1, szTemp, nSize , 0, 0); 
   17      }
   18      cout << szTemp << endl;
   19  }

修正例ではターゲットバッファのサイズがゼロの場合は、関数は、変換に必要なバイト数を返します。入力の文字のサイズは、変換前にバッファサイズと比較されます。

拡張機能

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