Partager via


PaddingByteInformationDisclosure (requête CodeQL du pilote Windows)

Vue d’ensemble

Une classe ou un struct nouvellement alloué initialisé membre par membre peut divulguer des informations s’il inclut des octets de remplissage.

Recommandation

Assurez-vous que tous les octets de remplissage dans le struct ou la classe sont initialisés.

Si possible, utilisez memset pour initialiser l’ensemble de la structure/classe.

Exemple

L’exemple suivant illustre un scénario où le remplissage entre le premier et le deuxième élément n’est pas initialisé :

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

Pour le corriger, nous allons initialiser tous les octets à l’aide du 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;
}

Informations supplémentaires

Cette requête se trouve dans le référentiel Microsoft GitHub CodeQL. Consultez la page CodeQL et Static Tools Logo Test pour plus d’informations sur la façon dont les développeurs de pilotes Windows peuvent télécharger et exécuter CodeQL.