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.