Dela via


Säkerhetsproblem för I/O-kontrollkoder

Säker bearbetning av IRP:er som innehåller I/O-kontrollkoder beror på korrekt definiering av IOCTL-koder och noggrann granskning av parametrar som drivrutinen tar emot med IRP:en.

När du definierar nya IOCTL-koder använder du följande regler:

  • Ange alltid ett FunctionCode-värde som är lika med eller större än 0x800.

  • Ange alltid värdet RequiredAccess . I/O-chefen skickar inte IOCTLs om anroparen inte har tillräckliga åtkomsträttigheter.

  • Definiera inte IOCTL-koder som tillåter anropare att läsa eller skriva icke-specifika områden i kernelminnet.

När du bearbetar IOCTL-koder inom en drivrutin använder du följande regler:

  • När drivrutinsutskicksrutiner tar emot IOCTL-koder måste de alltid testa hela 32-bitarsvärdet.

  • Drivrutiner kan använda IoValidateDeviceIoControlAccess för att dynamiskt utföra striktare åtkomstkontroll än den som anges av värdet RequiredAccess i definitionen av I/O-kontrollkoden.

  • Läs eller skriv aldrig mer data än bufferten som pekas på av Irp-AssociatedIrp.SystemBuffer> kan innehålla. Kontrollera därför alltid Parameters.DeviceIoControl.InputBufferLength eller Parameters.DeviceIoControl.OutputBufferLength i IO_STACK_LOCATION-strukturen för att fastställa buffertgränser.

  • Alltid nollställ drivrutinsallokerade buffertar som kommer att innehålla data avsedda för ett program som initierade en IOCTL-begäran. På så sätt kopierar du inte känsliga data av misstag till programmet.

  • Följ reglerna ovan för METHOD_IN_DIRECT och METHOD_OUT_DIRECT överföringar. Kontrollera dessutom om det finns ett NULL-returvärde från MmGetSystemAddressForMdlSafe, vilket indikerar att mappningen misslyckades eller att en buffert med noll längd angavs.

  • För METHOD_NEITHER överföringar följer du de regler som anges i Använda varken buffrad eller direkt I/O.