Sicherheitsprobleme für E/A-Steuerungscodes

Die sichere Verarbeitung von IRPs, die E/A-Steuercodes enthalten, hängt von der ordnungsgemäßen Definition von IOCTL-Codes und der sorgfältigen Untersuchung der Parameter ab, die der Treiber mit dem IRP empfängt.

Verwenden Sie beim Definieren neuer IOCTL-Codes die folgenden Regeln:

  • Geben Sie immer einen FunctionCode-Wert an, der gleich oder größer als 0x800 ist.

  • Geben Sie immer einen RequiredAccess-Wert an. Der E/A-Manager sendet keine IOCTLs, wenn der Aufrufer über unzureichende Zugriffsrechte verfügt.

  • Definieren Sie keine IOCTL-Codes, mit denen Aufrufer unspezifische Bereiche des Kernelspeichers lesen oder schreiben können.

Verwenden Sie bei der Verarbeitung von IOCTL-Codes innerhalb eines Treibers die folgenden Regeln:

  • Wenn der Test der Dispatchroutinen eines Treibers IOCTL-Codes erhalten hat, muss er immer den gesamten 32-Bit-Wert testen.

  • Treiber können IoValidateDeviceIoControlAccess verwenden, um eine strengere Zugriffsüberprüfung als die durch den RequiredAccess-Wert in der Definition des E/A-Steuerungscodes angegebene dynamisch durchzuführen.

  • Lesen oder schreiben Sie niemals mehr Daten, als der Puffer enthalten kann, auf den Irp-AssociatedIrp.SystemBuffer> verweist. Überprüfen Sie daher immer Parameters.DeviceIoControl.InputBufferLength oder Parameters.DeviceIoControl.OutputBufferLength in der IO_STACK_LOCATION-Struktur , um Puffergrenzwerte zu bestimmen.

  • Immer 00 Treiber zugeordnete Puffer, die Daten enthalten, die für eine Anwendung bestimmt sind, die eine IOCTL-Anforderung erstellt hat. Auf diese Weise kopieren Sie vertrauliche Daten nicht versehentlich in die Anwendung.

  • Befolgen Sie für METHOD_IN_DIRECT- und METHOD_OUT_DIRECT-Übertragungen die oben genannten Regeln. Überprüfen Sie darüber hinaus nach einem NULL-Rückgabewert von MmGetSystemAddressForMdlSafe, der angibt, dass die Zuordnung fehlgeschlagen ist oder dass ein Puffer der Länge null angegeben wurde.

  • Befolgen Sie für METHOD_NEITHER Übertragungen die Regeln, die unter Verwenden von weder gepufferten noch direkten E/A-Vorgängen bereitgestellt werden.