PaddingByteInformationDisclosure (Windows-drivrutin CodeQL-fråga)

Översikt

En nyligen allokerad struct eller klass som initieras medlem för medlem kan läcka information om den innehåller fyllnadsbyten.

Rekommendation

Säkerställ att alla fyllnadsbyte i strukturen eller klassen har initierats.

Om möjligt använder du memset för att initiera hela strukturen/klassen.

Exempel

I följande exempel visas ett scenario där utfyllnad mellan de första och andra elementen inte initieras:

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;
}

För att korrigera det initierar vi alla byte med hjälp av 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;
}

Ytterligare information

Den här frågan finns på Microsoft GitHub CodeQL-lagringsplatsen. Mer information om hur Windows Driver-utvecklare kan ladda ner och köra CodeQL finns på sidan CodeQL och testsidan för logotyper av statiska verktyg.