Condividi tramite


Problemi di sicurezza per i codici di controllo di I/O

L'elaborazione sicura degli IRP che contengono codici di controllo I/O dipende dalla definizione corretta dei codici IOCTL e dall'analisi attenta dei parametri ricevuti dal driver dall'IRP.

Quando si definiscono nuovi codici IOCTL, usare le regole seguenti:

  • Specificare sempre un valore functionCode uguale o maggiore di 0x800.

  • Specificare sempre un valore RequiredAccess . Il gestore di I/O non invia IOCTLs se il chiamante dispone di diritti di accesso insufficienti.

  • Non definire codici IOCTL che consentono ai chiamanti di leggere o scrivere aree non specifiche della memoria del kernel.

Quando si elaborano i codici IOCTL all'interno di un driver, usare le regole seguenti:

  • Ogni volta che le routine di dispatch di un driver testano i codici IOCTL ricevuti, devono sempre testare l'intero valore a 32 bit.

  • I driver possono usare IoValidateDeviceIoControlAccess per eseguire in modo dinamico un controllo di accesso più rigoroso rispetto a quello specificato dal valore RequiredAccess nella definizione del codice di controllo I/O.

  • Non leggere o scrivere più dati di quanti il buffer a cui punta Irp-AssociatedIrp.SystemBuffer possa contenere. Controllare quindi sempre Parameters.DeviceIoControl.InputBufferLength o Parameters.DeviceIoControl.OutputBufferLength nella struttura IO_STACK_LOCATION per determinare i limiti del buffer.

  • Azzerare sempre i buffer che il driver ha allocato, i quali conterranno i dati destinati a un'applicazione che ha originato una richiesta IOCTL. In questo modo, i dati sensibili non verranno copiati accidentalmente nell'applicazione.

  • Per i trasferimenti di METHOD_IN_DIRECT e METHOD_OUT_DIRECT, seguire le regole riportate sopra. Inoltre, verificare la presenza di un valore restituito NULL da MmGetSystemAddressForMdlSafe, che indica che il mapping non è riuscito o che è stato fornito un buffer di lunghezza zero.

  • Per i trasferimenti METHOD_NEITHER, seguire le regole fornite in Uso di I/O né in modalità buffered né in modalità diretta.