Udostępnij przez


Problemy z zabezpieczeniami kodów kontroli we/wy

Bezpieczne przetwarzanie IRP zawierających kody kontroli we/wy zależy od prawidłowego zdefiniowania kodów IOCTL i dokładnego zbadania parametrów odbieranych przez sterownik przy użyciu IRP.

Podczas definiowania nowych kodów IOCTL należy użyć następujących reguł:

  • Zawsze określ wartość FunctionCode , która jest równa lub większa niż 0x800.

  • Zawsze określ wartość RequiredAccess . Menedżer I/O nie wysyła żądań IOCTL, jeśli wywołujący ma niewystarczające prawa dostępu.

  • Nie należy definiować kodów IOCTL, które umożliwiają obiektom wywołującym odczytywanie lub zapisywanie nieokreślonych obszarów pamięci jądra.

Podczas przetwarzania kodów IOCTL w sterowniku należy użyć następujących reguł:

  • Za każdym razem, gdy rutyny wysyłania sterownika testują otrzymane kody IOCTL, muszą zawsze przetestować całą wartość 32-bitową.

  • Sterowniki mogą używać funkcji IoValidateDeviceIoControlAccess do dynamicznego przeprowadzania bardziej rygorystycznej weryfikacji dostępu niż określonej przez wartość RequiredAccess w definicji kodu sterowania we/wy.

  • Nigdy nie odczytaj ani nie zapisuj większej ilości danych niż bufor wskazywany przez protokół Irp-AssociatedIrp.SystemBuffer> może zawierać. W związku z tym zawsze sprawdź parametry.DeviceIoControl.InputBufferLength lub Parameters.DeviceIoControl.OutputBufferLength w strukturze IO_STACK_LOCATION , aby określić limity buforu.

  • Zawsze zero przydzielonych sterowników, które będą zawierać dane przeznaczone dla aplikacji, która pochodzi z żądania IOCTL. W ten sposób nie będziesz przypadkowo kopiować poufnych danych do aplikacji.

  • W przypadku METHOD_IN_DIRECT i transferów METHOD_OUT_DIRECT postępuj zgodnie z powyższymi regułami. Ponadto sprawdź wartość zwracaną null z mmGetSystemAddressForMdlSafe, która wskazuje, że mapowanie nie powiodło się lub że podano bufor o zerowej długości.

  • W przypadku METHOD_NEITHER transferów postępuj zgodnie z regułami podanymi w temacie Używanie operacji we/wy, które nie są buforowane ani bezpośrednie.