Udostępnij przez


PaddingByteInformationDisclosure (zapytanie CodeQL dla sterownika systemu Windows)

Przegląd

Nowo przypisana struktura lub klasa, która jest inicjowana człon po członie, może wyciekać informacje, jeśli zawiera ono bajty wypełnienia.

Rekomendacja

Upewnij się, że wszystkie bajty wypełnienia w strukturze lub klasie są zainicjowane.

Jeśli to możliwe, użyj memset, aby zainicjować całą strukturę/klasę.

Przykład

W poniższym przykładzie pokazano scenariusz, w którym padding między pierwszym a drugim elementem nie jest zainicjalizowany.

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

Aby rozwiązać ten problem, zainicjujemy wszystkie bajty za pomocą 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;
}

Dodatkowe szczegóły

To zapytanie można znaleźć w repozytorium Microsoft GitHub CodeQL. Zobacz stronę CodeQL i Static Tools Logo Test, aby uzyskać szczegółowe informacje na temat pobierania i uruchamiania CodeQL przez programistów sterowników systemu Windows.