更新 : 2007 年 11 月
警告 C6029: <関数> への呼び出しにバッファ オーバーランが発生した可能性があります: 未確認の値を使用しています。
この警告は、バッファおよびサイズを受け取る関数に未確認のサイズが渡されることを示します。外部ソースから読み込むデータのサイズがバッファ サイズより小さいかどうか確認されていません。攻撃者は、予想サイズよりもはるかに大きい値を内部的に指定する場合があります。その結果、バッファ オーバーランが引き起こされます。
一般的に、信頼関係のない外部ソースからデータを読み込む場合は、常にデータの有効性を確認してください。サイズが予想される範囲内であることを確認することは適切な方法です。
使用例
次のコード例は、注釈付き関数 ReadFile を 2 回呼び出しているため、この警告が発生します。最初の呼び出しの後で、Post 属性プロパティは、2 番目のパラメータ値に信頼関係がないというマークを付けます。したがって、次のコードに示すように、ReadFile の 2 番目の呼び出しで信頼関係のない値が渡されて、この警告が生成されます。
#include "windows.h"
void f(char *buff, DWORD cbLen, DWORD cbRead, HANDLE hFile)
{
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
// code ...
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL)) // warning 6029
{
// code ...
}
}
}
この警告を解決するには、次のコードに示すようにバッファ サイズを確認します。
void f(char *buff, DWORD cbLen, DWORD cbRead, HANDLE hFile)
{
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
// code ...
if (cbLen <= sizeof (buff)) // check length
{
// code ...
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL))
{
// code ...
}
}
}
}