Vérifications de sécurité du vérificateur de pilotes

L’option Vérifications de sécurité de Driver Verifier surveille le pilote pour les erreurs courantes qui peuvent entraîner des vulnérabilités de sécurité. Cette option est disponible à partir de Windows Vista.

Plus précisément, l’option Vérifications de sécurité recherche le comportement incorrect suivant :

  • Appel de routines zwXxx du noyau avec des adresses en mode utilisateur en tant que paramètres. Lorsque le pilote appelle des routines ZwXxx , Driver Verifier vérifie qu’aucun des paramètres n’est une adresse en mode utilisateur. Lors de l’appel d’une routine ZwXxx , la KPROCESSOR_MODE actuelle devient KernelMode et tous les paramètres passés à cette routine sont traités comme s’il s’agit d’adresses en mode noyau. Par conséquent, le pilote doit sonder les mémoires tampons en mode utilisateur reçues des applications et les placer dans la mémoire en mode noyau (par exemple, dans un bloc de pool ou une structure de données alloués sur la pile du noyau) avant d’appeler la routine ZwXxx du noyau. Le pilote doit utiliser la mémoire tampon capturée plutôt que la mémoire tampon en mode utilisateur comme paramètre de la routine ZwXxx .

  • Appel de routines zwXxx du noyau avec des UNICODE_STRINGs mal formés en tant que paramètres. Lorsque le pilote appelle une routine ZwXxx , Driver Verifier vérifie tous les paramètres qui sont UNICODE_STRING valeurs. Les erreurs courantes détectées par driver Verifier dans ces chaînes sont les suivantes :

    • Le champ de mémoire tampon pointe vers la mémoire en mode utilisateur.
    • Les paramètres Length ou MaximumLength sont incorrects. Par exemple, MaximumLength<Length. Ou l’une de ces valeurs ou les deux est un nombre impair. Ces deux valeurs doivent toujours être égales, car elles représentent le nombre d’octets utilisés pour représenter une chaîne Unicode.
  • Appel de routines zwXxx du noyau avec une structure de OBJECT_ATTRIBUTES incorrecte en tant que paramètre. Lorsque le pilote appelle une routine ZwXxx , driver verifier vérifie tous les paramètres qui sont OBJECT_ATTRIBUTE structures. Les membres de chaque paramètre de structure OBJECT_ATTRIBUTE sont soumis aux mêmes vérifications pour les adresses en mode utilisateur et les valeurs UNICODE_STRING décrites ci-dessus.

  • Paramètres Irp-RequestorMode> et demande d’E/S incohérents. Chaque fois que Irp-> RequestorMode est défini sur KernelMode, driver Verifier vérifie qu’aucun paramètre de demande d’E/S, Irp-AssociatedIrp.SystemBuffer> ou Irp-UserBuffer>, ne sont des adresses en mode utilisateur.

À compter de Windows 7, lorsque vous activez une option Driver Verifier, Driver Verifier recherche le comportement de pilote suivant :

Le compteur de référence d’objet passe de 0 à 1. Lorsque le gestionnaire d’objets du noyau Windows crée un objet, tel qu’un objet File ou un objet Thread, le compteur de référence du nouvel objet est défini sur 1. Les appels aux fonctions système telles que ObReferenceObjectByPointer ou ObReferenceObjectByHandle incrémentent le compteur de référence. Chaque appel à ObDereferenceObject pour le même objet décrémente le compteur de référence.

Une fois que le compteur de référence atteint la valeur 0, l’objet devient éligible pour être libéré. Le gestionnaire d’objets peut le libérer immédiatement ou le libérer ultérieurement. Driver Verifier recherche les appels suivants à ObReferenceObjectByPointer et ObReferenceObject pour le même objet. Ces appels modifient le compteur de référence de 0 à 1, ce qui signifie que le pilote a incrémenté le compteur de référence d’un objet déjà libéré. Cette erreur est toujours incorrecte, car elle peut endommager d’autres allocations de mémoire.

Activation de cette option

Vous pouvez activer l’option Vérifications de sécurité pour un ou plusieurs pilotes à l’aide du Gestionnaire du vérificateur de pilotes ou de la ligne de commande Verifier.exe. Pour plus d’informations, consultez Sélection des options du vérificateur de pilote.

  • Utilisation de la ligne de commande

    Sur la ligne de commande, l’option Vérifications de sécurité est représentée par bit 8 (0x100). Pour activer les vérifications de sécurité, utilisez une valeur d’indicateur de 0x100 ou ajoutez 0x100 à la valeur de l’indicateur. Par exemple :

    verifier /flags 0x100 /driver MyDriver.sys
    

    L’option sera active après le redémarrage de l’ordinateur.

    À compter de Windows Vista, vous pouvez également activer et désactiver les vérifications de sécurité sans redémarrer l’ordinateur en ajoutant le paramètre /volatile à la commande. Par exemple :

    verifier /volatile /flags 0x100 /adddriver MyDriver.sys
    

    Ce paramètre prend effet immédiatement, mais est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation de paramètres volatiles.

    L’option Vérifications de sécurité est également incluse dans les paramètres standard. Par exemple :

    verifier /standard /driver MyDriver.sys
    
  • Utilisation du Gestionnaire de vérificateur de pilotes

    1. Démarrez le Gestionnaire de vérificateur de pilotes. Tapez Vérificateur dans une fenêtre d’invite de commandes.
    2. Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis cliquez sur Suivant.
    3. Sélectionnez Sélectionner des paramètres individuels dans une liste complète.
    4. Sélectionnez Vérifications de sécurité.

    La fonctionnalité Vérifications de sécurité est également incluse dans les paramètres standard. Pour utiliser cette fonctionnalité dans le Gestionnaire du vérificateur de pilotes, cliquez sur Créer des paramètres standard.