다음을 통해 공유


PaddingByteInformationDisclosure(Windows 드라이버 CodeQL 쿼리)

개요

멤버별로 초기화된 새로 할당된 구조체 또는 클래스는 패딩 바이트가 포함된 경우 정보를 누수할 수 있습니다.

권장

구조체 또는 클래스의 모든 패딩 바이트가 초기화되었는지 확인합니다.

가능하면 memset 을 사용하여 전체 구조/클래스를 초기화합니다.

예제

다음 예제에서는 첫 번째 요소와 두 번째 요소 간의 안쪽 여백이 초기화되지 않는 시나리오를 보여 있습니다.

typedef enum { Unknown = 0, Known = 1, Other = 2 } MyStructType;
struct MyStruct { MyStructType type; UINT64 id; };
MyStruct testReturn() 
{
	// BAD: Padding between the first and second elements not initialized.
	MyStruct myBadStackStruct = { Unknown };
	return myBadStackStruct;
}

이를 수정하기 위해 memset를 사용하여 모든 바이트를 초기화합니다.

typedef enum { Unknown = 0, Known = 1, Other = 2 } MyStructType;
struct MyStruct { MyStructType type; UINT64 id; };
MyStruct testReturn()
{
	// GOOD: All padding bytes initialized
	MyStruct* myGoodHeapStruct = (struct MyStruct*)malloc(sizeof(struct MyStruct));
	memset(myGoodHeapStruct, 0, sizeof(struct MyStruct));
	return *myGoodHeapStruct;
}

추가 정보

이 쿼리는 Microsoft GitHub CodeQL 리포지토리에서 찾을 수 있습니다. Windows 드라이버 개발자가 CodeQL을 다운로드하고 실행하는 방법에 대한 자세한 내용은 CodeQL 및 정적 도구 로고 테스트 페이지를 참조하세요.