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


PaddingByteInformationDisclosure (запрос CodeQL драйвера Windows)

Обзор

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

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

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

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