Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menyediakan daftar periksa keamanan driver bagi pengembang driver untuk membantu mengurangi risiko driver disusupi. Keamanan driver sangat penting dan berdampak langsung pada keandalan. Ketika Windows mendeteksi bahwa akses memori yang salah sedang berlangsung, itu akan mematikan OS dan menampilkan layar kesalahan biru. Sebagai mitra Windows, Anda harus bekerja untuk mengurangi dampak signifikan yang dimiliki driver yang gagal pada kehidupan pelanggan kami.
Untuk informasi selengkapnya tentang manfaat menyediakan driver yang aman dan andal, lihat panduan keamanan driver .
Gambaran umum keamanan driver
Kelemahan keamanan adalah kelemahan apa pun yang memungkinkan penyerang menyebabkan driver tidak berfungsi sewaktu-waktu sehingga memungkinkan penyerang untuk mendapatkan akses yang tidak sah, memanipulasi sistem, atau membahayakan data, berpotensi menyebabkan sistem mengalami crash atau menjadi tidak dapat digunakan. Selain itu, kerentanan dalam kode driver dapat memungkinkan penyerang untuk mendapatkan akses ke kernel, menciptakan kemungkinan mengorbankan seluruh OS.
Ketika sebagian besar pengembang mengerjakan driver mereka, fokus mereka adalah membuat driver berfungsi dengan baik, dan bukan pada apakah penyerang berbahaya akan mencoba mengeksploitasi kerentanan dalam kode mereka. Namun, setelah pengemudi dilepaskan, penyerang dapat mencoba memeriksa dan mengidentifikasi kelemahan keamanan. Pengembang harus mempertimbangkan masalah ini selama fase desain dan implementasi untuk meminimalkan kemungkinan kerentanan tersebut. Tujuannya adalah untuk menghilangkan semua kelemahan keamanan yang diketahui sebelum pengemudi dilepaskan.
Menciptakan driver yang lebih aman membutuhkan kerja sama arsitek sistem (secara sadar memikirkan potensi ancaman terhadap pengemudi), pengembang yang menerapkan kode (mengkodekan operasi umum secara defensif yang dapat menjadi sumber eksploitasi), dan tim uji (secara proaktif mencoba menemukan kelemahan dan kerentanan). Dengan mengoordinasikan semua aktivitas ini dengan benar, Anda dapat secara dramatis meningkatkan keamanan pengemudi.
Selain menghindari masalah yang terkait dengan driver yang diserang, banyak langkah yang dijelaskan, seperti penggunaan memori kernel yang lebih tepat, akan meningkatkan keandalan driver Anda. Ini mengurangi biaya dukungan dan meningkatkan kepuasan pelanggan dengan produk Anda. Menyelesaikan tugas dalam daftar periksa di bawah ini akan membantu mencapai semua tujuan ini.
Daftar periksa Keamanan:Selesaikan tugas keamanan yang dijelaskan dalam masing-masing topik ini.
Mengonfirmasi bahwa driver kernel diperlukan
Mengelola kontrol akses pengemudi
Mengontrol akses hanya untuk driver perangkat lunak
Ikuti panduan pengkodean aman untuk driver
Terapkan kode yang kompatibel dengan HVCI
Mengikuti praktik terbaik kode khusus teknologi
Tambahkan anotasi SAL ke kode driver Anda
Menggunakan CodeQL untuk memeriksa kode driver Anda
Gunakan Pemverifikasi Driver untuk memeriksa kerentanan
Periksa kode dengan pengujian program kompatibilitas perangkat keras
Periksa driver yang siap dikirim dengan alat seperti BinSkim dan SignTool
Jangan menandatangani kode pengemudi uji untuk produksi
Memahami cara driver dilaporkan menggunakan Pusat Pelaporan Driver Rentan dan Berbahaya Microsoft
Tinjau sumber daya pengkodian aman
Tinjau ringkasan dari poin-poin penting
Pastikan bahwa pengandar kernel diperlukan
Item daftar periksa Keamanan #1:Konfirmasikan bahwa driver kernel diperlukan dan bahwa pendekatan risiko yang lebih rendah, seperti layanan atau aplikasi Windows, bukanlah opsi yang lebih baik.
Driver kernel tinggal di kernel Windows dan mengalami masalah saat mengeksekusi di kernel mengekspos seluruh sistem operasi. Jika ada opsi lain yang tersedia, kemungkinan biayanya lebih rendah dan memiliki lebih sedikit risiko terkait daripada membuat driver kernel baru.
Untuk informasi selengkapnya tentang menggunakan driver Windows bawaan, lihat Apakah Anda perlu menulis driver?.
Untuk informasi tentang menggunakan tugas latar belakang, lihat Dukung aplikasi Anda dengan tugas latar belakang.
Untuk informasi tentang menggunakan Layanan Windows, lihat layanan .
Gunakan kerangka kerja driver
Item daftar periksa Keamanan #2:Gunakan kerangka kerja driver untuk mengurangi ukuran kode Anda dan meningkatkan keandalan dan keamanannya.
Untuk mengurangi ukuran kode Anda dan meningkatkan keandalan dan keamanannya, gunakan Windows Driver Frameworks. Untuk memulai, tinjau Menggunakan WDF untuk Mengembangkan Driver. Untuk informasi penggunaan Kerangka Kerja Driver Mode Pengguna (UMDF) berisiko lebih rendah, lihat Memilih model driver.
Menulis driver Windows Driver Model (WDM) dengan gaya lama memakan waktu lebih lama, lebih mahal, dan melibatkan pembuatan ulang kode yang sudah tersedia dalam kerangka kerja driver.
Kode sumber Windows Driver Framework (WDF) adalah sumber terbuka dan tersedia di GitHub. Ini adalah kode sumber WDF yang sama yang dikirim di Windows. Anda dapat men-debug driver Anda lebih efektif ketika Anda dapat mengikuti interaksi antara driver dan WDF. Unduh dari https://github.com/Microsoft/Windows-Driver-Frameworks.
DMF - Kerangka Kerja Modul Driver
Pertimbangkan untuk menggunakan Driver Module Framework (DMF) di proyek driver Anda. Dikembangkan oleh tim Microsoft Surface, DMF adalah kerangka kerja yang memungkinkan pembuatan objek WDF yang disebut modul DMF. Kode untuk modul DMF ini dapat dibagikan di antara driver yang berbeda. Selain itu, DMF menyediakan pustaka modul DMF yang telah dikembangkan untuk driver dan menawarkan penggunaan ulang kode untuk tugas-tugas seperti utas dan manajemen I/O. Modul DMF merangkum tugas driver ke dalam unit yang lebih kecil. Setiap modul mandiri dan memiliki kode, konteks, dan panggilan baliknya sendiri, sehingga lebih mudah digunakan kembali. Untuk informasi selengkapnya, lihat Memperkenalkan Kerangka Kerja Modul Driver dan dokumentasi situs GitHub .
Pengelolaan kontrol akses pengemudi
Item #3 dalam Daftar Periksa Keamanan:Tinjau pengemudi Anda untuk memastikan bahwa Anda mengontrol akses dengan benar.
Mengelola pengendalian akses driver - WDF
Driver harus bekerja untuk mencegah pengguna mengakses perangkat dan file komputer secara tidak tepat. Untuk mencegah akses tidak sah ke perangkat dan file, Anda harus:
Beri nama objek perangkat hanya jika diperlukan. Objek perangkat bernama umumnya hanya diperlukan karena alasan warisan, misalnya jika Anda memiliki aplikasi yang mengharapkan untuk membuka perangkat menggunakan nama tertentu atau jika Anda menggunakan perangkat/kontrol non-PNP. Driver WDF tidak perlu memberi nama FDO perangkat PnP mereka untuk membuat tautan simbolis menggunakan WdfDeviceCreateSymbolicLink.
Akses aman ke objek dan antarmuka perangkat.
Untuk mengizinkan aplikasi atau driver WDF lainnya mengakses PDO perangkat PnP Anda, Anda harus menggunakan antarmuka perangkat. Untuk informasi selengkapnya, lihat Menggunakan Antarmuka Perangkat. Antarmuka perangkat berfungsi sebagai tautan simbolis ke PDO dari tumpukan perangkat Anda.
Salah satu cara yang lebih baik untuk mengontrol akses ke PDO adalah dengan menentukan string SDDL di INF Anda. Jika string SDDL tidak ada dalam file INF, Windows menerapkan pendeskripsi keamanan default. Untuk informasi selengkapnya, lihat Mengamankan Objek Perangkat dan SDDL untuk Objek Perangkat.
Untuk informasi selengkapnya tentang mengontrol akses, lihat:
Mengendalikan Akses Perangkat di Driver KMDF
Nama, Deskriptor Keamanan, dan Kelas Perangkat - Membuat Objek Perangkat Dapat Diakses... dan AMAN dari Januari dan Februari 2017 Buletin NT Insider diterbitkan oleh OSR.
Mengelola pengendalian akses driver - WDM
Jika Anda bekerja dengan Driver WDM dan menggunakan objek perangkat bernama, Anda dapat menggunakan IoCreateDeviceSecure dan menentukan SDDL untuk mengamankannya. Saat Anda menerapkan IoCreateDeviceSecure selalu menentukan GUID kelas kustom untuk DeviceClassGuid. Jangan tentukan GUID kelas yang sudah ada di sini. Melakukannya berpotensi merusak pengaturan keamanan atau kompatibilitas untuk perangkat lain milik kelas tersebut. Untuk informasi selengkapnya, lihat WdmlibIoCreateDeviceSecure.
Untuk informasi selengkapnya, lihat:
Mengendalikan Akses Ruang Nama Perangkat
model keamanan Windows untuk pengembang driver
Hierarki risiko Pengidentifikasi Keamanan (SID)
Bagian berikut menjelaskan hierarki risiko SID umum yang digunakan dalam kode driver. Untuk informasi umum tentang SDDL, lihat SDDL untuk Objek-Objek Perangkat, String SID, dan Sintaks String SDDL.
Penting untuk dipahami bahwa jika penelepon hak istimewa yang lebih rendah diizinkan untuk mengakses kernel, risiko kode ditingkatkan. Dalam diagram ringkasan ini, risiko meningkat saat Anda mengizinkan akses SID hak istimewa yang lebih rendah ke fungsionalitas driver Anda.
SY (System)
\/
BA (Built-in Administrators)
\/
LS (Local Service)
\/
BU (Built-in User)
\/
AC (Application Container)
Mengikuti prinsip keamanan hak istimewa paling sedikit umum, konfigurasikan hanya tingkat akses minimum yang diperlukan agar driver Anda berfungsi.
Kontrol keamanan WDM Granular IOCTL
IOCTL (Kontrol Input/Output) di Windows adalah sebuah panggilan sistem untuk operasi input/output khusus perangkat. IOCTL digunakan oleh aplikasi untuk berkomunikasi dengan driver perangkat, memungkinkan mereka mengirim perintah atau meminta informasi dari perangkat keras. Untuk informasi selengkapnya, lihat Pengenalan Kode Kontrol I/O dan Contoh Permintaan I/O - Gambaran Umum.
Untuk mengelola keamanan lebih lanjut saat pemanggil mode pengguna mengirim IOCTL, kode driver dapat menyertakan fungsi IoValidateDeviceIoControlAccess . Fungsi ini memungkinkan driver untuk memeriksa hak akses. Setelah menerima IOCTL, driver dapat memanggil IoValidateDeviceIoControlAccess, menentukan FILE_READ_ACCESS, FILE_WRITE_ACCESS, atau keduanya.
Menerapkan kontrol keamanan IOCTL terperinci tidak menggantikan kebutuhan untuk mengelola akses driver menggunakan teknik yang dibahas sebelumnya.
Untuk informasi selengkapnya, lihat Menentukan Kode Kontrol I/O dan Masalah Keamanan untuk Kode Kontrol I/O.
Mengontrol akses ke driver yang hanya untuk perangkat lunak
Item daftar periksa Keamanan #4:Jika driver khusus perangkat lunak akan dibuat, kontrol akses tambahan harus diterapkan.
Driver kernel yang hanya berbasis perangkat lunak tidak menggunakan plug-and-play (PnP) untuk dikaitkan dengan ID perangkat keras tertentu, dan dapat dioperasikan pada PC apa pun. Driver seperti itu dapat digunakan untuk tujuan selain yang awalnya dimaksudkan, menciptakan vektor serangan.
Karena driver kernel khusus perangkat lunak berisi risiko tambahan, mereka harus dibatasi untuk berjalan pada perangkat keras tertentu, misalnya dengan menggunakan ID PnP unik untuk mengaktifkan pembuatan driver PnP, atau dengan memeriksa tabel SMBIOS untuk keberadaan perangkat keras tertentu.
Misalnya, bayangkan OEM Fabrikam ingin mendistribusikan driver yang memungkinkan utilitas overclocking untuk sistem mereka. Jika driver khusus perangkat lunak ini dijalankan pada sistem dari OEM yang berbeda, ketidakstabilan atau kerusakan sistem dapat mengakibatkan. Sistem Fabrikam harus menyertakan ID PnP unik untuk memungkinkan pembuatan driver PnP yang juga dapat diperbarui melalui Windows Update. Jika ini tidak memungkinkan, dan Fabrikam menulis driver Warisan, driver tersebut harus menemukan metode lain untuk memverifikasi bahwa itu dijalankan pada sistem Fabrikam, misalnya, dengan memeriksa tabel SMBIOS sebelum mengaktifkan kemampuan apa pun.
Ikuti pedoman pengkodean aman untuk driver.
Item daftar periksa Keamanan #5:Tinjau kode Anda dan hapus kerentanan kode yang diketahui.
Aktivitas inti pembuatan driver aman adalah mengidentifikasi area dalam kode yang perlu diubah untuk menghindari kerentanan perangkat lunak yang diketahui. Banyak kerentanan perangkat lunak yang diketahui berfokus pada pemantauan ketat penggunaan memori untuk menghindari masalah yang diakibatkan oleh gangguan atau kompromi lokasi memori yang digunakan oleh driver Anda.
Alat pemindaian kode seperti CodeQL dan pengujian khusus driver, dapat digunakan untuk membantu menemukan, beberapa, tetapi tidak semua, dari kerentanan ini. Alat dan pengujian ini dijelaskan nanti dalam topik ini.
Buffer memori
Selalu periksa ukuran buffer input dan output untuk memastikan bahwa buffer dapat menyimpan semua data yang diminta. Untuk informasi selengkapnya, lihat Kegagalan Memeriksa Ukuran Buffer.
Menginisialisasi semua buffer output dengan benar dengan nol sebelum mengembalikannya ke pemanggil. Untuk informasi selengkapnya, lihat Kegagalan Inisialisasi Buffer Output.
Memvalidasi buffer dengan panjang variabel. Untuk informasi selengkapnya, lihat Kegagalan Memvalidasi Variable-Length Buffer. Untuk informasi selengkapnya tentang bekerja dengan buffer dan menggunakan ProbeForRead untuk memvalidasi alamat buffer, lihat Buffer Handling.
Gunakan metode yang sesuai untuk mengakses buffer data dengan IOCTL
Salah satu tanggung jawab utama driver Windows adalah mentransfer data antara aplikasi mode pengguna dan perangkat sistem. Tiga metode untuk mengakses buffer data diperlihatkan dalam tabel berikut.
| Jenis Buffer IOCTL | Ringkasan | Untuk informasi selengkapnya |
|---|---|---|
| METODE_BUFFERED | Direkomendasikan untuk sebagian besar situasi | Menggunakan I/O Terbuffer |
| METHOD_IN_DIRECT atau METHOD_OUT_DIRECT | Digunakan dalam beberapa I/O perangkat keras berkecepatan tinggi | Pemakaian I/O Langsung |
| METHOD_NEITHER | Hindari jika memungkinkan | Tidak Menggunakan Baik I/O Berpenyangga Maupun I/O Langsung |
Secara umum, I/O buffer disarankan karena menyediakan metode buffering yang paling aman. Namun, bahkan ketika menggunakan buffer I/O ada risiko, seperti pointer tertanam yang harus Anda atasi.
Untuk informasi selengkapnya tentang bekerja dengan buffer di IOCTL, lihat Metode untuk Mengakses Buffer Data.
Kesalahan saat menggunakan I/O yang di-buffer IOCTL
Periksa ukuran buffer terkait IOCTL. Untuk informasi selengkapnya, lihat Kegagalan Memeriksa Ukuran Buffer.
Menginisialisasi buffer output dengan benar. Untuk informasi selengkapnya, lihat Kegagalan Inisialisasi Buffer Output.
Memvalidasi buffer dengan panjang variabel dengan benar. Untuk informasi selengkapnya, lihat Kegagalan Memvalidasi Variable-Length Buffer.
Saat menggunakan I/O buffer, pastikan untuk mengembalikan panjang yang tepat untuk OutputBuffer di bidang Informasi struktur IO_STATUS_BLOCK . Jangan langsung mengembalikan panjang langsung dari permintaan READ. Misalnya, pertimbangkan situasi di mana data yang dikembalikan dari ruang pengguna menunjukkan bahwa ada buffer 4K. Jika driver sebenarnya hanya boleh mengembalikan 200 byte, tetapi malah mengembalikan 4K di bidang Informasi, telah terjadi kerentanan pengungkapan informasi. Masalah ini terjadi karena di versi Windows yang lebih lama, buffer yang digunakan Manajer I/O untuk Buffered I/O tidak nol. Dengan demikian, aplikasi pengguna mendapatkan kembali 200 byte data asli ditambah 4K-200 byte apa pun yang ada di buffer (konten kumpulan non-halaman). Skenario ini dapat terjadi dengan semua penggunaan Buffered I/O dan bukan hanya dengan IOCTLs.
Kesalahan dalam I/O langsung IOCTL
Tangani buffer dengan panjang nol dengan benar. Untuk informasi selengkapnya, lihat Kesalahan I/O Langsung.
Kesalahan dalam mereferensikan alamat ruang pengguna
Validasi pointer yang tertanam dalam permintaan buffer I/O. Untuk informasi selengkapnya, lihat Kesalahan dalam Mereferensikan Alamat Ruang Pengguna.
Validasi alamat apa pun di ruang pengguna sebelum mencoba menggunakannya, dengan menggunakan API seperti ProbeForRead.
Kode driver harus menggunakan memori dengan benar
Semua alokasi kumpulan driver harus berada di kumpulan yang tidak dapat dieksekusi (NX). Menggunakan kumpulan memori NX secara inheren lebih aman daripada menggunakan kumpulan memori non-halaman (NP) yang dapat dieksekusi, dan memberikan perlindungan yang lebih baik terhadap serangan buffer overflow.
Untuk memungkinkan driver mendukung virtualisasi HVCI, ada persyaratan memori tambahan. Untuk informasi selengkapnya, lihat Menerapkan kode yang kompatibel dengan HVCI nanti di artikel ini.
Kerentanan TOCTOU
Ada kerentanan pengecekan hingga penggunaan (TOCTOU) yang potensial saat menggunakan I/O langsung (untuk IOCTL atau untuk Baca/Tulis). Ketahuilah bahwa karena driver mengakses buffer data pengguna, aplikasi pengguna dapat secara bersamaan mengakses buffer data yang sama.
Untuk mengelola risiko ini, salin parameter apa pun yang perlu divalidasi dari buffer data pengguna ke memori yang hanya dapat diakses dari mode kernel, seperti tumpukan atau kumpulan. Kemudian, setelah data tidak dapat diakses oleh aplikasi pengguna, lakukan validasi dan kemudian olah data yang dikirimkan.
Pembacaan dan penulisan register khusus model MSR
Intrinsik pengkompilasi, seperti __readmsr dan __writemsr dapat digunakan untuk mengakses register khusus model. Jika akses ini diperlukan, pengemudi harus selalu memastikan bahwa register untuk dibaca atau ditulis dibatasi pada indeks atau rentang yang diharapkan.
Untuk informasi selengkapnya dan contoh kode, lihat Menyediakan kemampuan untuk membaca/menulis MSR dalam praktik terbaik untuk membatasi perilaku dengan hak istimewa tinggi dalam driver mode kernel.
Pegangan
- Validasi pengendali yang diteruskan antara mode pengguna dan memori pada mode kernel. Untuk informasi selengkapnya, lihat Manajemen Penanganan dan Kegagalan Memvalidasi Penanganan Objek.
Objek perangkat
Mengamankan objek perangkat. Untuk informasi selengkapnya, lihat Mengamankan Objek Perangkat.
Memvalidasi objek perangkat. Untuk informasi selengkapnya, lihat Kegagalan Memvalidasi Objek Perangkat.
IRPs
Paket Permintaan Windows I/O (IRP) digunakan untuk mengomunikasikan permintaan I/O antara sistem operasi dan driver mode kernel, merangkum semua informasi yang diperlukan dalam paket. IRP memfasilitasi transfer data asinkron, sinkronisasi, dan penanganan kesalahan, memastikan komunikasi yang efisien dan andal dengan perangkat keras. Untuk informasi selengkapnya, lihat Paket Permintaan I/O dan Gambaran Umum Windows I/O Model.
WDF dan IRP
Salah satu keuntungan menggunakan WDF adalah bahwa driver WDF biasanya tidak secara langsung mengakses IRP (I/O Request Packets). Misalnya, kerangka kerja mengonversi IRP WDM yang mewakili operasi baca, tulis, dan kontrol I/O perangkat menjadi objek permintaan kerangka kerja yang diterima KMDF/UMDF dalam antrean I/O. Jika memungkinkan, penggunaan WDF sangat disarankan.
Jika Anda perlu menulis driver WDM, tinjau panduan berikut.
Mengelola buffer I/O IRP dengan benar
Tinjau topik-topik ini yang mencakup cara memvalidasi nilai input IRP:
DispatchReadWrite Menggunakan I/O Berpenyangga
DispatchReadWrite Menggunakan I/O Langsung
Kesalahan dalam Masukan/Keluaran Langsung
Validasi nilai yang terkait dengan IRP, seperti alamat dan panjang buffer.
Jika Anda memilih untuk menggunakan Neither I/O, ketahuilah bahwa tidak seperti Baca dan Tulis, dan tidak seperti I/O Buffered dan I/O Langsung, saat menggunakan Neither I/O IOCTL, penunjuk dan panjang buffer tidak divalidasi oleh Manajer I/O.
Menangani operasi penyelesaian IRP dengan benar
Seorang pengemudi tidak boleh menyelesaikan IRP dengan nilai status STATUS_SUCCESS kecuali jika IRP tersebut benar-benar didukung dan diproses. Untuk informasi tentang cara yang benar untuk menangani penyelesaian IRP, lihat Menyelesaikan IRP.
Mengelola status penundaan driver IRP
Driver harus menandai IRP sebagai pending sebelum menyimpan IRP, dan harus mempertimbangkan untuk menyertakan panggilan ke IoMarkIrpPending dan penugasannya dalam urutan yang saling mengunci. Untuk informasi lebih lanjut, lihat Kegagalan Memeriksa Status Driver dan Menahan IRP Masuk Saat Perangkat Dijeda.
Menangani operasi pembatalan IRP dengan benar
Operasi pembatalan mungkin sulit untuk dikodekan dengan benar karena biasanya dijalankan secara asinkron. Masalah dalam kode yang menangani operasi pembatalan dapat tidak terdeteksi untuk waktu yang lama, karena kode ini biasanya tidak dieksekusi sering dalam sistem yang aktif. Pastikan untuk membaca dan memahami semua informasi yang disediakan di bawah Membatalkan IRP. Beri perhatian khusus pada Sinkronisasi Pembatalan IRP dan Poin yang Perlu Dipertimbangkan Saat Membatalkan IRP.
Salah satu cara yang direkomendasikan untuk meminimalkan masalah sinkronisasi yang terkait dengan operasi pembatalan adalah dengan menerapkan antrean IRP yang aman .
Kelola penghapusan IRP dan penutupan operasi dengan benar
Pastikan Anda memahami perbedaan antara permintaan IRP_MJ_CLEANUP dan IRP_MJ_CLOSE. Permintaan pembersihan tiba setelah aplikasi menutup semua handel pada objek file, tetapi terkadang sebelum semua permintaan I/O selesai. Permintaan penutupan tiba setelah semua permintaan I/O untuk objek file telah selesai atau dibatalkan. Untuk informasi selengkapnya, lihat yang berikut ini:
Rutin DispatchCreate, DispatchClose, dan DispatchCreateClose
Kesalahan dalam Menangani Operasi Pembersihan dan Penutupan
Untuk informasi selengkapnya tentang menangani IRP dengan benar, lihat Kesalahan Tambahan dalam Menangani IRP.
Gunakan fungsi yang aman
Gunakan fungsi string yang aman. Untuk informasi selengkapnya, lihat Menggunakan Fungsi String Aman.
Gunakan fungsi aritmatika yang aman. Untuk informasi selengkapnya, lihatlah Rutinitas Pustaka Bilangan Bulat Aman.
Gunakan fungsi konversi yang aman. Untuk informasi selengkapnya, lihat Ringkasan Kernel-Mode Fungsi Bilangan Bulat Aman
.
Masalah keamanan lainnya
Gunakan kunci atau urutan yang saling terkunci untuk mencegah kondisi persaingan. Untuk informasi selengkapnya, lihat Kesalahan di Lingkungan Multiproscessor.
Pastikan bahwa tidak ada filter Antarmuka Driver Transportasi (TDI) jaringan atau Penyedia Layanan Berlapis (LSP) yang diinstal oleh driver atau paket perangkat lunak terkait selama penginstalan atau penggunaan. Sebagai gantinya, gunakan API modern, seperti Windows Filtering Platform (WFP) .
Kerentanan kode tambahan
Selain kemungkinan kerentanan yang tercakup di sini, artikel ini memberikan informasi tambahan tentang cara meningkatkan keamanan kode driver mode kernel: Membuat Driver yang Andal Kernel-Mode.
Untuk informasi tambahan tentang pengkodan aman C dan C++, lihat Mengamankan sumber daya pengkodian di akhir artikel ini.
Menerapkan kode yang kompatibel dengan HVCI
Item daftar periksa Keamanan #6:Validasi bahwa driver Anda menggunakan memori sehingga kompatibel dengan HVCI.
Integritas memori dan kompatibilitas HVCI
Integritas memori, juga dikenal sebagai Hypervisor-protected Code Integrity (HVCI) menggunakan teknologi perangkat keras dan virtualisasi untuk mengisolasi fungsi pengambilan keputusan Code Integrity (CI) dari sisa sistem operasi. Saat menggunakan keamanan berbasis virtualisasi untuk mengisolasi CI, satu-satunya cara memori kernel dapat dieksekusi adalah melalui verifikasi CI. Ini berarti bahwa halaman memori kernel tidak pernah dapat ditulis dan Dapat Dieksekusi (W+X) dan kode yang dapat dieksekusi tidak dapat dimodifikasi secara langsung.
Untuk menerapkan kode yang kompatibel dengan HVCI, pastikan kode driver Anda melakukan hal berikut:
- Memilih ke NX secara default.
- Menggunakan API/bendera NX untuk alokasi memori (NonPagedPoolNx).
- Tidak menggunakan bagian yang dapat ditulis dan dapat dieksekusi.
- Tidak mencoba mengubah memori sistem yang dapat dieksekusi secara langsung.
- Tidak menggunakan kode dinamis dalam kernel.
- Tidak memuat file data sebagai file yang dapat dieksekusi.
- Perataan segmen adalah kelipatan dari 0x1000 (ukuran halaman). Misalnya, DRIVER_ALIGNMENT=0x1000.
Untuk informasi selengkapnya tentang menggunakan alat dan daftar panggilan memori yang tidak kompatibel, lihat Menerapkan kode yang kompatibel dengan HVCI.
Untuk informasi selengkapnya tentang pengujian keamanan dasar-dasar sistem terkait, lihat Uji Kesiapan Integritas Kode HyperVisor dan Hypervisor-Protected Code Integrity (HVCI).
Meningkatkan keamanan penginstalan perangkat
Item daftar periksa Keamanan #7:Tinjau panduan pembuatan dan penginstalan inf driver untuk memastikan Anda mengikuti praktik terbaik.
Ketika Anda membuat kode yang menginstal paket driver, Anda harus memastikan bahwa penginstalan perangkat Anda akan selalu dilakukan dengan cara yang aman. Penginstalan perangkat aman adalah penginstalan yang melakukan hal berikut:
- Membatasi akses ke perangkat dan kelas antarmuka perangkatnya
- Membatasi akses ke layanan driver yang dibuat untuk perangkat
- Melindungi file driver dari modifikasi atau penghapusan
- Membatasi akses ke entri registri perangkat
- Membatasi akses ke kelas WMI perangkat tersebut
- Menggunakan fungsi SetupAPI dengan benar
Untuk informasi selengkapnya, lihat yang berikut ini:
Membuat Penginstalan Perangkat Aman
Panduan Cara Menggunakan SetupAPI
Menggunakan Fungsi Instalasi Perangkat
Topik Tingkat Lanjut Penginstalan Perangkat dan Driver
Ikuti praktik terbaik kode khusus teknologi
Item daftar periksa Keamanan #8:Tinjau panduan khusus teknologi berikut untuk driver Anda.
Sistem Berkas
Untuk informasi selengkapnya tentang keamanan driver sistem file, lihat yang berikut ini:
Pengenalan Keamanan Sistem File
Masalah Keamanan Sistem File
Fitur Keamanan untuk Sistem File
Koeksistensi dengan Driver Filter Sistem File lainnya
Inisiatif Virus Microsoft
Microsoft Virus Initiative (MVI) membantu organisasi meningkatkan solusi keamanan yang diandalkan pelanggan kami untuk menjaga keamanannya. Microsoft menyediakan alat, sumber daya, dan pengetahuan untuk mendukung pengalaman bersama yang lebih baik dengan performa, keandalan, dan kompatibilitas yang hebat. Microsoft berkolaborasi dengan mitra MVI untuk mendefinisikan dan mengikuti Praktik Penyebaran Aman (SDP) untuk mendukung keamanan dan ketahanan pelanggan bersama kami.
Jika Anda adalah vendor anti-virus, lihat Microsoft Virus Initiative untuk mempelajari cara bergabung dengan MVI untuk bantuan lebih lanjut tentang penyebaran perangkat lunak. Untuk informasi tentang bagaimana vendor keamanan dapat memanfaatkan kemampuan keamanan Windows yang terintegrasi dengan lebih baik untuk meningkatkan keamanan dan keandalan, lihat praktik terbaik Keamanan Windows untuk mengintegrasikan dan mengelola alat keamanan.
NDIS - Jaringan
Untuk informasi tentang keamanan driver NDIS, lihat Masalah Keamanan untuk Driver Jaringan.
Printer
Untuk informasi terkait keamanan driver printer, lihat Pertimbangan Keamanan Driver Printer V4.
Masalah Keamanan untuk Driver Windows Image Acquisition (WIA)
Untuk informasi tentang keamanan WIA, lihat Masalah Keamanan untuk Driver Windows Image Acquisition (WIA).
Menambahkan anotasi SAL ke kode driver Anda
Item daftar periksa Keamanan #9:Tambahkan anotasi SAL ke kode driver Anda.
Bahasa anotasi kode sumber (SAL) menyediakan serangkaian anotasi yang dapat Anda gunakan untuk menjelaskan bagaimana fungsi menggunakan parameternya, asumsi yang dibuatnya tentang mereka, dan jaminan yang dibuatnya ketika selesai. Anotasi ditentukan dalam file header sal.h. Analisis kode Visual Studio untuk C++ menggunakan anotasi SAL untuk memodifikasi analisis fungsinya. Untuk informasi selengkapnya tentang SAL 2.0 untuk pengembangan driver Windows, lihat Anotasi SAL 2.0 untuk Driver Windows dan Menggunakan Anotasi SAL untuk Mengurangi Cacat Kode C/C++.
Untuk informasi umum tentang SAL, lihat artikel ini yang tersedia dari OSR. Anotasi SAL: Jangan Benci Saya Karena Saya Cantik
Melakukan peninjauan kode rekan
Item daftar periksa Keamanan #10:Melakukan tinjauan kode rekan sejawat, untuk mencari masalah yang tidak terdeteksi oleh alat dan proses lain
Cari peninjau kode berpengetahuan luas untuk mencari masalah yang mungkin Anda lewatkan. Pasangan mata kedua akan sering melihat masalah yang mungkin telah Anda abaikan.
Jika Anda tidak memiliki staf yang cocok untuk meninjau kode Anda secara internal, pertimbangkan untuk meminta bantuan dari luar untuk tujuan ini.
Melakukan analisis ancaman
Item daftar periksa Keamanan #11:Ubah model ancaman driver yang ada atau buat model ancaman kustom untuk driver Anda.
Dalam mempertimbangkan keamanan, metodologi umum adalah membuat model ancaman tertentu yang mencoba menggambarkan jenis serangan yang dimungkinkan. Teknik ini berguna saat merancang driver karena memaksa pengembang untuk mempertimbangkan vektor serangan potensial terhadap driver terlebih dahulu. Setelah mengidentifikasi potensi ancaman, pengembang driver kemudian dapat mempertimbangkan cara untuk mempertahankan terhadap ancaman ini untuk memperkuat keamanan keseluruhan komponen driver.
Untuk panduan tentang membuat model ancaman ringan untuk pengendali, lihat Pemodelan Ancaman untuk Pengendali. Artikel ini menyediakan contoh diagram model ancaman driver yang dapat Anda gunakan sebagai titik awal untuk driver Anda.
Praktik terbaik Security Development Lifecycle (SDL) dan alat terkait dapat digunakan oleh IHV dan OEM untuk meningkatkan keamanan produk mereka. Untuk informasi selengkapnya, lihat rekomendasi SDL untuk OEM.
Menggunakan CodeQL untuk memeriksa kode driver Anda
Item daftar periksa Keamanan #12:Gunakan CodeQL untuk memeriksa kerentanan dalam kode driver Anda.
CodeQL, oleh GitHub, adalah mesin analisis kode semantik, dan kombinasi serangkaian kueri keamanan yang luas bersama dengan platform yang kuat menjadikannya alat yang berharga untuk mengamankan kode driver. Untuk informasi selengkapnya, lihat CodeQL dan Uji Logo Alat Statis.
Gunakan Pemverifikasi Driver untuk memeriksa kerentanan
Item daftar periksa Keamanan #13:Gunakan Pemverifikasi Driver untuk memeriksa kerentanan dalam kode driver Anda.
Driver Verifier menggunakan serangkaian aturan antarmuka dan model sistem operasi untuk menentukan apakah driver berinteraksi dengan benar dengan sistem operasi Windows. Driver Verifier menemukan cacat dalam kode driver yang dapat menunjuk ke potensi bug pada driver.
Driver Verifier memungkinkan pengujian langsung driver. Driver Verifier memantau driver mode kernel Windows dan driver grafis untuk mendeteksi panggilan atau tindakan fungsi ilegal yang mungkin merusak sistem. Debugger terlampir, memungkinkan melihat eksekusi kode OS dan driver secara real time. Driver Verifier dapat membuat driver Windows mengalami berbagai stres dan tes untuk menemukan perilaku yang tidak tepat. Untuk informasi selengkapnya, lihat Driver Verifier.
Driver Verifier berfungsi dengan driver WDM dan KMDF. Untuk detail tentang apa yang dapat diperiksa, lihat topik berikut.
- Aturan untuk driver WDM
- Aturan untuk pengemudi KMDF
Untuk informasi selengkapnya tentang driver yang dapat bekerja dengan Driver Verifier, lihat Aturan Kepatuhan DDI
- Aturan untuk driver NDIS
- Aturan untuk Pengandar Storport
- Aturan Pengandar Audio
- Aturan untuk driver AVStream
Untuk membiasakan diri dengan Driver Verifier, Anda dapat menggunakan salah satu driver sampel (misalnya, sampel unggulan pemanggang roti: https://github.com/Microsoft/Windows-driver-samples/tree/main/general/toaster/toastDrv/kmdf/func/featured).
Periksa kode dengan pengujian program kompatibilitas perangkat keras
Item daftar periksa Keamanan #14:Gunakan pengujian program kompatibilitas perangkat keras terkait keamanan untuk memeriksa masalah keamanan.
Program kompatibilitas perangkat keras mencakup pengujian terkait keamanan yang dapat Anda gunakan untuk mencari kerentanan kode. Program Kompatibilitas Perangkat Keras Windows memanfaatkan pengujian di Windows Hardware Lab Kit (HLK). Pengujian Dasar-Dasar Perangkat HLK dapat digunakan pada baris perintah untuk menjalankan kode driver dan mengidentifikasi kelemahan. Untuk informasi umum tentang pengujian dasar-dasar perangkat dan program kompatibilitas perangkat keras, lihat Windows Hardware Lab Kit.
Pengujian berikut adalah contoh pengujian yang mungkin berguna untuk memeriksa kode driver untuk beberapa perilaku yang terkait dengan kerentanan kode:
DF - Uji fuzz IOCTL acak (Keandalan)
DF - Uji sub-pembukaan Fuzz (Keandalan)
DF - Uji ketahanan FSCTL dengan buffer panjang nol fuzz (Keandalan)
DF - Pengujian acak fuzz FSCTL (Keandalan)
DF - Uji API Fuzz Misc (Keandalan)
Anda juga dapat menggunakan fuzzing penundaan sinkronisasi Kernel yang disertakan dengan Driver Verifier.
Pengujian CHAOS (Concurrent Hardware and Operating System) menjalankan berbagai pengujian driver PnP, pengujian fuzz driver perangkat, dan pengujian sistem daya secara bersamaan. Untuk informasi selengkapnya, lihat Uji CHAOS (Prinsip-Prinsip Dasar Perangkat).
Pengujian penetrasi pada dasar-dasar perangkat melakukan berbagai bentuk serangan yang menggunakan input, yang merupakan bagian penting dalam pengujian keamanan. Pengujian Serangan dan Penetrasi dapat membantu mengidentifikasi kerentanan dalam antarmuka perangkat lunak. Untuk informasi selengkapnya, lihat Uji Penetrasi (Dasar-Dasar Perangkat).
Gunakan Device Guard - Compliance Test, bersama dengan alat lain yang dijelaskan dalam artikel ini, untuk mengonfirmasi bahwa driver Anda kompatibel dengan HVCI.
Alat pengujian kustom dan khusus domain
Pertimbangkan pengembangan pengujian keamanan khusus domain kustom. Untuk mengembangkan pengujian tambahan, kumpulkan input dari perancang asli perangkat lunak, serta sumber daya pengembangan yang tidak terkait yang terbiasa dengan jenis driver tertentu yang dikembangkan, dan satu atau beberapa orang yang terbiasa dengan analisis dan pencegahan intrusi keamanan.
Periksa driver yang siap dikirim dengan alat seperti BinSkim dan SignTool
Item daftar periksa Keamanan #15:Periksa kode yang dikompilasi dengan alat seperti BinSkim dan SignTool sebelum diunggah ke pusat mitra.
Gunakan alat seperti BinSkim dan SignTool untuk memeriksa file biner untuk memeriksa kode yang dikompilasi sebelum diunggah ke pusat mitra untuk didistribusikan menggunakan Windows Update. Memiliki alat untuk memeriksa biner yang dikompilasi, sebelum dikirimkan untuk didistribusikan, menambahkan lapisan perlindungan lain.
BinSkim
BinSkim dapat mengidentifikasi praktik pengkodean dan bangunan yang berpotensi membuat biner rentan. BinSkim memeriksa:
- Penggunaan set alat kompilator yang kedaluwarsa - Biner harus dikompilasi terhadap kumpulan alat kompilator terbaru sedapat mungkin untuk memaksimalkan penggunaan mitigasi keamanan tingkat kompiler dan yang disediakan OS saat ini.
- Pengaturan kompilasi yang tidak aman - Biner harus dikompilasi dengan pengaturan paling aman yang mungkin untuk mengaktifkan mitigasi keamanan yang disediakan OS, memaksimalkan kesalahan pengkompilasi dan pelaporan peringatan yang dapat ditindaklanjuti, antara lain.
- Masalah penandatanganan - Biner yang ditandatangani harus ditandatangani dengan algoritma yang kuat secara kriptografis.
BinSkim adalah alat sumber terbuka dan menghasilkan file output yang menggunakan format Format Pertukaran Hasil Analisis Statis (SARIF) . BinSkim menggantikan alat BinScope sebelumnya.
Untuk informasi selengkapnya tentang BinSkim, lihat Gunakan BinSkim untuk memeriksa biner dan Panduan Pengguna BinSkim .
SignTool
Gunakan SignTool untuk memeriksa file driver yang sudah ditandatangani untuk rilis. Untuk informasi selengkapnya, lihat Memverifikasi Tanda Tangan File Driver Release-Signed dan Memverifikasi Tanda Tangan File Katalog yang Ditandatangani oleh Sertifikat Rilis Komersial.
Jangan mengesahkan kode uji untuk produksi
Item daftar periksa Keamanan #16:Jangan tanda tangani kode produksi pengembangan, pengujian, dan pembuatan kode driver kernel.
Kode driver kernel yang digunakan untuk pengembangan, pengujian, atau manufaktur mungkin mencakup kemampuan berbahaya yang menimbulkan risiko keamanan. Kode berbahaya ini tidak boleh ditandatangani dengan sertifikat yang dipercaya oleh Windows. Mekanisme yang benar untuk mengeksekusi kode driver berbahaya adalah menonaktifkan Boot Aman UEFI, mengaktifkan BCD "TESTSIGNING", dan menandatangani kode pengembangan, pengujian, dan manufaktur menggunakan sertifikat yang tidak tepercaya (misalnya, yang dihasilkan oleh makecert.exe).
Kode yang ditandatangani oleh sertifikat penerbit perangkat lunak tepercaya (SPC) atau oleh tanda tangan Windows Hardware Quality Labs (WHQL) tidak boleh memfasilitasi pengakalan integritas dan teknologi keamanan kode Windows. Sebelum kode ditandatangani oleh tanda tangan SPC atau WHQL yang tepercaya, pertama pastikan kode tersebut mematuhi panduan dari Membuat Driver yang Andal Kernel-Mode. Selain itu kode tidak boleh berisi perilaku berbahaya apa pun, yang dijelaskan di bawah ini.
Contoh perilaku berbahaya meliputi yang berikut ini:
- Menyediakan kemampuan untuk memetakan kernel sembarang, memori fisik, atau memori perangkat ke mode pengguna.
- Menyediakan kemampuan untuk membaca atau menulis memori kernel, fisik, atau perangkat secara sembarang, termasuk input/output port (I/O).
- Menyediakan akses ke penyimpanan yang melewati kontrol akses Windows.
- Menyediakan kemampuan untuk memodifikasi perangkat keras atau firmware yang tidak dirancang untuk dikelola driver.
Jalankan penandatanganan driver rilis yang tepat dan distribusikan paket driver Anda menggunakan Windows Update
Item daftar periksa Keamanan #17:Gunakan portal mitra Windows untuk mengirimkan paket driver Anda untuk ditandatangani dan didistribusikan melalui Windows Update.
Sebelum Anda merilis paket driver ke publik, Anda mengirimkan paket untuk sertifikasi. Untuk informasi selengkapnya, lihat Uji performa dan kompatibilitas dan Mulai menggunakan program Perangkat Keras.
Menggunakan Windows Update sangat disarankan untuk distribusi paket driver. Windows Update menyediakan sistem distribusi yang kuat, aman, diskalakan secara global, dan sesuai peraturan yang harus digunakan untuk memberikan pembaruan driver. Untuk informasi selengkapnya, lihat Mendistribusikan paket driver.
Gunakan peluncuran bertahap dan Driver flighting di Pusat Mitra untuk Windows Hardware untuk mendistribusikan paket driver Anda dalam cincin Windows Insider yang ditentukan, sekaligus memberikan pemantauan dan evaluasi otomatis. Pantau peluncuran driver menggunakan langkah-langkah driver Microsoft, seperti persentase mesin yang tidak mengalami kerusakan mode kernel untuk mempertahankan kualitas.
Untuk deskripsi praktik penyebaran perangkat lunak yang aman, lihat CISA Penyebaran Perangkat Lunak Aman: Bagaimana Produsen Perangkat Lunak Dapat Memastikan Keandalan bagi Pelanggan.
Memahami cara pelaporan driver menggunakan Microsoft Vulnerable and Malicious Driver Reporting Center
Item daftar periksa keamanan #18: Memahami cara pelaporan driver menggunakan Microsoft Vulnerable and Malicious Driver Reporting Center
Siapa pun dapat mengirimkan driver yang dipertanyakan menggunakan Microsoft Vulnerable and Malicious Driver Reporting Center. Lihat entri blog ini untuk informasi tentang bagaimana driver dikirimkan untuk analisis - Tingkatkan keamanan kernel dengan Pusat Pelaporan Driver Rentan dan Berbahaya Microsoft yang Baru
Pusat Pelaporan dapat memindai dan menganalisis driver Windows yang dibangun untuk arsitektur x86 dan x64. Driver rentan dan berbahaya yang telah dipindai ditandai untuk analisis dan penyelidikan oleh Tim Driver Rentan Microsoft. Setelah konfirmasi driver yang rentan, pemberitahuan yang sesuai diberikan, dan mereka ditambahkan ke daftar blokir driver yang rentan. Untuk informasi selengkapnya, lihat Aturan blokir driver yang direkomendasikan Microsoft. Aturan ini diterapkan secara default ke perangkat yang diaktifkan integritas kode yang dilindungi Hypervisor (HVCI) dan Windows 10 dalam mode S.
Meninjau sumber daya pengkodian yang aman
Item daftar periksa keamanan #19:Tinjau sumber daya ini untuk memperluas pemahaman Anda tentang praktik terbaik pengembangan kode aman yang berlaku untuk pengembang driver.
Panduan Microsoft NISTIR 8397
Publikasi pemerintah Amerika Serikat NISTIR 8397: Pedoman Tentang Standar Minimum untuk Verifikasi Pengembang perangkat lunak oleh National Institute of Standards and Technology (NIST) berisi panduan tentang cara membangun perangkat lunak yang andal dan aman dalam bahasa pemrograman apa pun.
Membangun program C++ yang andal dan aman meringkas cara menggunakan produk pengembang Microsoft untuk C++ dan bahasa lain untuk mengikuti panduan NISTIR 8397.
Database kerentanan perangkat lunak yang diketahui NIST
National Vulnerability Database (NVD) adalah repositori kelemahan perangkat lunak terkait keamanan yang dapat dicari, termasuk driver Windows.
Gambaran Umum Database Kerentanan Nasional
Standar pengamanan kode
Carnegie Mellon University SEI CERT - C Coding Standard: Aturan untuk Mengembangkan Sistem yang Aman, Andal, dan Terlindungi (PDF).
MITRE - Kelemahan yang Diatasi oleh Standar Pengkodean Aman CERT C
Microsoft Visual Studio - Gunakan pemeriksa Panduan Inti C++
Organisasi Pengkodean Aman
Badan Keamanan Siber dan Infrastruktur (CISA)
Sumber Daya CISA
Carnegie Mellon University SEI CERT
OSR
OSR menyediakan pelatihan pengembangan driver dan layanan konsultasi. Artikel dari buletin OSR ini menyoroti masalah keamanan driver.
Nama, Deskriptor Keamanan, dan Kelas Perangkat - Membuat Objek Perangkat Dapat Diakses... dan AMAN
Anda Harus Menggunakan Perlindungan -- Di dalam & Keamanan Perangkat Driver
Pembatasan Pengendali Perangkat - Survei Teknik
Meltdown dan Spectre: Bagaimana dengan pengemudi?
Studi kasus kerentanan pada driver
Keamanan rantai pasokan perangkat lunak dan Tagihan Bahan Perangkat Lunak (SBOM)
SBOM menyediakan daftar bahan yang digunakan dalam pembuatan perangkat lunak, seperti perangkat lunak sumber terbuka, komponen, dan bahkan alat build yang mungkin digunakan. Hal ini memungkinkan produsen dan konsumen untuk dengan lebih baik menginventarisasi dan mengevaluasi lisensi-lisensi dan risiko-risiko kerentanan. Microsoft menggunakan SPDX (Software Package Data Exchange) sebagai format dokumen SBOM. Untuk informasi selengkapnya, lihat, Menghasilkan Tagihan Material Perangkat Lunak (SBOM) dengan SPDX pada Microsoft dan alat pembangkitan tagihan material perangkat lunak (SBOM) sumber terbuka Microsoft.
inisi atif Integritas, Transparansi, dan Kepercayaan Rantai Pasokan (SCITT) adalah serangkaian standar internet IETF untuk mengelola kepatuhan barang dan layanan di seluruh rantai pasokan end-to-end. SCITT mendukung verifikasi barang dan layanan yang sedang berlangsung di mana keaslian entitas, bukti, kebijakan, dan artefak dievaluasi. Tujuannya adalah bahwa tindakan entitas dapat dijamin berwenang, tidak dapat ditolak, tidak dapat diubah, dan dapat diaudit.
Buku
24 Dosa Mematikan Keamanan Perangkat Lunak: Kelemahan Pemrograman dan Cara Memperbaikinya oleh Michael Howard, David LeBlanc, dan John Viega
Menulis Perangkat Lunak Aman Edisi Kedua, Michael Howard dan David LeBlanc
Seni Penilaian Keamanan Perangkat Lunak: Mengidentifikasi dan Mencegah Kerentanan Perangkat Lunak, Mark Dowd, John McDonald dan Justin Schuh
Secure Coding di C dan C++ (Seri SEI dalam Rekayasa Perangkat Lunak) Edisi ke-2, Robert C. Seacord
Pemrograman Microsoft Windows Driver Model (Edisi Ke-2), Walter Oney
Mengembangkan Driver dengan Windows Driver Foundation (Referensi Pengembang), Penny Orwick dan Guy Smith
Pelatihan
Pelatihan kelas driver Windows tersedia dari vendor seperti berikut ini:
Pelatihan online pengkodian aman tersedia dari berbagai sumber. Misalnya, kursus ini tersedia dari coursera pada:
Mengidentifikasi Kerentanan Keamanan dalam Pemrograman C/C++.
SAFECode juga menawarkan pelatihan gratis:
Sertifikasi Profesional
CERT menawarkan Sertifikasi Profesional Secure Coding.
Ringkasan pengambilan kunci
Keamanan driver adalah usaha yang kompleks yang berisi banyak elemen, tetapi berikut adalah beberapa poin penting yang perlu dipertimbangkan:
Driver tinggal di kernel Windows, dan mengalami masalah saat menjalankan di kernel mengekspos seluruh sistem operasi. Karena itu, perhatikan keamanan pengendara dan rancang dengan mempertimbangkan keamanan.
Terapkan prinsip hak istimewa paling sedikit:
sebuah. Gunakan string SDDL yang ketat untuk membatasi akses ke driver.
b. Memperketat batasan pada IOCTL individu.
Buat model ancaman untuk mengidentifikasi vektor serangan dan pertimbangkan apakah ada yang dapat dibatasi lebih lanjut.
Berhati-hatilah dengan pointer yang disematkan yang diteruskan dari mode pengguna. Mereka perlu diperiksa, diakses dalam blok try except, dan rentan terhadap masalah waktu pengecekan dan waktu penggunaan (ToCToU) kecuali nilai buffer ditangkap dan dibandingkan.
Jika Anda tidak yakin, gunakan METHOD_BUFFERED sebagai metode buffering IOCTL.
Gunakan utilitas pemindaian kode seperti CodeQL untuk mencari kerentanan kode yang diketahui dan memulihkan masalah yang diidentifikasi.
Cari peninjau kode yang berpengetahuan luas untuk mencari masalah yang mungkin Terlewatkan.
Gunakan verifier driver dan uji driver Anda dengan beberapa input, termasuk kasus sudut.