Partilhar via


PaddingByteInformationDisclosure (Consulta CodeQL do Driver do Windows)

Visão geral

Um struct ou classe recém-alocado que é inicializado membro por membro poderá vazar informações se incluir bytes de preenchimento.

Recomendação

Verifique se todos os bytes de preenchimento na classe ou struct foram inicializados.

Se possível, use memset para inicializar toda a estrutura/classe.

Exemplo

O exemplo a seguir mostra um cenário em que o preenchimento entre o primeiro e o segundo elementos não é inicializado:

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

Para corrigi-lo, inicializaremos todos os bytes 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;
}

Additional Details

Essa consulta pode ser encontrada no repositório CodeQL do Microsoft GitHub. Consulte o CodeQL e a página Teste de Logotipo de Ferramentas Estáticas para obter detalhes sobre como os desenvolvedores do Windows Driver podem baixar e executar o CodeQL.