Condividi tramite


Problemi di sicurezza per i codici di controllo I/O

L'elaborazione sicura dei codici di controllo I/O dipende dalla definizione dei codici IOCTL correttamente e dall'analisi attenta dei parametri ricevuti dal driver con L'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 I/O non invia IOCTLs se il chiamante ha 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 invio di un driver hanno ricevuto codici IOCTL, devono sempre testare l'intero valore a 32 bit.

  • I driver possono usare IoValidateDeviceIoControlAccess per eseguire dinamicamente 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 rispetto al buffer a cui punta Irp-AssociatedIrp.SystemBuffer> può contenere. Controllare quindi sempre Parameters.DeviceIoControl.InputBufferLength o Parameters.DeviceIoControl.OutputBufferLength nella struttura IO_STACK_LOCATION per determinare i limiti del buffer.

  • Buffer allocati sempre zero driver che conterrà i dati destinati a un'applicazione che ha generato una richiesta IOCTL. In questo modo, non si copiano accidentalmente dati sensibili all'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 a lunghezza zero.

  • Per i trasferimenti di METHOD_NEITHER, seguire le regole fornite in Uso né di I/O con buffer né diretto.