Compartilhar via


PaddingByteInformationDisclosure (Consulta CodeQL de driver do Windows)

Visão geral

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

Recomendação

Verifique se todos os bytes de preenchimento em estruturas ou classes são inicializados.

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

Exemplo

O exemplo a seguir mostra um cenário em que o preenchimento entre o primeiro e o segundo elemento 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 o 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;
}

Detalhes adicionais

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