Поделиться через


PaddingByteInformationDisclosure (драйвер Windows CodeQL Query)

Общие сведения

Только что выделенная структуру или класс, инициализированный по члену, может утекать информацию, если она включает байты заполнения.

Рекомендация

Убедитесь, что все байты заполнения в структуре или классе инициализированы.

По возможности используйте 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 и static Tools Logo Test .