Strumenti di verifica statici e dinamici

Esistono due tipi di base di strumenti di verifica:

  • Gli strumenti di verifica statici esaminano il codice del driver senza eseguire il driver. Poiché questi strumenti non si basano su test che esercitano il codice, possono essere estremamente accurati. Teoricamente, gli strumenti di verifica statici possono esaminare tutto il codice del driver, inclusi i percorsi di codice che raramente vengono eseguiti in pratica. Tuttavia, poiché il driver non è effettivamente in esecuzione, potrebbe generare risultati falsi positivi. Ciò significa che potrebbero segnalare un errore in un percorso di codice che potrebbe non verificarsi in pratica.

  • Gli strumenti di verifica dinamici esaminano il codice del driver mentre il driver è in esecuzione, in genere intercettando le chiamate alle routine di supporto dei driver di uso comune e sostituendo le chiamate alle proprie versioni di controllo degli errori delle stesse routine. Poiché il driver è effettivamente in esecuzione mentre gli strumenti dinamici eseguono la verifica, i risultati falsi positivi sono rari. Tuttavia, poiché gli strumenti dinamici rilevano solo le azioni che si verificano durante il monitoraggio del driver, gli strumenti possono perdere determinati difetti del driver se la copertura del test del driver non è adeguata. Allo stesso tempo, usando le informazioni disponibili in fase di esecuzione, ad esempio, le informazioni più difficili da estrarre in modo statico dal codice sorgente, gli strumenti di verifica dinamica possono rilevare determinate classi di errori del driver che sono più difficili da rilevare con strumenti di analisi statica.

La procedura consigliata consiste nell'usare una combinazione di strumenti di verifica statici e dinamici. Gli strumenti statici consentono di controllare i percorsi di codice difficili da esercitare in pratica, mentre gli strumenti dinamici rilevano errori gravi che si verificano nel driver.

Importante

Il programma di compatibilità hardware Windows richiede codeQL per i test STL (Static Tool Logo) nei sistemi operativi client e server. Continueremo a mantenere il supporto per SDV e CA su prodotti meno recenti. I partner sono invitati a esaminare i requisiti codeQL per il test del logo dello strumento statico. Per altre informazioni sull'uso di CodeQL, vedere CodeQL e il test del logo degli strumenti statici.

Sondaggio degli strumenti di verifica

Gli strumenti di verifica seguenti sono descritti in WDK e consigliati per l'uso da parte di sviluppatori di driver e tester. Vengono elencati nell'ordine in cui vengono in genere usati.

Non appena il codice viene compilato

  • CodeQL, di GitHub, è un potente motore di analisi del codice semantico e la combinazione di una vasta gamma di query di sicurezza di alto valore insieme a una solida piattaforma lo rendono uno strumento prezioso per la protezione del codice driver. Per altre informazioni, vedere CodeQL e il test del logo degli strumenti statici.

Strumenti statici aggiuntivi

A seconda della versione di Windows da cui si sta creando un driver, potrebbero essere necessari altri strumenti statici.

  • Analisi del codice per i driver è uno strumento di verifica statico eseguito in fase di compilazione. L'analisi del codice per i driver può verificare i driver scritti in C/C++ e nel codice gestito. Esamina il codice in ogni funzione di un driver in modo indipendente, in modo da poterlo eseguire non appena è possibile compilare il driver. Viene eseguito relativamente rapidamente e usa poche risorse.

    Le funzionalità di base dello strumento di analisi del codice in Visual Studio rilevano errori di codifica generali, ad esempio la mancata verifica dei valori restituiti. Le funzionalità specifiche del driver rilevano errori di codifica dei driver più sottili, ad esempio lasciando campi non inizializzati in un IRP copiato e non ripristinando un IRQL modificato entro la fine di una routine.

  • Static Driver Verifier (SDV) è uno strumento di verifica statico eseguito in fase di compilazione e verifica il codice del driver in modalità kernel scritto in C/C++. È incluso in WDK e può essere avviato da Visual Studio Ultimate 2012 o da una finestra del prompt dei comandi di Visual Studio usando MSBuild.

    In base a un set di regole di interfaccia e a un modello del sistema operativo, Static Driver Verifier determina se il driver interagisce correttamente con il kernel del sistema operativo Windows. Static Driver Verifier è estremamente accurato. Esplora tutti i percorsi raggiungibili nel codice sorgente del driver ed esegue questi percorsi simbolicamente. Di conseguenza, rileva bug che non vengono rilevati usando qualsiasi altro metodo convenzionale di test del driver.

Importante

SDV non è più supportato e SDV non è disponibile nelle versioni WDK o EWDK di Windows 24H2. Non è disponibile in WDK più recente rispetto alla build 26017 e non è incluso in Windows 24H2 RTM WDK. SDV può comunque essere usato scaricando Windows 11 versione 22H2 EWDK (rilasciata il 24 ottobre 2023) con gli strumenti di compilazione di Visual Studio 17.1.5 da Scaricare Windows Driver Kit (WDK) . È consigliabile usare enterprise WDK per eseguire SDV. L'uso di versioni precedenti del WDK standard in combinazione con le versioni recenti di Visual Studio non è consigliato, in quanto ciò genererà probabilmente errori di analisi.
In futuro, CodeQL sarà lo strumento di analisi statico principale per i driver. CodeQL offre un linguaggio di query potente che considera il codice come database su cui eseguire query, semplificando la scrittura di query per comportamenti, modelli e altro ancora specifici. Per altre informazioni sull'uso di CodeQL, vedere CodeQL e il test del logo degli strumenti statici.

Quando il driver viene eseguito

Usare gli strumenti di verifica dinamici seguenti non appena viene compilato il driver ed è in esecuzione senza errori evidenti.

  • Driver Verifier è uno strumento di verifica dinamico scritto in particolare per i driver di Windows. Include più test che possono essere eseguiti contemporaneamente su più driver. Driver Verifier è così efficace per trovare bug gravi nei driver che sviluppatori di driver e tester esperti configurano Driver Verifier per l'esecuzione ogni volta che il driver viene eseguito in un ambiente di sviluppo o test. Driver Verifier è incluso in Windows. Quando si abilita Driver Verifier per un driver, è necessario eseguire anche più test sul driver. Driver Verifier può rilevare alcuni bug del driver difficili da rilevare usando solo strumenti di verifica statici. Di seguito sono riportati alcuni esempi di questi tipi di bug:

    • Sovraccarichi del buffer del pool del kernel. Quando il driver verificato alloca i buffer di memoria del pool, Driver Verifier li protegge con una pagina di memoria non accessibile. Se il driver tenta di usare la memoria oltre la fine del buffer, il driver Verifier emetterà un controllo del bug.

    • Uso della memoria dopo averlo liberato. I blocchi di memoria del pool speciali usano la propria pagina di memoria e non condividono pagine di memoria con altre allocazioni. Quando il driver libera il blocco di memoria del pool, la pagina di memoria corrispondente diventa non accessibile. Se il driver tenta di usare tale memoria dopo averlo liberato, il driver si arresterà immediatamente.

    • Uso della memoria pagable durante l'esecuzione in IRQL con privilegi elevati. Quando un driver verificato genera irQL a DISPATCH_LEVEL o versione successiva, Driver Verifier taglia tutta la memoria paging dal working set di sistema, simulando un sistema sotto pressione di memoria. Il driver si arresta in modo anomalo se tenta di usare uno di questi indirizzi virtuali impaginabili.

    • Simulazione risorse basse. Per simulare un sistema in condizioni di risorse basse, Driver Verifier può non riuscire varie API del kernel del sistema operativo chiamate dai driver.

    • Perdite di memoria. Driver Verifier tiene traccia delle allocazioni di memoria effettuate da un driver e verifica che la memoria venga liberata prima che il driver venga scaricato.

    • Operazioni di I/O che richiedono troppo tempo per il completamento o l'annullamento. Driver Verifier può testare la logica del driver per rispondere ai STATUS_PENDING restituire valori da IoCallDriver.

    • Controllo della conformità DDI. (Disponibile a partire da Windows 8) Driver Verifier applica un set di regole DDI (Device Driver Interface) che controllano l'interazione corretta tra un driver e l'interfaccia kernel del sistema operativo. Queste regole corrispondono alle regole usate da Static Driver Verifier nell'analisi del codice sorgente del driver. Se Driver Verifier rileva un errore quando il controllo di conformità DDI è abilitato, eseguire Static Driver Verifier e selezionare la stessa regola che ha causato l'errore. Static Driver Verifier consente di individuare la causa del difetto nel codice sorgente del driver.

  • Kernel Address Sanitizer (KASAN) è una tecnologia di rilevamento dei bug supportata nei driver Windows che consente di rilevare diverse classi di accessi alla memoria non validi, ad esempio gli overflow del buffer e gli eventi senza utilizzo.

  • Application Verifier è uno strumento di verifica dinamico per applicazioni e driver in modalità utente scritti in C/C++. Non verifica il codice gestito.