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