Problémy se zabezpečením pro kódy ovládacích prvků vstupně-výstupních operací

Zabezpečené zpracování IRP, které obsahují kódy řízení vstupně-výstupních operací, závisí na správném definování IOCTL kódů a na pečlivém zkoumání parametrů, které ovladač přijímá s balíčkem IRP.

Při definování nových kódů IOCTL použijte následující pravidla:

  • Vždy zadejte hodnotu FunctionCode , která je rovna nebo větší než 0x800.

  • Vždy zadejte hodnotu RequiredAccess . I/O manažer neodesílá IOCTL, pokud volající nemá dostatečná přístupová práva.

  • Nedefinujte kódy IOCTL, které volajícím umožňují číst nebo zapisovat nespecifické oblasti paměti jádra.

Při zpracování kódů IOCTL v rámci ovladače použijte následující pravidla:

  • Pokaždé, když dispečerské rutiny ovladače testují přijaté kódy IOCTL, musí vždy testovat celou 32bitovou hodnotu.

  • Ovladače mohou použít IoValidateDeviceIoControlAccess k dynamickému provádění přísnější kontroly přístupu, než která je určena hodnotou RequiredAccess v definici kódu řízení vstupně-výstupních operací.

  • Nikdy nečtěte nebo nezapisujte více dat, než může obsahovat vyrovnávací paměť, na kterou odkazuje Irp-AssociatedIrp.SystemBuffer>. Proto vždy zkontrolujte Parameters.DeviceIoControl.InputBufferLength nebo Parameters.DeviceIoControl.OutputBufferLength ve struktuře IO_STACK_LOCATION, aby bylo možné určit limity vyrovnávací paměti.

  • Vždy nulové vyrovnávací paměti přidělené ovladačem, které budou obsahovat data určená pro aplikaci, která pochází z požadavku IOCTL. Tímto způsobem nechtěně nezkopírujete citlivá data do aplikace.

  • Pro přenosy METHOD_IN_DIRECT a METHOD_OUT_DIRECT postupujte podle výše uvedených pravidel. Dále zkontrolujte návratovou hodnotu NULL z MmGetSystemAddressForMdlSafe, která indikuje, že mapování selhalo nebo že byla zadána vyrovnávací paměť s nulovou délkou.

  • U METHOD_NEITHER přenosů postupujte podle pravidel, která jsou k dispozici v části Použití žádné vyrovnávací paměti ani přímých vstupně-výstupních operací.