共用方式為


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;
}

請參閱

概念

附註概觀