Partager via


Tests d’intrusion (Principes de base de l’appareil)

Les tests d’intrusion De base de l’appareil effectuent différentes formes d’attaques d’entrée, qui sont un composant essentiel des tests de sécurité. Les tests d’attaque et de pénétration peuvent aider à identifier les vulnérabilités dans les interfaces logicielles.

Pénétration

Les tests d’intrusion incluent deux catégories de tests : les tests Fuzz et les tests D’E/S Spy et d’attaque d’E/S . Les tests Fuzz étaient également une fonctionnalité de l’outil de test Device Path Exceriser .

Test Description

Désactiver l’espion d’E/S

Désactiver l’espion des E/S sur 1 ou plusieurs appareils.

Binaire de test : Devfund_IOSpy_DisableSupport.wsc

Méthode de test : DisableIoSpy

Paramètres : - consultez Paramètres de test de base de l’appareil

DQ

Afficher l’appareil pour espion d’E/S

Affichez les appareils sur ant l’espion d’E/S .

Binaire de test : Devfund_IOSpy_DisplayEnabledDevices.wsc

Méthode de test : DisplayIoSpyDevices

Activer L’espion d’E/S

Activez L’espion des E/S sur un ou plusieurs appareils.

Binaire de test : Devfund_IOSpy_EnableSupport.wsc

Méthode de test : EnableIoSpy

Paramètres : - consultez Paramètres de test de base de l’appareil

DQ

DFD : spécifie le chemin d’accès au fichier de données IoSpy. L’emplacement par défaut est %SystemDrive%\DriverTest\IoSpy

Test de l’API Fuzz Misc

Les tests de l’API Fuzz Misc sont des tests qui déterminent si le pilote peut gérer une variété d’appels courants à partir de pilotes en mode noyau.

Les tests incluent les tests suivants :

  • Appelle ZwReadFile et ZwWriteFile, en spécifiant des pointeurs de mémoire tampon de données valides, des longueurs variables (y compris zéro) et des décalages d’octets variables, y compris les décalages d’octets zéro, -1 et 64 bits.

  • Appels pour annuler I/0 et vider les tampons.

  • Série d’appels de requêtes d’annuaire utilisant des classes d’informations de fichier courantes avec des pointeurs de mémoire tampon de données utilisateur valides et des longueurs de mémoire tampon variables (y compris zéro).

  • Appels de requête d’annuaire similaires à ceux émis par les programmes s’exécutant sous contrôle de la machine DOS virtuelle (VDM).

  • Appelle pour récupérer les attributs étendus d’un fichier dont les tailles et longueurs de mémoire tampon varient.

  • Appelle pour créer et fermer des objets de section, avec différents attributs de protection de page de section et d’allocation de section (section validée, section fichier image).

  • Appels pour verrouiller et déverrouiller des fichiers.

  • Appelle pour récupérer des entrées de quota pour un volume.

  • Test d’attributs de fichier, une série de requêtes d’attribut de fichier avec des pointeurs valides vers une structure ObjectAttributes .

    Le test d’attributs de fichier comporte un test de longueur zéro facultatif. Lors de la récupération des attributs étendus d’un fichier, le test Fuzz réussit une requête vide (de longueur nulle) et une adresse de mémoire tampon non valide au pilote.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthode de test : DoMiscAPITest

Paramètres : - consultez Paramètres de test de base de l’appareil

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

API Fuzz Misc avec test de requête de longueur nulle

Ce test effectue les mêmes tests que le test de l’API Fuzz Misc et transmet cette fois une requête vide (de longueur nulle) et une adresse de mémoire tampon non valide au pilote lors de la tentative de récupération des attributs étendus d’un fichier.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthode de test : DoMiscAPIWithZeroLengthTest

Paramètres : - consultez Paramètres de test de base de l’appareil

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz open and close test

Ce test effectue des milliers de séquences create-open-close.

Pour plus d’informations sur ce test, consultez À propos du test Fuzz open and close.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthode de test : DoOpenCloseTest

Paramètres : - consultez Paramètres de test de base de l’appareil

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test Fuzz Query and Set File Information

Ces problèmes de test appellent pour récupérer et modifier les informations d’objet, de fichier et de volume des appareils.

Pendant le test d’informations sur les fichiers de requête et de définition, le problème de test Fuzz appelle pour récupérer et modifier les informations d’objet, de fichier et de volume des appareils ouverts par les opérations ouvertes de base et d’autres opérations ouvertes, y compris les opérations effectuées par le test de sous-ouverture Fuzz.

Le test Fuzz émet chaque appel de requête ou de jeu au moins 1 024 fois avec une mémoire tampon valide et une variété de longueurs de mémoire tampon et de classes d’informations de fichier. Une requête de chaque type est également envoyée avec un pointeur de mémoire tampon non valide et une longueur de mémoire tampon nulle.

Si vous utilisez le paramètre ChangeBufferProtectionFlags , qui définit l’option de protection, le test Fuzz varie le paramètre de sécurité sur la mémoire tampon dans chaque requête et appel défini.

Ce test effectue également le test Fuzz Sub-opens.

Ce test utilise les fonctions ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFile et ZwSetVolumeInformationFile .

Binaire de test : Devfund_DevicePathExerciser.dll

Méthode de test : DoQueryAndSetFileInformationTest

Paramètres : - consultez Paramètres de test de base de l’appareil

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test Fuzz Query and Set Security

Ce test pose des appels pour récupérer le descripteur de sécurité et modifier l’état de sécurité des appareils.

Pendant le test de sécurité de requête et de définition, le test Fuzz émet des appels pour récupérer le descripteur de sécurité et modifier l’état de sécurité des appareils ouverts par les opérations ouvertes de base et d’autres opérations ouvertes, y compris les opérations effectuées par le test de sous-ouverture fuzz.

le test Fuzz émet chaque appel de requête ou d’ensemble au moins 1 024 fois avec une mémoire tampon valide et une variété de longueurs de mémoire tampon et de types d’informations de sécurité (OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION et aucun type d’information). Une requête de chaque type est également envoyée avec un pointeur de mémoire tampon non valide et une longueur de mémoire tampon nulle.

Si vous utilisez le paramètre ChangeBufferProtectionFlags , qui définit l’option de protection, le test Fuzz varie le paramètre de sécurité sur la mémoire tampon dans chaque requête et appel défini.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthode de test : DoQueryAndSetSecurityTest

Paramètres : - consultez Paramètres de test de base de l’appareil

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Random FSCTL test / Fuzz Random IOCTL test

Ce test émet une série d’appels à la fonction DeviceIoControl avec des codes de fonction, des types d’appareils, des méthodes de transfert de données et des exigences d’accès qui sont sélectionnés au hasard à partir d’une plage de valeurs spécifiée. Les appels incluent des mémoires tampons d’entrée et de sortie avec des pointeurs et des longueurs de mémoire tampon valides et non valides, ainsi que du contenu généré de manière aléatoire.

Pendant les tests aléatoires, le test Fuzz émet une série d’appels à la fonction DeviceIoControl avec des codes de fonction, des types d’appareils, des méthodes de transfert de données et des exigences d’accès qui sont sélectionnés au hasard à partir d’une plage de valeurs spécifiée. Les appels incluent des mémoires tampons d’entrée et de sortie avec des pointeurs et des longueurs de mémoire tampon valides et non valides, ainsi que du contenu généré de manière aléatoire.

Le test Fuzz effectue les tests aléatoires sur tous les appareils ouverts pendant les opérations d’ouverture de base et d’autres tests ouverts. Vous pouvez personnaliser ce test à l’aide des paramètres suivants :

  • Utilisez MinFunctionCode et MaxFunctionCode pour spécifier la plage de codes de fonction IOCTL ou FSCTL utilisés dans les appels

  • Utilisez MinDeviceType et MaxDeviceType pour spécifier la plage de types d’appareils utilisés dans les appels

  • Utilisez SeedNumber pour spécifier un numéro de départ pour la routine de génération de nombres aléatoires.

La fonction utilisée par le test Fuzz pour générer des nombres aléatoires pour le test utilise un nombre initial, un nombre de départ pour l’algorithme de génération de nombres aléatoires. Pour reproduire les conditions de test, utilisez le paramètre de numéro de départ pour spécifier le numéro de départ utilisé dans l’essai d’origine.

Un test aléatoire personnalisé est inclus dans le cadre du test aléatoire. Le test aléatoire personnalisé utilise les résultats du test aléatoire pour examiner plus en détail la réponse des conducteurs aux demandes IOCTL ou FSCTL. Les sondes de test aléatoire personnalisées ont manqué le test aléatoire et celles sur lesquelles le conducteur n’a pas répondu comme prévu en fonction des status retournées par les appels de test aléatoires.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthodes de test : DoRandomIOCTLTest, DoRandomFSCTLTest

Paramètres : - consultez Paramètres de test de base de l’appareil

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Sub-ouvre le test

Le test effectue une série rapide d’appels pour ouvrir des objets dans l’espace de noms de l’appareil. Dans ces appels, il passe un chemin qui commence par l’appareil et inclut des noms arbitraires et des chaînes non sens de longueur et de contenu variables.

Au cours d’un test ouvert relatif (également appelé test de sous-ouverture), le test Fuzz tente d’ouvrir des objets dans l’espace de noms de l’appareil.

Pendant ce test, le test Fuzz effectue une série rapide d’appels à des objets ouverts dans l’espace de noms des appareils ouverts à l’aide des opérations d’ouverture de base et d’autres opérations d’ouverture. Dans ces appels, le test Fuzz réussit un chemin qui commence par l’appareil et inclut des noms arbitraires et des chaînes non sensiques de longueur et de contenu variables.

Ce test détermine comment le pilote ou le système de fichiers gère les requêtes ouvertes dans son espace de noms. En particulier, si le pilote ne prend pas en charge les requêtes ouvertes dans son espace de noms, il doit empêcher l’accès non autorisé, soit en échouant les demandes, soit en définissant la caractéristique d’appareil FILE_DEVICE_SECURE_OPEN lorsqu’il utilise IoCreateDevice ou IoCreateDeviceSecure pour créer l’objet d’appareil.

Pour plus d’informations sur l’espace de noms d’un appareil, consultez Contrôle de l’accès à l’espace de noms de l’appareil.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthode de test : DoSubOpensTest

Paramètres : - consultez Paramètres de test de base de l’appareil

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Sub-ouvre avec le test Streams

Ce test tente d’ouvrir une variété de flux de données nommés sur l’appareil. Le test utilise une série de noms de flux arbitraires avec du contenu et des caractères qui peuvent être valides pour d’autres utilisations sur certains appareils.

Pendant le test stream, le test Fuzz tente d’ouvrir une variété de flux de données nommés sur l’appareil. Les tests utilisent une série de noms de flux arbitraires avec du contenu et des caractères qui peuvent être valides pour d’autres utilisations sur certains appareils. Ce test détermine si le pilote peut gérer correctement les demandes de flux de données, en particulier si le pilote exporte un appareil qui ne prend pas en charge ou n’anticipe pas les flux de données.

Un flux de données nommé est un attribut d’un objet file. Vous spécifiez un flux de données nommé en écrivant le nom du fichier, un signe deux-points et le nom du flux de données, par exemple , « File01.txt:AccessDate » où AccessDate est un flux de données nommé, c’est-à-dire un attribut du fichier File01.txt.

Le test Fuzz enregistre les noms de flux utilisés dans le test.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthode de test : DoSubOpensWithStreamsTest

Paramètres : - consultez Paramètres de test de base de l’appareil

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test FUzz Zero-Length Buffer FSCTL / Test Fuzz Zero-Length Buffer IOCTL

Ce test émet une série d’appels à la fonction DeviceIoControl avec une longueur de mémoire tampon d’entrée et/ou de sortie de 0. Le test génère différents codes de contrôle du système de fichiers à l’aide de différents codes de fonction, types d’appareils, méthodes de transfert de données et exigences d’accès.

Pendant le test de la mémoire tampon Zero-Length, le test Fuzz émet une série d’appels à la fonction DeviceIoControl avec des longueurs de mémoire tampon d’entrée et/ou de sortie de 0. Le test génère différents codes de contrôle d’E/S à l’aide de différents codes de fonction, types d’appareils, méthodes de transfert de données et exigences d’accès. Pour plus d’informations sur le contenu des codes de contrôle d’E/S, consultez Définition de codes de contrôle d’E/S.

Pour tester la gestion par le pilote des pointeurs de mémoire tampon non valides, les pointeurs de mémoire tampon dans ces appels en mode utilisateur spécifient des adresses élevées dans l’espace d’adressage virtuel du noyau, comme 0xFFFFFC00).

Le test Fuzz effectue le test Zero-Length Buffer sur tous les appareils ouverts pendant les tests ouverts de base et supplémentaires. Vous pouvez personnaliser ce test à l’aide des paramètres de commande MinFunctionCode et MaxFunctionCode pour spécifier la plage de codes de fonction IOCTL ou FSCTL utilisés dans les appels et MinDeviceType et MaxDeviceType pour spécifier la plage de types d’appareils utilisés dans les appels.

Binaire de test : Devfund_DevicePathExerciser.dll

Méthodes de test : DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest

Paramètres : - consultez Paramètres de test de base de l’appareil

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Exécuter une attaque d’E/S

Exécute une attaque d’E/S sur le ou les appareils spécifiés.

Binaire de test : Devfund_IOAttack_DeleteDataFile.wsc

Méthode de test : RunIoAttack

Paramètres : - consultez Paramètres de test de base de l’appareil

DQ

À propos du test Fuzz open and close

Le test Fuzz open and close utilise plusieurs méthodes différentes pour ouvrir et fermer des instances de l’appareil ou des appareils spécifiés : Opérations d’ouverture de base, Opérations d’ouverture directe d’appareil et un test Ouvrir et Fermer.

Opérations ouvertes de base

Pendant les opérations d’ouverture de base, le test Fuzz ouvre (crée) à plusieurs reprises les instances des appareils spécifiés ou des appareils exportés par le pilote spécifié à l’aide de différentes méthodes et options.

Le test Fuzz effectue toujours les opérations ouvertes de base. Vous n’avez pas besoin de les sélectionner et vous ne pouvez pas les exclure d’une session de test.

Le test Fuzz effectue toutes les opérations ouvertes en mode utilisateur en appelant les services système (Routines ZwXxx) appropriés à l’appareil. Si un appel ouvert retourne un handle à l’appareil, le test Fuzz utilise le handle pour effectuer les autres tests d’appareil sélectionnés pour la session de test.

Il existe cinq types d’opérations ouvertes de base :

  • Standard ouvert. le test Fuzz ouvre l’appareil de manière asynchrone et spécifie uniquement le nom de l’appareil natif.

  • Ouvrez avec une barre oblique inverse ajoutée. le test Fuzz émet un appel ouvert pour le nom de l’appareil suivi d’une barre oblique inverse (), comme \device\cdrom\, comme si l’appel devait ouvrir un répertoire racine dans l’appareil.

    Cette opération détermine la façon dont le pilote ou le système de fichiers gère les requêtes ouvertes dans son espace de noms. En particulier, si l’appareil ne prend pas en charge les requêtes ouvertes dans son espace de noms, le pilote doit empêcher l’accès non autorisé, soit en échouant les demandes, soit en définissant la caractéristique de l’appareil FILE_DEVICE_SECURE_OPEN lorsqu’il appelle IoCreateDevice ou IoCreateDeviceSecure pour créer l’objet d’appareil.

  • Ouvrez en tant que canal nommé. le test Fuzz ouvre l’appareil et établit un canal nommé vers l’appareil. Le paramètre d’accès (ShareAccess) est initialement défini sur lecture et écriture, mais est ajusté si la demande échoue. Si l’appareil ne prend pas en charge les canaux nommés, la demande doit échouer.

  • Ouvrez en tant que maillot. le test Fuzz ouvre l’appareil en tant que maillot. Si l’appareil ne prend pas en charge ce type de connexion, la demande doit échouer.

  • Ouvrez en tant que connexion d’arborescence. le test Fuzz ouvre l’appareil en tant que connexion d’arborescence pour une utilisation dans l’accès réseau distant. Le paramètre d’accès (ShareAccess) est initialement défini sur lecture et écriture, mais est ajusté si la demande échoue. Si l’appareil ne prend pas en charge ce type de connexion, la demande doit échouer.

Les paramètres utilisés dans les appels ouverts varient pour tenir compte des caractéristiques de l’appareil et rendre probable la réussite des appels. Par exemple, si une opération d’ouverture de base échoue parce que l’appel ne répond pas aux exigences de sécurité de l’appareil, le test Fuzz répète l’opération d’ouverture avec une demande d’accès inférieur. Par exemple, si une opération ouverte qui a demandé un accès en écriture renvoie une erreur de violation de sécurité, l’ouverture est répétée avec une demande d’accès en lecture.

Opérations directes d’ouverture d’appareil

Pendant les opérations d’ouverture directe de l’appareil, le test Fuzz ouvre l’appareil directement, en tant qu’appareil, et non en tant que fichier dans un système de fichiers. Les opérations d’ouverture d’appareil direct sont toujours synchrones. Si l’appel réussit, le test Fuzz utilise le handle fourni pour effectuer d’autres tests sélectionnés.

Ouvrir et fermer le test

Pendant le test Ouvrir et Fermer, le test Fuzz crée plusieurs threads, chacun d’entre eux effectuant des milliers de séquences create-open-close. Cela teste la capacité du conducteur à gérer un volume extraordinaire d’appels par ailleurs simples et anticipés.

Le test Ouvrir et fermer utilise les mêmes options que celles utilisées dans Les tests d’ouverture de base et Ouvrir avec barre oblique inverse ajoutée et sont effectués juste avant ces tests.

Guide pratique pour tester un pilote au moment de l’exécution à l’aide de Visual Studio

Comment sélectionner et configurer les tests De base de l’appareil

Tests de base de l’appareil

Plug-ins d’E/S simples WDTF fournis

Comment tester un pilote au moment de l’exécution à partir d’une invite de commandes