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