Delen via


Penetratietests (basisprincipes van apparaten)

De penetratietests van device fundamentals voeren verschillende vormen van invoeraanvallen uit. Dit is een essentieel onderdeel van beveiligingstests. Aanvallen en penetratietests kunnen helpen bij het identificeren van beveiligingsproblemen in software-interfaces.

Penetratie

De penetratietests omvatten twee soorten tests: Fuzz-tests en I/O Spy en I/O Attack tests. De Fuzz-tests waren ook een onderdeel van het Device Path Exceriser testhulpprogramma.

Test Beschrijving

I/O Spy uitschakelen

Schakel I/O Spy uit op 1 of meer apparaten.

Binair testen: Devfund_IOSpy_DisableSupport.wsc

Testmethode: DisableIoSpy

Parameters: - zie Testparameters voor apparaat fundamentals

DQ

Toon I/O Spy-ingeschakeld Apparaat

Apparaten weergeven waarvoor I/O Spy ingeschakeld zijn.

Binair testen: Devfund_IOSpy_DisplayEnabledDevices.wsc

Testmethode: DisplayIoSpyDevices

I/O Spy inschakelen

Schakel I/O Spy- in op een of meer apparaten.

Binair testen: Devfund_IOSpy_EnableSupport.wsc

Testmethode: EnableIoSpy

Parameters: - zie Testparameters voor apparaat fundamentals

DQ

DFD- - hiermee geeft u het pad naar het IoSpy-gegevensbestand op. De standaardlocatie is %SystemDrive%\DriverTest\IoSpy

Fuzz Allerlei API-test

De Fuzz Misc API-tests zijn tests die bepalen of het stuurprogramma verschillende veelvoorkomende aanroepen van kernelmodusstuurprogramma's kan verwerken.

De tests omvatten de volgende tests:

  • Aanroepen naar ZwReadFile en ZwWriteFile, waarbij geldige gegevensbufferpointers, verschillende lengten (inclusief nul) en wisselende byte-offsets worden opgegeven, waaronder nul- -1- en 64-bits bytes-offsets.

  • Oproepen om I/0 te annuleren en buffers leeg te maken.

  • Een reeks aanroepen van directoryquery's met veelgebruikte bestandsinformatieklassen met geldige bufferaanwijzers voor gebruikersgegevens en verschillende bufferlengten (inclusief nul).

  • Aanroepen van directoryquery's die vergelijkbaar zijn met die welke worden uitgevoerd door programma's die onder controle van de virtuele DOS-machine (VDM) draaien.

  • Aanroepen voor het ophalen van de uitgebreide kenmerken van een bestand met verschillende buffergrootten en lengten.

  • Aanroepen voor het maken en sluiten van sectieobjecten, met verschillende sectiepaginabeveiligings- en sectietoewijzingskenmerken (vastgelegde sectie, sectie afbeeldingsbestand).

  • Oproepen om bestanden te vergrendelen en te ontgrendelen.

  • Oproepen om quotumvermeldingen voor een volume op te halen.

  • Bestandskenmerken testen, een reeks query's voor bestandskenmerken met geldige aanwijzers naar een ObjectAttributes structuur.

    De test van bestandskenmerken heeft een optionele nul-lengte test. Tijdens het ophalen van de uitgebreide kenmerken van een bestand geeft de Fuzz-test een lege query (nullengte) en een ongeldig bufferadres door aan het stuurprogramma.

Binair testen: Devfund_DevicePathExerciser.dll

testmethode : DoMiscAPITest

Parameters: - zie Testparameters voor basisprincipes van het apparaat

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

imiteren

VulNullenPaginaMetNull-

Fuzz Misc API met query-test van nul lengte

Met deze test worden dezelfde tests uitgevoerd als fuzz Misc API-test. Deze keer wordt een lege query (nullengte) en een ongeldig bufferadres aan het stuurprogramma doorgegeven tijdens het ophalen van de uitgebreide kenmerken van een bestand.

Binair testen: Devfund_DevicePathExerciser.dll

Testmethode : DoMiscAPIWithZeroLengthTest

Parameters: - zie Testparameters voor appraatbasisprincipes

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

imiteren

VulNulpaginaMetNul

test Fuzz openen en sluiten

Met deze test worden duizenden create-open-close-reeksen uitgevoerd.

Zie Over de open- en sluittestvoor gedetailleerde informatie over deze test.

Binair testen: Devfund_DevicePathExerciser.dll

Testmethode: DoOpenCloseTest

Parameters: - zie Testparameters voor apparaat fundamentals

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

imiteren

FillZeroPageWithNull-

Fuzz Query en Bestandsinformatie Instellen test

Met deze test worden aanroepen uitgevoerd om de object-, bestand- en volume-informatie van apparaten op te halen en te wijzigen.

Tijdens de Query en Set File Information Testroept de fuzztest op om de object-, bestand- en volume-informatie op te halen en te wijzigen van apparaten die zijn geopend door de Basic Open Operations en andere open bewerkingen, inclusief die uitgevoerd door de fuzz-subopens-test.

Met de Fuzz-test wordt elke query of set minstens 1024 keer aangeroepen met een geldige buffer en diverse bufferlengten en bestandsinformatieklassen. Eén aanvraag van elk type wordt ook ingediend met een ongeldige bufferaanwijzer en een bufferlengte van nul.

Als u de parameter ChangeBufferProtectionFlags gebruikt, die de beveiligingsoptie instelt, varieert de Fuzz-test de beveiligingsinstelling van de buffer bij elke query en elke set-aanroep.

Met deze test wordt ook de Fuzz Sub-opens test uitgevoerd.

Deze test maakt gebruik van de functies ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFileen ZwSetVolumeInformationFile.

Binair testen: Devfund_DevicePathExerciser.dll

testmethode: DoQueryAndSetFileInformationTest

Parameters: - zie Parameters voor apparaatfundamenten testen

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Imiteer bij

FillZeroPageWithNull-

Fuzz-query en beveiligingstest instellen

Deze test roept aan om de beveiligingsdescriptor op te halen en de beveiligingsstatus van apparaten te wijzigen.

Tijdens de Query en Instelling Beveiligingstestroept de Fuzz-test procedures aan om de beveiligingsdescriptor op te halen en de beveiligingsstatus van apparaten te wijzigen die zijn geopend door de Basic Open Operations en andere open bewerkingen, inclusief de bewerkingen uitgevoerd door de Fuzz Sub-opens test.

Bij de Fuzz-test voert het elke query of set-oproep minimaal 1024 keer uit met een geldige buffer en verschillende bufferlengtes en beveiligingsinformatietypen (OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION en geen informatietype). Eén aanvraag van elk type wordt ook verzonden met een ongeldige bufferaanwijzer en een bufferlengte van nul.

Als u de parameter ChangeBufferProtectionFlags gebruikt, die de beveiligingsoptie instelt, verandert de Fuzz-test de beveiligingsinstelling van de buffer bij elke query- en set-oproep.

Binair testen: Devfund_DevicePathExerciser.dll

Testmethode: DoQueryAndSetSecurityTest

Parameters: - zie Testparameters voor de basisprincipes van apparaten

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

imiteren

FillZeroPageWithNull-

Fuzz Random FSCTL-test / Fuzz Random IOCTL-test

Met deze test wordt een reeks aanroepen naar de functie DeviceIoControl uitgevoerd met functiecodes, apparaattypen, methoden voor gegevensoverdracht en toegangsvereisten die willekeurig zijn geselecteerd vanuit een opgegeven bereik met waarden. De aanroepen bevatten invoer- en uitvoerbuffers met geldige en ongeldige bufferpunten en lengten, en willekeurig gegenereerde inhoud.

Tijdens willekeurige tests geeft de Fuzz-test een reeks aanroepen uit naar de DeviceIoControl functie met functiecodes, apparaattypen, methoden voor gegevensoverdracht en toegangsvereisten die willekeurig zijn geselecteerd vanuit een opgegeven bereik van waarden. De aanroepen bevatten invoer- en uitvoerbuffers met geldige en ongeldige bufferpunten en lengten, en willekeurig gegenereerde inhoud.

De Fuzz-test voert de willekeurige tests uit op alle apparaten die zijn geopend tijdens de Basic Open Operations en aanvullende open tests. U kunt deze test aanpassen met behulp van de volgende parameters:

  • Gebruik MinFunctionCode en MaxFunctionCode om het bereik van IOCTL- of FSCTL-functiecodes op te geven die in de aanroepen worden gebruikt

  • Gebruik MinDeviceType en MaxDeviceType om het bereik van apparaattypen op te geven dat wordt gebruikt in de aanroepen

  • Gebruik SeedNumber om een seed-getal op te geven voor het willekeurige getal dat routine genereert.

De functie die de Fuzz-test gebruikt om willekeurige getallen voor de test te genereren, maakt gebruik van een seed-nummer, een beginnummer voor het algoritme voor het genereren van willekeurige getallen. Als u de testvoorwaarden wilt reproduceren, gebruikt u het zaadnummer parameter om het seed-nummer op te geven dat is gebruikt in de oorspronkelijke testtest.

Een op maat gemaakte willekeurige test wordt opgenomen als onderdeel van de willekeurige test. De op maat gemaakte willekeurige test gebruikt de resultaten van de willekeurige test om de reactie van het stuurprogramma op IOCTL- of FSCTL-aanvragen gedetailleerder te onderzoeken. De gerichte aanvullende test onderzoekt gebieden die door de willekeurige test zijn gemist en gebieden waarop het driver-programma niet heeft gereageerd zoals verwacht, gebaseerd op de status die door de willekeurige testoproepen is geretourneerd.

Binair testen: Devfund_DevicePathExerciser.dll

Testmethoden: DoRandomIOCTLTest, DoRandomFSCTLTest

Parameters: - zie Testparameters voor basisprincipes apparaat

MinInBuffer

MaxInBuffer-

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber-

MinDeviceType-

MaxDeviceType

MinFunctionCode-

MaxFunctionCode-

DoPoolCheck

DQ-

TestCycles

ChangeBufferProtectionFlags

imiteren

VulNulPaginaMetNullen

test Fuzz Sub wordt geopend

De test voert een snelle reeks aanroepen uit om objecten in de naamruimte van het apparaat te openen. In deze aanroepen wordt een pad doorgegeven dat begint met het apparaat en willekeurige namen en zinloze reeksen van verschillende lengte en inhoud bevat.

Tijdens een relatieve opentest(ook wel een subopen testgenoemd) probeert de Fuzz-test objecten te openen in de naamruimte van het apparaat.

Tijdens deze test voert de Fuzz-test een snelle reeks aanroepen uit om objecten te openen in de naamruimte van de apparaten die zijn geopend met behulp van Basic Open Operations en andere open bewerkingen. In deze aanroepen gebruikt de Fuzz-test een pad dat begint met het apparaat en willekeurige namen en onzinnige tekenreeksen van verschillende lengte en inhoud bevat.

Deze test bepaalt hoe het stuurprogramma of bestandssysteem open aanvragen beheert in de naamruimte. Met name als het stuurprogramma geen ondersteuning biedt voor open aanvragen in de naamruimte, moet het onbevoegde toegang voorkomen, hetzij door de aanvragen te mislukken of door de FILE_DEVICE_SECURE_OPEN apparaatkenmerken in te stellen wanneer het gebruikmaakt van IoCreateDevice- of IoCreateDeviceSecure- om het apparaatobject te maken.

Zie Apparaatnaamruimtetoegang beherenvoor meer informatie over de naamruimte van een apparaat.

Binair testen: Devfund_DevicePathExerciser.dll

Testmethode : DoSubOpensTest

Parameters: - zie Testparameters voor apparaat fundamentals

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

imiteren

FillZeroPageWithNull-

Fuzz-sub wordt geopend met streams-test

Met deze test wordt geprobeerd verschillende benoemde gegevensstromen op het apparaat te openen. De test maakt gebruik van een reeks willekeurige stroomnamen met inhoud en tekens die mogelijk geldig zijn voor andere toepassingen op sommige apparaten.

Tijdens de Streams Testprobeert de Fuzz-test verschillende benoemde gegevensstromen op het apparaat te openen. De tests gebruiken een reeks willekeurige stroomnamen met inhoud en tekens die mogelijk geldig zijn voor andere toepassingen op sommige apparaten. Met deze test wordt bepaald of het stuurprogramma aanvragen voor gegevensstromen correct kan verwerken, met name als het stuurprogramma een apparaat exporteert dat geen gegevensstromen ondersteunt of verwacht.

Een benoemde gegevensstroom is een kenmerk van een bestandsobject. U geeft een benoemde gegevensstroom op door de naam van het bestand, een dubbele punt en de naam van de gegevensstroom te schrijven, bijvoorbeeld 'File01.txt:AccessDate' waarbij AccessDate- een benoemde gegevensstroom is, dat wil gezegd een kenmerk van het File01.txt bestand.

De Fuzz-test registreert de stroomnamen die in de test worden gebruikt.

Binair testen: Devfund_DevicePathExerciser.dll

Testmethode: DoSubOpensWithStreamsTest

Parameters: - zie Fundamentele testparameters voor apparaten

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

imiteren

FillZeroPageWithNull-

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

Deze test doet een reeks aanroepen naar de DeviceIoControl-functie met invoer- en/of uitvoerbufferlengtes van 0. De test genereert verschillende systeembeheercodes met behulp van verschillende functiecodes, apparaattypen, methoden voor gegevensoverdracht en toegangsvereisten.

Tijdens de Zero-Length Buffertest geeft de Fuzz-test een reeks aanroepen uit naar de functie DeviceIoControl met invoer- en/of uitvoerbufferlengten van 0. De test genereert verschillende I/O-besturingscodes met behulp van verschillende functiecodes, apparaattypen, methoden voor gegevensoverdracht en toegangsvereisten. Zie I/O-besturingscodes definiërenvoor meer informatie over de inhoud van I/O-besturingscodes.

Als u de verwerking van ongeldige bufferaanwijzers van het stuurprogramma wilt testen, geven de bufferaanwijzers in deze aanroepen in de gebruikersmodus adressen op die hoog zijn in de virtuele kerneladresruimte, zoals 0xFFFFFC00).

De Fuzz-test voert de Zero-Length Buffertest uit op alle apparaten die tijdens de basis- en aanvullende open tests zijn geopend. U kunt deze test aanpassen met behulp van de MinFunctionCode en MaxFunctionCode opdrachtparameters om het bereik van de IOCTL- of FSCTL-functiecodes op te geven die worden gebruikt in de aanroepen en MinDeviceType en MaxDeviceType om het bereik van apparaattypen op te geven dat in de aanroepen wordt gebruikt.

Binair testen: Devfund_DevicePathExerciser.dll

Testmethoden: DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest

Parameters: - zie Testparameters voor apparaat fundamentals

MinDeviceType-

MaxDeviceType

MinFunctionCode-

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

imiteren

FillZeroPageWithNull-

I/O-aanval uitvoeren

Voert I/O-aanval uit op het opgegeven apparaat of de opgegeven apparaten.

Binair testen: Devfund_IOAttack_DeleteDataFile.wsc

testmethode: RunIoAttack

Parameters: - zie Basisparameters voor apparaat testen

DQ

Over de open- en sluittest van de fuzz

De Fuzz-test voor openen en sluiten maakt gebruik van verschillende manieren om exemplaren van het opgegeven apparaat of de opgegeven apparaten te openen en te sluiten: Basic Open Operations, Direct Device Open Operationsen een openen en sluiten test.

Basis open bewerkingen

Tijdens de Basic Open Operationsopent (maakt) de Fuzz-test herhaaldelijk exemplaren van de opgegeven apparaten of van apparaten die door het opgegeven stuurprogramma zijn geëxporteerd, met verschillende methoden en opties.

De Fuzz-test voert altijd de Basic Open Operations uit. U hoeft ze niet te selecteren en u kunt ze niet uitsluiten van een testsessie.

De Fuzz-test voert alle open bewerkingen uit in de gebruikersmodus door systeemservices (ZwXxx Routines) aan te roepen die geschikt zijn voor het apparaat. Als een open aanroep een handle naar het apparaat retourneert, gebruikt de Fuzz-test deze handle om de andere apparaattests uit te voeren die voor de testsessie zijn geselecteerd.

Er zijn vijf typen Basic Open Operations:

  • Standaard instellen op open. de Fuzz-test opent het apparaat asynchroon en geeft alleen de systeemeigen apparaatnaam op.

  • Openen met toegevoegde backslash. de Fuzz-test geeft een open aanroep voor de apparaatnaam, gevolgd door een backslash (), zoals \device\cdrom\, alsof de aanroep een hoofdmap binnen het apparaat zou openen.

    Deze bewerking bepaalt hoe het stuurprogramma of bestandssysteem open aanvragen beheert in de naamruimte. Met name, als het apparaat geen ondersteuning biedt voor open aanvragen in zijn naamruimte, moet het stuurprogramma onbevoegde toegang voorkomen, hetzij door de aanvragen te laten falen, hetzij door het FILE_DEVICE_SECURE_OPEN apparaatkenmerk in te stellen wanneer het IoCreateDevice of IoCreateDeviceSecure aanroept om het apparaatobject te maken.

  • Open als een benoemde pijp. De Fuzz-test opent het apparaat en brengt een benoemde pijp naar het apparaat. De toegangsparameter (ShareAccess) is in eerste instantie ingesteld op lezen en schrijven, maar wordt aangepast als de aanvraag mislukt. Als het apparaat geen ondersteuning biedt voor benoemde pijpen, mislukt de aanvraag.

  • Open als een brievenbus. De Fuzz-test opent het apparaat als een mailslot. Als het apparaat dit type verbinding niet ondersteunt, mislukt de aanvraag.

  • Open als een boomstructuurverbinding. de Fuzz-test opent het apparaat als een structuurverbinding voor gebruik in externe netwerktoegang. De toegangsparameter (ShareAccess) is in eerste instantie ingesteld op lezen en schrijven, maar wordt aangepast als de aanvraag mislukt. Als het apparaat dit type verbinding niet ondersteunt, mislukt de aanvraag.

De parameters die in de open aanroepen worden gebruikt, zijn afhankelijk van de kenmerken van het apparaat en zorgen ervoor dat de aanroepen waarschijnlijk slagen. Als een eenvoudige open bewerking bijvoorbeeld mislukt omdat de aanroep niet voldoet aan de beveiligingsvereisten van het apparaat, herhaalt de Fuzz-test de open bewerking met een aanvraag voor minder toegang. Als een open bewerking die schrijftoegang heeft aangevraagd bijvoorbeeld een beveiligingsfout retourneert, wordt het openen herhaald met een aanvraag voor leestoegang.

Directe Operaties voor het Openen van Apparaten

Tijdens de Direct Device Open Operationsopent de Fuzz-test het apparaat rechtstreeks als een apparaat, niet als een bestand in een bestandssysteem. Open bewerkingen voor directe apparaten zijn altijd synchroon. Als de aanroep is geslaagd, gebruikt de Fuzztest de handler die is opgegeven om andere geselecteerde tests uit te voeren.

Test openen en sluiten

Tijdens de Open- en Sluittest , creëert de Fuzz-test verschillende threads, waarbij ieder duizenden create-open-close-sequenties uitvoert. Hiermee wordt het vermogen van de bestuurder getest om een buitengewoon volume van anders eenvoudige en verwachte aanroepen af te handelen.

De Open- en Sluittest gebruikt dezelfde opties die worden gebruikt in Basic Open Operations en Openen met Toegevoegde Backslash-test en worden direct voor deze tests uitgevoerd.

Hoe een stuurprogramma tijdens runtime te testen met behulp van Visual Studio

Hoe u de basisapparatentests selecteert en configureert

Basisprincipestests voor apparaten

Geleverde WDTF Simple I/O-invoegtoepassingen

Een stuurprogramma tijdens runtime testen vanaf een opdrachtprompt