C6029
warning C6029: possible buffer overrun in call to <function>: use of unchecked value
この警告は、バッファーとサイズを指定する関数に対し、未チェックのサイズを渡そうとしていることを示します。外部ソースから読み取られるデータに対し、バッファー サイズを下回っているかどうかの検査が行われていません。予期されているサイズよりもずっと大きな値を攻撃者が意図的に指定して、バッファー オーバーランを起こす可能性があります。
一般に、信頼されていない外部ソースからデータを読み取る場合は必ず有効性を確認するようにします。サイズが予期されている範囲に収まっているかどうかを確認するのは大抵適切です。
使用例
次のコードでは、注釈付きの関数 ReadFile を 2 回呼び出すことによって、この警告が生成されます。最初の呼び出しの後、Post 属性プロパティが 2 番目のパラメーター値に信頼できないというマークを付けます。したがって、次のコードに示すとおり、信頼できない値を 2 回目の ReadFile の呼び出しに渡すことにより、この警告が生成されます。
#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;
}