C6029
警告 C6029: <function> 的呼叫中可能有緩衝區滿溢: 使用了未經確認的值
這項警告表示某一函式會取得緩衝區,而傳遞之緩衝區的大小是未經確認的。從部分外部來源讀入的資料未經確認其大小是否小於緩衝區的大小。攻擊者可能會刻意指定比預期之大小大很多的值,而這將會導致緩衝區滿溢。
一般而言,每當您從未受信任的外部來源讀取資料時,請確認能驗證資料的有效性。這通常適用於驗證大小,以確認資料的大小會在預期的範圍內。
範例
下列程式碼透過呼叫附註函式 ReadFile 兩次,產生這項警告。在第一次呼叫之後,Post 屬性 (Attribute) Property 會將第二個參數值標示為未受信任。因此,將第二次呼叫中未受信任的值傳遞給 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;
}