Freigeben über


Penetrationstests (Gerätegrundlagen)

Die Gerätegrundlagen-Penetrationstests führen verschiedene Arten von Eingabeangriffen durch, die eine wichtige Komponente von Sicherheitstests sind. Angriffs- und Penetrationstests können helfen, Sicherheitsrisiken in Softwareschnittstellen zu identifizieren.

Eindringen

Die Penetrationstests umfassen zwei Kategorien von Tests: Fuzz-Tests und E/A-Spion - und E/A-Angriffstests . Die Fuzz-Tests waren auch ein Feature des Testtools Device Path Exceriser .

Testen Beschreibung

Deaktivieren von E/A-Spion

Deaktivieren Sie E/A-Spion auf mindestens 1 Geräten.

Binärdatei testen: Devfund_IOSpy_DisableSupport.wsc

Testmethode: DisableIoSpy

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

E/A Spy-fähiges Gerät anzeigen

Anzeigen von Geräten, auf denen E/A-Spion aktiviert ist.

Binärdatei testen: Devfund_IOSpy_DisplayEnabledDevices.wsc

Testmethode: DisplayIoSpyGeräte

Aktivieren von E/A-Spion

Aktivieren Sie E/A Spy auf einem oder mehreren Geräten.

Binärdatei testen: Devfund_IOSpy_EnableSupport.wsc

Testmethode: EnableIoSpy

Parameter: Siehe Testparameter für Gerätegrundlagen

DQ

DFD : Gibt den Pfad zur IoSpy-Datendatei an. Der Standardspeicherort ist %SystemDrive%\DriverTest\IoSpy.

Fuzz Misc API-Test

Die Fuzz Misc API-Tests sind Tests, die bestimmen, ob der Treiber eine Vielzahl gängiger Aufrufe von Kernelmodustreibern verarbeiten kann.

Die Tests umfassen die folgenden Tests:

  • Ruft ZwReadFile und ZwWriteFile auf, wobei gültige Datenpufferzeiger, unterschiedliche Längen (einschließlich Null) und unterschiedliche Byteoffsets angegeben werden, einschließlich 0,-1- und 64-Bit-Bytesoffsets.

  • Aufrufe zum Abbrechen von I/0 und Leeren von Puffern.

  • Eine Reihe von Verzeichnisabfrageaufrufen unter Verwendung allgemeiner Dateiinformationsklassen mit gültigen Benutzerdatenpufferzeigern und unterschiedlichen Pufferlängen (einschließlich Null).

  • Verzeichnisabfrageaufrufe, die denen ähneln, die von Programmen ausgegeben werden, die unter der Kontrolle der virtuellen DOS-Maschine (VDM) ausgeführt werden.

  • Aufrufe zum Abrufen der erweiterten Attribute einer Datei mit unterschiedlichen Puffergrößen und -längen.

  • Aufrufe zum Erstellen und Schließen von Abschnittsobjekten mit unterschiedlichem Abschnittsseitenschutz und Abschnittszuweisungsattributen (festgeschriebener Abschnitt, Bilddateiabschnitt).

  • Aufrufe zum Sperren und Entsperren von Dateien.

  • Aufrufe zum Abrufen von Kontingenteinträgen für ein Volume.

  • Dateiattribute test, eine Reihe von Dateiattributabfragen mit gültigen Zeigern auf eine ObjectAttributes-Struktur .

    Der Dateiattributtest hat einen optionalen Nulllängentest. Beim Abrufen der erweiterten Attribute einer Datei übergibt der Fuzz-Test eine leere (null lange) Abfrage und eine ungültige Pufferadresse an den Treiber.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethode: DoMiscAPITest

Parameter: Siehe Testparameter für Gerätegrundlagen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Misc-API mit Abfragetest ohne Länge

Dieser Test führt dieselben Tests wie der Fuzz Misc-API-Test durch und übergibt dieses Mal eine leere Abfrage (Nulllänge) und eine ungültige Pufferadresse an den Treiber, während versucht wird, die erweiterten Attribute einer Datei abzurufen.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethode: DoMiscAPIWithZeroLengthTest

Parameter: Siehe Testparameter für Gerätegrundlagen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz-Test zum Öffnen und Schließen

Dieser Test führt Tausende von Create-Open-Close-Sequenzen durch.

Ausführliche Informationen zu diesem Test finden Sie unter Informationen zum offenen und schließen von Fuzz.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethode: DoOpenCloseTest

Parameter: Siehe Testparameter für Gerätegrundlagen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz-Abfrage und Dateiinformationstest festlegen

Dieser Test gibt Aufrufe aus, um die Objekt-, Datei- und Volumeinformationen von Geräten abzurufen und zu ändern.

Während des Tests zum Abfragen und Festlegen von Dateiinformationen führt der Fuzz-Test Aufrufe durch, um das Objekt, die Datei und die Volumeninformationen von Geräten abzurufen und zu ändern, die von den grundlegenden geöffneten Vorgängen und anderen geöffneten Vorgängen geöffnet werden, einschließlich der Vorgänge, die vom Fuzz-Test zum Öffnen von Sub ausgeführt werden.

Der Fuzz-Test führt jede Abfrage oder Set-Aufruf mindestens 1024 Mal mit einem gültigen Puffer und einer Vielzahl von Pufferlängen und Dateiinformationsklassen durch. Eine Anforderung jedes Typs wird auch mit einem ungültigen Pufferzeiger und einer Pufferlänge von Null gesendet.

Wenn Sie den Parameter ChangeBufferProtectionFlags verwenden, der die Schutzoption festlegt, variiert der Fuzz-Test die Sicherheitseinstellung für den Puffer in jeder Abfrage und jedem Set-Aufruf.

Dieser Test führt auch den Fuzz-Test zum Öffnen von Sub aus.

Dieser Test verwendet die Funktionen ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFile und ZwSetVolumeInformationFile .

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethode: DoQueryAndSetFileInformationTest

Parameter: Siehe Testparameter für Gerätegrundlagen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz-Abfrage und Sicherheitstest festlegen

Dieser Test gibt Aufrufe aus, um die Sicherheitsbeschreibung abzurufen und den Sicherheitsstatus von Geräten zu ändern.

Während des Abfrage- und Festlegen-Sicherheitstests gibt der Fuzz-Test Aufrufe aus, um die Sicherheitsbeschreibung abzurufen und den Sicherheitsstatus von Geräten zu ändern, die durch die grundlegenden geöffneten Vorgänge und andere Öffnungsvorgänge geöffnet wurden, einschließlich der Vorgänge, die vom Fuzz-Unteröffnungstest durchgeführt wurden.

Der Fuzz-Test stellt jeden Abfrage- oder Setaufruf mindestens 1024 Mal mit einem gültigen Puffer und einer Vielzahl von Pufferlängen und Sicherheitsinformationstypen aus (OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION und kein Informationstyp). Eine Anforderung jedes Typs wird auch mit einem ungültigen Pufferzeiger und einer Pufferlänge von Null gesendet.

Wenn Sie den Parameter ChangeBufferProtectionFlags verwenden, der die Schutzoption festlegt, variiert der Fuzz-Test die Sicherheitseinstellung für den Puffer in jeder Abfrage und jedem Set-Aufruf.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethode: DoQueryAndSetSecurityTest

Parameter: – Siehe Testparameter für Gerätegrundlagen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Random FSCTL-Test/Fuzz Random IOCTL-Test

Dieser Test gibt eine Reihe von Aufrufen der DeviceIoControl-Funktion mit Funktionscodes, Gerätetypen, Datenübertragungsmethoden und Zugriffsanforderungen aus, die zufällig aus einem angegebenen Wertebereich ausgewählt werden. Die Aufrufe umfassen Eingabe- und Ausgabepuffer mit gültigen und ungültigen Pufferzeigern und -längen sowie zufällig generierten Inhalten.

Während zufälliger Tests gibt der Fuzz-Test eine Reihe von Aufrufen an die DeviceIoControl-Funktion mit Funktionscodes, Gerätetypen, Datenübertragungsmethoden und Zugriffsanforderungen aus, die zufällig aus einem bestimmten Wertebereich ausgewählt werden. Die Aufrufe umfassen Eingabe- und Ausgabepuffer mit gültigen und ungültigen Pufferzeigern und -längen sowie zufällig generierten Inhalten.

Der Fuzz-Test führt die zufälligen Tests auf allen Geräten durch, die während der grundlegenden Offenvorgänge und zusätzlicher offener Tests geöffnet wurden. Sie können diesen Test mithilfe der folgenden Parameter anpassen:

  • Verwenden Sie MinFunctionCode und MaxFunctionCode, um den Bereich der IOCTL- oder FSCTL-Funktionscodes anzugeben, die in den Aufrufen verwendet werden.

  • Verwenden Sie MinDeviceType und MaxDeviceType, um den Bereich der Gerätetypen anzugeben, die in den Aufrufen verwendet werden.

  • Verwenden Sie SeedNumber, um eine Ausgangszahl für die zufällige Zahl anzugeben, die Routine generiert.

Die Funktion, die der Fuzz-Test verwendet, um Zufallszahlen für den Test zu generieren, verwendet eine Ausgangszahl, eine Startnummer für den Algorithmus zur Generierung von Zufallszahlen. Um die Testbedingungen zu reproduzieren, verwenden Sie den Seed number-Parameter , um die Startnummer anzugeben, die in der ursprünglichen Testversion verwendet wurde.

Ein Angepasster Zufallstest ist im Rahmen des zufälligen Tests enthalten. Der maßgeschneiderte Zufallstest verwendet die Ergebnisse des Zufallstests, um die Antwort der Treiber auf IOCTL- oder FSCTL-Anforderungen ausführlicher zu untersuchen. Der angepasste Zufallstest untersucht Bereiche, die er übersehen hat, und solche, auf denen der Treiber nicht wie erwartet reagiert hat, basierend auf dem Status, der von den Zufallstestaufrufen zurückgegeben wird.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethoden: DoRandomIOCTLTest, DoRandomFSCTLTest

Parameter: – Siehe Testparameter für Gerätegrundlagen

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz: Test zum Öffnen von Sub-Open-Fuzzen

Der Test führt eine schnelle Reihe von Aufrufen zum Öffnen von Objekten im Namespace des Geräts aus. Bei diesen Aufrufen wird ein Pfad übergeben, der mit dem Gerät beginnt und beliebige Namen und Unsinnszeichenfolgen unterschiedlicher Länge und Inhalt enthält.

Während eines Relative Open-Tests (auch als Test zum Öffnen von Sub bezeichnet) versucht der Fuzz-Test, Objekte im Namespace des Geräts zu öffnen.

Während dieses Tests führt der Fuzz-Test eine schnelle Reihe von Aufrufen zum Öffnen von Objekten im Namespace der Geräte aus, die mithilfe von grundlegenden Open-Vorgängen und anderen Open-Vorgängen geöffnet werden. In diesen Aufrufen übergibt der Fuzz-Test einen Pfad, der mit dem Gerät beginnt und beliebige Namen und sinnfreie Zeichenfolgen mit unterschiedlicher Länge und Inhalt enthält.

Dieser Test ermittelt, wie der Treiber oder das Dateisystem Open-Anforderungen im Namespace verwaltet. Insbesondere wenn der Treiber keine offenen Anforderungen in seinem Namespace unterstützt, muss er den nicht autorisierten Zugriff verhindern, entweder durch fehlschlagende Anforderungen oder durch Festlegen der FILE_DEVICE_SECURE_OPEN Geräteeigenschaft, wenn ioCreateDevice oder IoCreateDeviceSecure zum Erstellen des Geräteobjekts verwendet wird.

Weitere Informationen zum Namespace eines Geräts finden Sie unter Steuern des Zugriffs auf den Gerätenamespace.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethode: DoSubOpensTest

Parameter: – Siehe Testparameter für Gerätegrundlagen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Sub-opens with Streams test (Fuzz sub-opens with Streams– Test)

Dieser Test versucht, eine Vielzahl benannter Datenströme auf dem Gerät zu öffnen. Der Test verwendet eine Reihe beliebiger Streamnamen mit Inhalten und Zeichen, die möglicherweise für andere Verwendungen auf einigen Geräten gültig sind.

Während des Streams-Tests versucht der Fuzz-Test, eine Vielzahl benannter Datenströme auf dem Gerät zu öffnen. Die Tests verwenden eine Reihe beliebiger Datenstromnamen mit Inhalten und Zeichen, die für andere Verwendungen auf einigen Geräten gültig sein können. Dieser Test bestimmt, ob der Treiber Datenstromanforderungen ordnungsgemäß verarbeiten kann, insbesondere, wenn der Treiber ein Gerät exportiert, das Datenströme nicht unterstützt oder erwartet.

Ein benannter Datenstrom ist ein Attribut eines Dateiobjekts. Sie geben einen benannten Datenstrom an, indem Sie den Namen der Datei, einen Doppelpunkt und den Namen des Datenstroms schreiben, z. B. "File01.txt:AccessDate", wobei AccessDate ein benannter Datenstrom ist, also ein Attribut der File01.txt-Datei.

Der Fuzz-Test zeichnet die Datenstromnamen auf, die im Test verwendet werden.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethode: DoSubOpensWithStreamsTest

Parameter: – Siehe Testparameter für Gerätegrundlagen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Zero-Length Buffer FSCTL test/Fuzz Zero-Length Buffer IOCTL test

Dieser Test gibt eine Reihe von Aufrufen der DeviceIoControl-Funktion mit einer Eingangs- und/oder Ausgabepufferlänge von 0 aus. Der Test generiert unterschiedliche Dateisystemsteuerungscodes mithilfe verschiedener Funktionscodes, Gerätetypen, Datenübertragungsmethoden und Zugriffsanforderungen.

Während des Zero-Length Puffertests gibt der Fuzz-Test eine Reihe von Aufrufen der DeviceIoControl-Funktion mit einer Eingangs- und/oder Ausgabepufferlänge von 0 aus. Der Test generiert unterschiedliche E/A-Steuerungscodes mithilfe verschiedener Funktionscodes, Gerätetypen, Datenübertragungsmethoden und Zugriffsanforderungen. Informationen zum Inhalt von E/A-Steuerungscodes finden Sie unter Definieren von E/A-Steuerungscodes.

Um die Behandlung von ungültigen Pufferzeigern durch den Treiber zu testen, geben die Pufferzeiger in diesen Benutzermodusaufrufen Adressen an, die sehr weit oben im virtuellen Adressraum des Kernels liegen (z. B. 0xFFFFFC00).

Der Fuzztest führt den Nulllängen-Puffertest auf allen Geräten aus, die während der grundlegenden und zusätzlichen Tests geöffnet werden. Sie können diesen Test anpassen, indem Sie die Befehlsparameter MinFunctionCode und MaxFunctionCode verwenden, um den Bereich der IOCTL- oder FSCTL-Funktionscodes anzugeben, die in den Aufrufen verwendet werden, und MinDeviceType und MaxDeviceType , um den Bereich der in den Aufrufen verwendeten Gerätetypen anzugeben.

Binärdatei testen: Devfund_DevicePathExerciser.dll

Testmethoden: DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest

Parameter: – Siehe Testparameter für Gerätegrundlagen

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Ausführen eines E/A-Angriffs

Führt E/A-Angriffe auf das angegebene Gerät oder die angegebenen Geräte aus.

Binärdatei testen: Devfund_IOAttack_DeleteDataFile.wsc

Testmethode: RunIoAttack

Parameter: – Siehe Testparameter für Gerätegrundlagen

DQ

Informationen zum Fuzz-Test zum Öffnen und Schließen

Der Fuzz-Test zum Öffnen und Schließen verwendet verschiedene Möglichkeiten zum Öffnen und Schließen von Instanzen des angegebenen Geräts oder der angegebenen Geräte: Grundlegende Open-Vorgänge, Vorgänge zum öffnen von direkten Geräten und einen Test zum Öffnen und Schließen.

Grundlegende Geöffnete Vorgänge

Während der grundlegenden Geöffneten Vorgänge öffnet der Fuzz-Test wiederholt Instanzen der angegebenen Geräte oder der Geräte, die vom angegebenen Treiber mithilfe verschiedener Methoden und Optionen exportiert werden.

Der Fuzz-Test führt immer die Grundlegenden Geöffneten Vorgänge aus. Sie müssen sie nicht auswählen, und Sie können sie nicht aus einer Testsitzung ausschließen.

Der Fuzz-Test führt alle offenen Vorgänge im Benutzermodus durch Aufrufen von Systemdiensten (ZwXxx-Routinen) aus, die für das Gerät geeignet sind. Wenn ein geöffneter Aufruf einen Handle an das Gerät zurückgibt, verwendet der Fuzz-Test den Handle, um die anderen Gerätetests auszuführen, die für die Testsitzung ausgewählt sind.

Es gibt fünf Arten von grundlegenden geöffneten Vorgängen:

  • Standard geöffnet. Der Fuzz-Test öffnet das Gerät asynchron und gibt nur den systemeigenen Gerätenamen an.

  • Öffnen Sie mit hinzugefügtem umgekehrtem Schrägstrich. Der Fuzz-Test gibt einen offenen Aufruf für den Gerätenamen aus, gefolgt von einem umgekehrten Schrägstrich (), z. B. \device\cdrom\, als ob der Aufruf ein Stammverzeichnis innerhalb des Geräts öffnen würde.

    Dieser Vorgang bestimmt, wie das Treiber- oder Dateisystem offene Anforderungen im Namespace verwaltet. Insbesondere, wenn das Gerät keine offenen Anforderungen in seinem Namespace unterstützt, muss der Treiber den nicht autorisierten Zugriff verhindern, indem entweder die Anforderungen fehlschlagen oder die FILE_DEVICE_SECURE_OPEN Geräteeigenschaft festgelegt wird, wenn IoCreateDevice oder IoCreateDeviceSecure aufgerufen wird, um das Geräteobjekt zu erstellen.

  • Öffnen Sie als Named Pipe. Der Fuzz-Test öffnet das Gerät und richtet eine Named Pipe für das Gerät ein. Der Zugriffsparameter (ShareAccess) wird zunächst auf Lese- und Schreibzugriff festgelegt, wird jedoch angepasst, wenn die Anforderung fehlschlägt. Wenn das Gerät keine benannten Rohre unterstützt, sollte die Anforderung fehlschlagen.

  • Öffnen Sie als Maillot. Der Fuzz-Test öffnet das Gerät als Maillot. Wenn das Gerät diesen Verbindungstyp nicht unterstützt, sollte die Anforderung fehlschlagen.

  • Öffnen Sie als Strukturverbindung. Der Fuzz-Test öffnet das Gerät als Strukturverbindung für den Remotenetzwerkzugriff. Der Zugriffsparameter (ShareAccess) wird zunächst auf Lese- und Schreibzugriff festgelegt, wird jedoch angepasst, wenn die Anforderung fehlschlägt. Wenn das Gerät diesen Verbindungstyp nicht unterstützt, sollte die Anforderung fehlschlagen.

Die Parameter, die in den geöffneten Anrufen verwendet werden, variieren, um die Merkmale des Geräts zu erfüllen und wahrscheinlich, dass die Anrufe erfolgreich sind. Wenn beispielsweise ein einfacher geöffneter Vorgang fehlschlägt, da der Aufruf die Sicherheitsanforderungen des Geräts nicht erfüllt hat, wiederholt der Fuzz-Test den geöffneten Vorgang mit einer Anforderung für weniger Zugriff. Wenn z. B. ein geöffneter Vorgang, der den Schreibzugriff angefordert hat, einen Sicherheitsverletzungsfehler zurückgibt, wird der Geöffnete mit einer Anforderung für den Lesezugriff wiederholt.

Direkte Geräte geöffnete Vorgänge

Während des Direct Device Open Operations öffnet der Fuzz-Test das Gerät direkt, als Gerät, nicht als Datei in einem Dateisystem. Direct Device Open Operations sind immer synchron. Wenn der Aufruf erfolgreich ist, verwendet der Fuzz-Test den zum Ausführen anderer ausgewählter Tests bereitgestellten Handle.

Test öffnen und schließen

Während des Open- und Close-Tests erstellt der Fuzz-Test mehrere Threads, von denen jede Tausende von create-open-close-Sequenzen ausführt. Dadurch wird die Fähigkeit des Fahrers getestet, ein außergewöhnliches Volumen von andernfalls einfachen und erwarteten Anrufen zu behandeln.

Der Test "Öffnen und Schließen" verwendet dieselben Optionen, die in den Tests "Grundlegende Offene Vorgänge " und "Öffnen mit hinzugefügtem umgekehrtem Schrägstrich" verwendet werden und unmittelbar vor diesen Tests ausgeführt werden.

Gewusst wie: Testen eines Treibers zur Laufzeit mit Visual Studio

Auswählen und Konfigurieren der Gerätegrundlagentests

Gerätegrundlagentests

Bereitgestellte WDTF Simple I/O-Plug-Ins

Testen eines Treibers zur Laufzeit über eine Eingabeaufforderung