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.