Bagikan melalui


Masalah Keamanan untuk Kode Kontrol I/O

Pemrosesan IRP aman yang berisi kode kontrol I/O tergantung pada menentukan kode IOCTL dengan benar dan pada memeriksa parameter yang diterima driver dengan IRP dengan hati-hati.

Saat menentukan kode IOCTL baru, gunakan aturan berikut:

  • Selalu tentukan nilai FunctionCode yang sama dengan atau lebih besar dari 0x800.

  • Selalu tentukan nilai RequiredAccess . Manajer I/O tidak mengirim IOCTL jika pemanggil memiliki hak akses yang tidak mencukup.

  • Jangan tentukan kode IOCTL yang memungkinkan penelepon membaca atau menulis area memori kernel nonspesfik.

Saat memproses kode IOCTL dalam driver, gunakan aturan berikut:

  • Setiap kali pengujian rutin pengiriman driver menerima kode IOCTL, mereka harus selalu menguji seluruh nilai 32-bit.

  • Driver dapat menggunakan IoValidateDeviceIoControlAccess untuk melakukan pemeriksaan akses yang lebih ketat secara dinamis daripada yang ditentukan oleh nilai RequiredAccess dalam definisi kode kontrol I/O.

  • Jangan pernah membaca atau menulis lebih banyak data daripada buffer yang ditujukan oleh Irp-AssociatedIrp.SystemBuffer> yang dapat ditampung. Oleh karena itu, selalu periksa Parameters.DeviceIoControl.InputBufferLength atau Parameters.DeviceIoControl.OutputBufferLength dalam struktur IO_STACK_LOCATION untuk menentukan batas buffer.

  • Selalu meniadakan buffer yang dialokasikan oleh driver yang akan berisi data yang diarahkan untuk aplikasi yang membuat permintaan IOCTL. Dengan begitu, Anda tidak akan secara tidak sengaja menyalin data sensitif ke aplikasi.

  • Untuk transfer METHOD_IN_DIRECT dan METHOD_OUT_DIRECT, ikuti aturan di atas. Selain itu, periksa nilai pengembalian NULL dari MmGetSystemAddressForMdlSafe, yang menunjukkan bahwa pemetaan gagal atau bahwa buffer dengan panjang nol disediakan.

  • Untuk transfer METHOD_NEITHER, ikuti aturan yang disediakan dalam Tidak Menggunakan I/O Buffered maupun Langsung.