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