Condividi tramite


PaddingByteInformationDisclosure (query codeQL del driver di Windows)

Panoramica

Uno struct o una classe appena allocata che viene inizializzata per membro può perdere informazioni se include byte di riempimento.

Recommendation

Assicurarsi che tutti i byte di riempimento nello struct o nella classe siano inizializzati.

Se possibile, usare memset per inizializzare l'intera struttura/classe.

Esempio

Nell'esempio seguente viene illustrato uno scenario in cui la spaziatura interna tra i primi e i secondi elementi non viene inizializzata:

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

Per correggerlo, inizializzeremo tutti i byte usando 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;
}

Altri dettagli

Questa query è disponibile nel repository CodeQL di Microsoft GitHub. Per informazioni dettagliate sul modo in cui gli sviluppatori di Driver Windows possono scaricare ed eseguire CodeQL, vedere la pagina CodeQL e la pagina Test del logo degli strumenti statici .