Aracılığıyla paylaş


G/Ç Denetim Kodları için Güvenlik Sorunları

G/Ç denetim kodları içeren IRP'lerin güvenli bir şekilde işlenmesi, IOCTL kodlarının doğru şekilde tanımlanmasına ve sürücünün IRP ile aldığı parametreleri dikkatle incelemeye bağlıdır.

Yeni IOCTL kodları tanımlarken aşağıdaki kuralları kullanın:

  • Her zaman 0x800 eşit veya ondan büyük bir FunctionCode değeri belirtin.

  • Her zaman bir RequiredAccess değeri belirtin. Çağıranın erişim hakları yetersizse G/Ç yöneticisi IOCTL'leri göndermez.

  • Çağıranların çekirdek belleğinin özel olmayan alanlarını okumasına veya yazmasına izin veren IOCTL kodları tanımlamayın.

Bir sürücü içinde IOCTL kodlarını işlerken aşağıdaki kuralları kullanın:

  • Bir sürücünün dağıtım yordamları testinde IOCTL kodları alındığında her zaman 32 bit değerin tamamını test etmesi gerekir.

  • Sürücüler, G/Ç denetim kodunun tanımında RequiredAccess değeri tarafından belirtilenden daha sıkı erişim denetimini dinamik olarak gerçekleştirmek için IoValidateDeviceIoControlAccess kullanabilir.

  • Irp-AssociatedIrp.SystemBuffer> tarafından işaret edilen arabelleğin kapasitesini aşarak asla veri okumayın veya yazmayın. Bu nedenle, arabellek sınırlarını belirlemek için her zaman IO_STACK_LOCATION yapısında Parameters.DeviceIoControl.InputBufferLength veya Parameters.DeviceIoControl.OutputBufferLength öğesini denetleyin.

  • Sürücü tarafından tahsis edilmiş ve IOCTL isteği oluşturan bir uygulama için verileri içerecek olan arabellekleri her zaman sıfırlayın. Bu şekilde, hassas verileri yanlışlıkla uygulamaya kopyalamazsınız.

  • METHOD_IN_DIRECT ve METHOD_OUT_DIRECT aktarımları için yukarıdaki kuralları izleyin. Ayrıca, MmGetSystemAddressForMdlSafe fonksiyonunun dönüş değeri NULL ise, bu durum eşlemenin başarısız olduğunu veya sıfır uzunluklu bir arabellek sağlandığını belirtir.

  • METHOD_NEITHER aktarımları için Ne Arabelleğe Alınan Ne de Doğrudan G/Ç Kullanma bölümünde sağlanan kurallara uyun.