C6029
경고 C6029: <function>을(를) 호출할 때 버퍼 오버런이 발생할 수 있습니다. 검사되지 않은 값을 사용했습니다.
이 경고는 버퍼와 크기를 사용하는 함수에서 검사되지 않은 크기를 전달하고 있음을 나타냅니다. 일부 외부 소스에서 읽어온 데이터가 버퍼 크기보다 작은지 여부를 확인하지 않았습니다. 공격자가 의도적으로 예상되는 크기보다 훨씬 큰 크기를 지정하면 버퍼 오버런이 발생할 수 있습니다.
일반적으로 신뢰할 수 없는 외부 소스에서 데이터를 읽을 때는 해당 데이터의 유효성을 검사해야 합니다. 크기를 확인하여 예상 범위 내에 있는지 확인하는 것이 좋습니다.
예제
다음 코드에서는 주석이 표시된 함수 ReadFile를 두 번 호출하여 이 경고를 생성합니다. 첫 번째 호출 후 Post 특성 속성에서는 두 번째 매개 변수 값을 신뢰할 수 없는 것으로 표시합니다. 따라서 다음 코드에서처럼 두 번째 호출에서 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;
}