Condividi tramite


Test di penetrazione (nozioni fondamentali sul dispositivo)

I test di penetrazione dei concetti fondamentali del dispositivo eseguono varie forme di attacchi di input, che sono un componente fondamentale dei test di sicurezza. I test di attacco e penetrazione consentono di identificare le vulnerabilità nelle interfacce software.

Penetrazione

I test di penetrazione includono due categorie di test: test fuzz e test di attacco di I/O e I/O. I test Fuzz erano anche una funzionalità dello strumento di test Device Path Exceriser .

Test Descrizione

Disabilita I/O Spy

Disabilita I/O Spy su 1 o più dispositivi.

Test binario: Devfund_IOSpy_DisableSupport.wsc

Metodo di test: DisableIoSpy

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DQ

Display I/O Spy-enabled Device

Visualizzare i dispositivi con I/O Spy abilitato su di essi.

Test binario: Devfund_IOSpy_DisplayEnabledDevices.wsc

Metodo di test: DisplayIoSpyDevices

Abilitare I/O Spy

Abilitare I/O Spy su uno o più dispositivi.

Test binario: Devfund_IOSpy_EnableSupport.wsc

Metodo di test: EnableIoSpy

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DQ

DFD : specifica il percorso del file di dati IoSpy. Il percorso predefinito è %SystemDrive%\DriverTest\IoSpy

Test dell'API Fuzz Misc

I test dell'API Fuzz Misc sono test che determinano se il driver può gestire un'ampia gamma di chiamate comuni dai driver in modalità kernel.

I test includono i test seguenti:

  • Chiama a ZwReadFile e ZwWriteFile, specificando puntatori validi del buffer dei dati, lunghezze variabili (compreso zero) e offset di byte variabili, inclusi offset di byte zero, -1 e 64 bit.

  • Chiamate per annullare i buffer di I/0 e scaricamento.

  • Una serie di chiamate di query di directory che usano classi di informazioni sui file comuni con puntatori al buffer dati utente validi e lunghezze di buffer variabili (incluso zero).

  • Le chiamate di query di directory sono simili a quelle rilasciate dai programmi in esecuzione sotto il controllo della macchina dos virtuale (VDM).

  • Chiama per recuperare gli attributi estesi di un file con dimensioni e lunghezze del buffer variabili.

  • Chiamate per creare e chiudere oggetti sezione, con la protezione della pagina di sezione variabile e gli attributi di allocazione sezione (sezione commit, sezione file di immagine).

  • Chiamate per bloccare e sbloccare i file.

  • Chiama per recuperare le voci di quota per un volume.

  • Test attributi file, una serie di query sugli attributi di file con puntatori validi a una struttura ObjectAttributes .

    Il test attributi file ha un test facoltativo di lunghezza zero. Durante il recupero degli attributi estesi di un file, il test Fuzz supera una query vuota (lunghezza zero) e un indirizzo di buffer non valido al driver.

File binario di test: Devfund_DevicePathExerciser.dll

Metodo di test: DoMiscAPITest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

API Fuzz Misc con test di query di lunghezza zero

Questo test esegue gli stessi test del test dell'API Fuzz Misc e questa volta passa una query vuota (lunghezza zero) e un indirizzo di buffer non valido al driver durante il tentativo di recuperare gli attributi estesi di un file.

File binario di test: Devfund_DevicePathExerciser.dll

Metodo di test: DoMiscAPIWithZeroLengthTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz open and close test

Questo test esegue migliaia di sequenze create-open-close.

Per informazioni dettagliate su questo test, vedere Informazioni sul test fuzz aperto e chiuso.

File binario di test: Devfund_DevicePathExerciser.dll

Metodo di test: DoOpenCloseTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test delle informazioni sui file fuzz e set file

Questo test genera chiamate per recuperare e modificare le informazioni sull'oggetto, il file e il volume dei dispositivi.

Durante il test delle informazioni su query e set file, il test Fuzz esegue chiamate per recuperare e modificare le informazioni sull'oggetto, il file e il volume dei dispositivi aperti dalle operazioni di base open operations e da altre operazioni aperte, incluse le operazioni eseguite dal test di apertura secondaria Fuzz.

Il test Fuzz genera ogni query o imposta una chiamata almeno 1024 volte con un buffer valido e una varietà di lunghezze del buffer e classi di informazioni sui file. Viene inviata anche una richiesta di ogni tipo con un puntatore del buffer non valido e una lunghezza del buffer zero.

Se si usa il parametro ChangeBufferProtectionFlags , che imposta l'opzione di protezione, il test Fuzz varia l'impostazione di sicurezza nel buffer in ogni query e imposta la chiamata.

Questo test esegue anche il test Fuzz Sub-opens.

Questo test usa le funzioni ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFile e ZwSetVolumeInformationFile .

File binario di test: Devfund_DevicePathExerciser.dll

Metodo di test: DoQueryAndSetFileInformationTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test di sicurezza set e query fuzz

Questo test genera chiamate per recuperare il descrittore di sicurezza e modificare lo stato di sicurezza dei dispositivi.

Durante la query e imposta test di sicurezza, il test Fuzz genera chiamate per recuperare il descrittore di sicurezza e modificare lo stato di sicurezza dei dispositivi aperti dalle operazioni di base e da altre operazioni aperte, incluse le operazioni eseguite dal test di apertura secondaria Fuzz.

Il test Fuzz genera ogni query o imposta una chiamata almeno 1024 volte con un buffer valido e un'ampia gamma di lunghezze del buffer e tipi di informazioni di sicurezza (OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION e nessun tipo di informazioni). Viene inviata anche una richiesta di ogni tipo con un puntatore del buffer non valido e una lunghezza del buffer zero.

Se si usa il parametro ChangeBufferProtectionFlags , che imposta l'opzione di protezione, il test Fuzz varia l'impostazione di sicurezza nel buffer in ogni query e imposta la chiamata.

File binario di test: Devfund_DevicePathExerciser.dll

Metodo di test: DoQueryAndSetSecurityTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test CASUALE CASUALE FUZZTL /Test IOCTL casuale Fuzz

Questo test genera una serie di chiamate alla funzione DeviceIoControl con codici di funzione, tipi di dispositivo, metodi di trasferimento dei dati e requisiti di accesso selezionati in modo casuale da un intervallo di valori specificato. Le chiamate includono buffer di input e output con puntatori e lunghezze del buffer validi e non validi e contenuto generato in modo casuale.

Durante i test casuali, il test Fuzz invia una serie di chiamate alla funzione DeviceIoControl con codici di funzione, tipi di dispositivo, metodi di trasferimento dei dati e requisiti di accesso selezionati in modo casuale da un intervallo di valori specificato. Le chiamate includono buffer di input e output con puntatori e lunghezze del buffer validi e non validi e contenuto generato in modo casuale.

Il test Fuzz esegue i test casuali su tutti i dispositivi aperti durante le operazioni di apertura di base e test aperti aggiuntivi. È possibile personalizzare questo test usando i parametri seguenti:

  • Usare MinFunctionCode e MaxFunctionCode per specificare l'intervallo di codici di funzione IOCTL o LAMBDATL usati nelle chiamate

  • Usare MinDeviceType e MaxDeviceType per specificare l'intervallo di tipi di dispositivo usati nelle chiamate

  • Utilizzare SeedNumber per specificare un numero di inizializzazione per la routine di generazione di numeri casuali.

La funzione usata dal test Fuzz per generare numeri casuali per il test usa un numero di inizializzazione, un numero iniziale per l'algoritmo di generazione di numeri casuali. Per riprodurre le condizioni di test, usare il parametro numero di inizializzazione per specificare il numero di inizializzazione usato nella versione di valutazione del test originale.

Un test casuale personalizzato viene incluso come parte del test casuale. Il test casuale personalizzato usa i risultati del test casuale per esaminare in modo più dettagliato la risposta dei driver alle richieste IOCTL o XAMLTL. Le aree di probe di test casuali personalizzate perse dal test casuale e quelle su cui il driver non rispondeva come previsto in base allo stato restituito dalle chiamate di test casuali.

File binario di test: Devfund_DevicePathExerciser.dll

Metodi di test: DoRandomIOCTLTest, DoRandomFSCTLTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test con apertura secondaria fuzz

Il test esegue una serie rapida di chiamate per aprire oggetti nello spazio dei nomi del dispositivo. In queste chiamate passa un percorso che inizia con il dispositivo e include nomi arbitrari e stringhe senza senso di lunghezza e contenuto variabili.

Durante un test aperto relativo, noto anche come test sub-aperto, il test Fuzz tenta di aprire oggetti nello spazio dei nomi del dispositivo.

Durante questo test, il test Fuzz esegue una rapida serie di chiamate per aprire oggetti nello spazio dei nomi dei dispositivi aperti usando operazioni open di base e altre operazioni aperte. In queste chiamate, il test Fuzz supera un percorso che inizia con il dispositivo e include nomi arbitrari e stringhe senza senso di lunghezza e contenuto variabili.

Questo test determina il modo in cui il driver o il file system gestisce le richieste aperte nello spazio dei nomi. In particolare, se il driver non supporta le richieste aperte nello spazio dei nomi, deve impedire l'accesso non autorizzato, con esito negativo delle richieste o impostando la caratteristica del dispositivo FILE_DEVICE_SECURE_OPEN quando usa IoCreateDevice o IoCreateDeviceSecure per creare l'oggetto dispositivo.

Per altre informazioni sullo spazio dei nomi di un dispositivo, vedere Controllo dell'accesso allo spazio dei nomi dei dispositivi.

File binario di test: Devfund_DevicePathExerciser.dll

Metodo di test: DoSubOpensTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Fuzz Sub-opens with Streams test

Questo test tenta di aprire un'ampia gamma di flussi di dati denominati nel dispositivo. Il test usa una serie di nomi di flusso arbitrari con contenuto e caratteri che potrebbero essere validi per altri usi in alcuni dispositivi.

Durante il test dei flussi, il test Fuzz tenta di aprire un'ampia gamma di flussi di dati denominati nel dispositivo. I test usano una serie di nomi di flusso arbitrari con contenuto e caratteri che potrebbero essere validi per altri usi in alcuni dispositivi. Questo test determina se il driver può gestire correttamente le richieste del flusso di dati, soprattutto se il driver esporta un dispositivo che non supporta o prevede flussi di dati.

Un flusso di dati denominato è un attributo di un oggetto file. È possibile specificare un flusso di dati denominato scrivendo il nome del file, i due punti e il nome del flusso di dati, ad esempio "File01.txt: AccessDate" dove AccessDate è un flusso di dati denominato, ovvero un attributo del file File01.txt.

Il test Fuzz registra i nomi dei flussi usati nel test.

File binario di test: Devfund_DevicePathExerciser.dll

Metodo di test: DoSubOpensWithStreamsTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Test BUFFER BUFFERTL Zero-Length/Test IOCTL buffer fuzz Zero-Length

Questo test genera una serie di chiamate alla funzione DeviceIoControl con lunghezze del buffer di input e/o output pari a 0. Il test genera codici di controllo del file system diversi usando codici di funzione diversi, tipi di dispositivo, metodi di trasferimento dei dati e requisiti di accesso.

Durante il test del buffer Zero-Length, il test Fuzz invia una serie di chiamate alla funzione DeviceIoControl con lunghezze di input e/o buffer di output pari a 0. Il test genera codici di controllo I/O diversi usando codici di funzione diversi, tipi di dispositivo, metodi di trasferimento dei dati e requisiti di accesso. Per informazioni sul contenuto dei codici di controllo di I/O, vedere Definizione dei codici di controllo di I/O.

Per testare la gestione del driver di puntatori del buffer non validi, i puntatori al buffer in queste chiamate in modalità utente specificano gli indirizzi elevati nello spazio di indirizzi virtuali del kernel, ad esempio 0xFFFFFC00).

Il test Fuzz esegue il test Zero-Length Buffer su tutti i dispositivi aperti durante i test aperti di base e aggiuntivi. È possibile personalizzare questo test usando i parametri di comando MinFunctionCode e MaxFunctionCode per specificare l'intervallo di codici di funzione IOCTL o MDFTL usati nelle chiamate e MinDeviceType e MaxDeviceType per specificare l'intervallo di tipi di dispositivo usati nelle chiamate.

File binario di test: Devfund_DevicePathExerciser.dll

Metodi di test: DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Eseguire attacchi di I/O

Esegue attacchi di I/O nel dispositivo o nei dispositivi specificati.

Test binario: Devfund_IOAttack_DeleteDataFile.wsc

Metodo di test: RunIoAttack

Parametri: - vedere Parametri di test dei concetti fondamentali del dispositivo

DQ

Informazioni sul test fuzz aperto e di chiusura

Il test fuzz aperto e chiuso usa diversi modi per aprire e chiudere le istanze del dispositivo o dei dispositivi specificati: operazioni di apertura di base, operazioni di apertura diretta del dispositivo e test di apertura e chiusura.

Operazioni aperte di base

Durante le operazioni di apertura di base, il test Fuzz apre ripetutamente (crea) istanze dei dispositivi specificati o dei dispositivi esportati dal driver specificato usando metodi e opzioni diversi.

Il test Fuzz esegue sempre le operazioni di apertura di base. Non è necessario selezionarli e non è possibile escluderli da una sessione di test.

Il test Fuzz esegue tutte le operazioni aperte in modalità utente chiamando i servizi di sistema (Routine ZwXxx) appropriati per il dispositivo. Se una chiamata aperta restituisce un handle al dispositivo, il test Fuzz usa l'handle per eseguire gli altri test del dispositivo selezionati per la sessione di test.

Esistono cinque tipi di operazioni aperte di base:

  • Standard aperto. Il test Fuzz apre il dispositivo in modo asincrono e specifica solo il nome del dispositivo nativo.

  • Aprire con la barra rovesciata aggiunta. Il test Fuzz emette una chiamata aperta per il nome del dispositivo seguito da una barra rovesciata (), ad esempio \device\cdrom\, come se la chiamata fosse per aprire una directory radice all'interno del dispositivo.

    Questa operazione determina il modo in cui il driver o il file system gestisce le richieste aperte nello spazio dei nomi. In particolare, se il dispositivo non supporta le richieste aperte nello spazio dei nomi, il driver deve impedire l'accesso non autorizzato, con esito negativo delle richieste o impostando la caratteristica del dispositivo FILE_DEVICE_SECURE_OPEN quando chiama IoCreateDevice o IoCreateDeviceSecure per creare l'oggetto dispositivo.

  • Aprire come named pipe. Il test Fuzz apre il dispositivo e stabilisce una named pipe al dispositivo. Il parametro di accesso (ShareAccess) viene inizialmente impostato su lettura e scrittura, ma viene modificato se la richiesta non riesce. Se il dispositivo non supporta named pipe, la richiesta avrà esito negativo.

  • Aprire come mailslot. Il test Fuzz apre il dispositivo come mailslot. Se il dispositivo non supporta questo tipo di connessione, la richiesta non riesce.

  • Aprire come connessione ad albero. Il test Fuzz apre il dispositivo come connessione ad albero da usare nell'accesso alla rete remota. Il parametro di accesso (ShareAccess) viene inizialmente impostato su lettura e scrittura, ma viene modificato se la richiesta non riesce. Se il dispositivo non supporta questo tipo di connessione, la richiesta non riesce.

I parametri usati nelle chiamate aperte variano in base alle caratteristiche del dispositivo e rendono probabile che le chiamate abbiano esito positivo. Ad esempio, se un'operazione di apertura di base non riesce perché la chiamata non soddisfa i requisiti di sicurezza del dispositivo, il test Fuzz ripete l'operazione di apertura con una richiesta di accesso minore. Ad esempio, se un'operazione aperta che ha richiesto l'accesso in scrittura restituisce un errore di violazione di sicurezza, l'apertura viene ripetuta con una richiesta di accesso in lettura.

Operazioni di apertura diretta del dispositivo

Durante le operazioni di apertura diretta del dispositivo, il test Fuzz apre direttamente il dispositivo, come dispositivo, non come file in un file system. Le operazioni direct device open sono sempre sincrone. Se la chiamata ha esito positivo, il test Fuzz usa l'handle fornito per eseguire altri test selezionati.

Aprire e chiudere il test

Durante il test Open e Close, il test Fuzz crea diversi thread, ognuno dei quali esegue migliaia di sequenze create-open-close. Questo verifica la capacità del conducente di gestire un volume straordinario di chiamate altrimenti semplici e previste.

Il test Apri e Chiudi usa le stesse opzioni usate nelle operazioni aperte di base e apri con i test della barra rovesciata aggiunta e vengono eseguiti subito prima di questi test.

Come testare un driver in fase di esecuzione con Visual Studio

Come selezionare e configurare i test dei concetti fondamentali del dispositivo

Test fondamentali del dispositivo

Sono stati forniti plug-in I/O semplici WDTF

Come testare un driver in fase di esecuzione da un prompt dei comandi