Partager via


Gestion de l’emprunt d’identité client dans les pilotes UMDF 1.x

Avertissement

UMDF 2 est la dernière version d’UMDF et remplace UMDF 1. Tous les nouveaux pilotes UMDF doivent être écrits à l’aide d’UMDF 2. Aucune nouvelle fonctionnalité n’est ajoutée à UMDF 1 et la prise en charge d’UMDF 1 est limitée sur les versions plus récentes de Windows 10. Les pilotes Windows universels doivent utiliser UMDF 2.

Les exemples UMDF 1 archivés se trouvent dans la Windows 11, version 22H2 - Mise à jour des exemples de pilotes de mai 2022.

Pour plus d’informations, consultez Prise en main avec UMDF.

Les pilotes UMDF s’exécutent généralement sous le compte LocalService et ne peuvent pas accéder aux fichiers ou aux ressources qui nécessitent des informations d’identification utilisateur, telles que des fichiers protégés ou d’autres ressources protégées. Un pilote UMDF fonctionne généralement sur des commandes et des données qui circulent entre une application cliente et un appareil. Par conséquent, la plupart des pilotes UMDF n’accèdent pas aux ressources protégées.

Toutefois, certains pilotes peuvent nécessiter l’accès à une ressource protégée. Par exemple, un pilote UMDF peut charger le microprogramme dans un appareil à partir d’un fichier fourni par une application cliente. Le fichier peut avoir une liste de contrôle d’accès (ACL) qui empêche les utilisateurs non autorisés de modifier le fichier et de prendre le contrôle de l’appareil. Malheureusement, cette liste de contrôle d’accès empêche également le pilote UMDF d’accéder au fichier.

L’infrastructure fournit une fonctionnalité d’emprunt d’identité qui permet aux pilotes d’emprunter l’identité du client du pilote et d’obtenir les droits d’accès du client aux ressources protégées.

Activation de l'emprunt d'identité

Le package d’installation du pilote UMDF et l’application cliente doivent activer la fonctionnalité d’emprunt d’identité de l’infrastructure, comme suit :

  • Le fichier INF du package d’installation du pilote UMDF doit inclure la directive UmdfImpersonationLevel et définir le niveau maximal autorisé d’emprunt d’identité. L’emprunt d’identité est activé uniquement si le fichier INF inclut la directive UmdfImpersonationLevel . Pour plus d’informations sur la définition du niveau d’emprunt d’identité, consultez Spécification de directives WDF dans les fichiers INF.

  • L’application cliente doit définir le niveau d’emprunt d’identité autorisé pour chaque handle de fichier. L’application utilise les paramètres de qualité de service (QoS) dans la fonction CreateFile Microsoft Win32 pour définir le niveau d’emprunt d’identité autorisé. Pour plus d’informations sur ces paramètres, consultez le paramètre dwFlagsAndAttributes de CreateFile dans la documentation du Kit de développement logiciel (SDK) Windows.

Gestion de l’emprunt d’identité pour une demande d’E/S

Le pilote et l’infrastructure UMDF gèrent l’emprunt d’identité pour une requête d’E/S dans l’ordre suivant :

  1. Le pilote appelle la méthode IWDFIoRequest::Impersonate pour spécifier le niveau d’emprunt d’identité requis et une fonction de rappel IImpersonateCallback::OnImpersonate .

  2. L’infrastructure vérifie le niveau d’emprunt d’identité demandé. Si le niveau demandé est supérieur au niveau autorisé par le package d’installation du pilote UMDF et l’application cliente, la demande d’emprunt d’identité échoue. Sinon, l’infrastructure emprunte l’identité du client et appelle immédiatement la fonction de rappel OnImpersonate .

La fonction de rappel OnImpersonate doit effectuer uniquement les opérations qui nécessitent le niveau d’emprunt d’identité demandé, comme l’ouverture d’un fichier protégé.

UMDF n’autorise pas la fonction de rappel OnImpersonate d’un pilote à appeler les méthodes d’objet du framework. Cela garantit que le pilote n’expose pas le niveau d’emprunt d’identité à d’autres fonctions de rappel du pilote ou à d’autres pilotes.

Note Dans les versions 1.0 à 1.7 d’UMDF, IWDFIoRequest::Impersonate accorde le niveau d’emprunt d’identité le plus élevé autorisé par l’application cliente et le fichier INF, même si le niveau d’emprunt d’identité demandé par le pilote est inférieur. Dans UMDF versions 1.9 et ultérieures, la méthode Impersonate accorde uniquement le niveau d’emprunt d’identité demandé par le pilote.

Transmission des informations d’identification dans la pile des pilotes

Lorsque votre pilote reçoit une requête d’E/S de type WdfRequestCreate, il peut transférer la demande d’E/S vers la pile des pilotes vers un pilote en mode noyau. Les pilotes en mode noyau n’ont pas la capacité d’emprunt d’identité qu’IWDFIoRequest::Impersonate fournit aux pilotes basés sur UMDF.

Par conséquent, si vous souhaitez qu’un pilote en mode noyau reçoive les informations d’identification utilisateur du client (plutôt les informations d’identification du processus hôte du pilote), le pilote doit définir l’indicateur WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT lorsqu’il appelle IWDFIoRequest::Send pour envoyer la demande de création à la cible d’E/S. La méthode Send retourne un code d’erreur si la tentative d’emprunt d’identité échoue, sauf si le pilote définit également l’indicateur WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE .

Le pilote n’a pas besoin d’appeler IWDFIoRequest::Impersonate avant d’envoyer la demande à la cible d’E/S.

Si les pilotes de niveau inférieur transfèrent également la demande, le niveau d’emprunt d’identité du client descend dans la pile des pilotes.

Réduction des menaces de sécurité

Pour réduire le risque d’une attaque « élévation de privilèges », vous devez :

  • Essayez d’éviter d’utiliser l’emprunt d’identité.

    Par exemple, pour éviter d’utiliser l’emprunt d’identité pour ouvrir un fichier que le pilote doit utiliser, l’application cliente peut ouvrir le fichier et utiliser des opérations d’E/S pour envoyer le contenu du fichier au pilote.

  • Utilisez le niveau d’emprunt d’identité le plus bas requis par votre pilote.

    Définissez le niveau d’emprunt d’identité dans le fichier INF de votre pilote aussi bas que possible. Si votre pilote ne nécessite aucune emprunt d’identité, n’incluez pas la directive UmdfImpersonationLevel dans le fichier INF.

  • Réduisez les possibilités pour un attaquant d’exploiter votre pilote.

    Votre fonction de rappel OnImpersonate doit contenir une petite section de code qui effectue uniquement l’opération qui nécessite l’emprunt d’identité. Par exemple, si votre pilote accède à un fichier protégé, il ne nécessite l’emprunt d’identité que lorsqu’il ouvre le handle de fichier. Il ne nécessite pas d’emprunt d’identité pour lire ou écrire dans le fichier.