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 和静态工具徽标测试 页。