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