Bagikan melalui


Pemindai Alamat Kernel (KASAN)

Kernel Address Sanitizer (KASAN) adalah teknologi deteksi bug yang didukung pada driver kernel Windows yang memungkinkan Anda mendeteksi beberapa kelas akses memori ilegal, seperti luapan buffer dan peristiwa bebas penggunaan. Ini mengharuskan Anda untuk mengaktifkan KASAN pada sistem Anda, dan mengkompilasi ulang driver kernel Anda dengan bendera kompilator MSVC tertentu.

Pre-requisites

Untuk menggunakan KASAN, Anda memerlukan:

  • Versi OS dari sistem target, tempat driver kernel Anda akan dimuat:
    • Klien: Windows 11 24H2 atau lebih tinggi.
    • Server: Windows Server 2025 atau lebih tinggi.
  • VisualStudio: versi 17.11 atau lebih tinggi.
  • WDK: versi 10.0.26100.2161 atau lebih tinggi.

KASAN hanya didukung pada x64.

Cara mengaktifkan KASAN pada driver kernel Anda

  1. Masukkan baris perintah berikut di jendela Prompt Perintah administrator pada sistem target:

    reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
    

    Mengatur kunci registri ini menginstruksikan kernel Windows untuk mempersiapkan dan menerima pemuatan driver KASAN yang sudah diinstrumentasi. Tidak mengatur kunci registri ini menyebabkan kernel Windows menolak memuat driver berinstrumentasi KASAN.

  2. Reboot sistem target Anda agar perubahan diterapkan.

  3. Kompilasi ulang driver kernel Anda dengan instrumentasi KASAN diaktifkan dengan meneruskan bendera baru ke pengkompilasi MSVC. Gunakan salah satu metode berikut:

    • GUI: di VisualStudio, navigasikan ke Penjelajah Solusi, klik kanan pada proyek driver kernel Anda, dan pilih Properti. Di halaman properti, navigasikan ke Properti Konfigurasi>>C/C++>>General, dan atur Aktifkan Sanitizer Alamat Kernel ke Ya. Kemudian bangun kembali solusi Anda.
    • Prompt perintah: tambahkan parameter /fsanitize=kernel-address ke baris perintah compiler Anda. Kemudian, bangun kembali solusi Anda.
  4. Muat driver kernel kompilasi ulang Anda pada sistem target Anda, dan uji stres seperti biasanya. KASAN beroperasi pada runtime dan melaporkan peristiwa akses memori ilegal melalui Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS.

Regresi pada Visual Studio 17.12

Jika Anda menggunakan VisualStudio 17.12, Anda mungkin mengalami kesalahan build berikut:

error LNK2019: unresolved external symbol __asan_wrap_wcscat referenced in function

Anda dapat mengatasi kesalahan ini dengan menambahkan bendera berikut ke baris perintah linker Anda:

/alternatename:__asan_wrap_wcscat=wcscat

Regresi ini diperbaiki di VisualStudio 17.14.15.

Regressi pada VisualStudio versi 17.14 hingga 17.14.14

Jika Anda menggunakan VisualStudio 17.14, Anda mungkin mengalami kesalahan build berikut:

error LNK2001: unresolved external symbol __LINK_WITH_asan_compat.lib_TO_USE_NEW_COMPILER_WITH_OLDER_ASAN_RUNTIME

Anda dapat mengatasi kesalahan ini dengan menambahkan bendera berikut ke baris perintah pengkompilasi Anda:

/fno-sanitize-address-asan-compat-lib

Dan bendera berikut ke baris perintah linker Anda:

/alternatename:__asan_wrap_wcscat=wcscat
/alternatename:__asan_wrap_wcscpy=wcscpy
/alternatename:__asan_wrap_wcsncpy=wcsncpy

Regresi ini diperbaiki di VisualStudio 17.14.15.

Cara memverifikasi bahwa KASAN diaktifkan pada driver kernel Anda

Driver kernel yang dikompilasi dengan KASAN memiliki bagian PE yang disebut "KASAN". Verifikasi bahwa KASAN diaktifkan pada driver Anda dengan menjalankan perintah berikut di Prompt Perintah Pengembang:

dumpbin /ALL YourDriver.sys

Jika output berisi bagian yang disebut "KASAN", maka KASAN diaktifkan pada driver Anda.

Cara menganalisis laporan KASAN

Ketika KASAN mendeteksi akses memori ilegal di driver Anda, KASAN mengeluarkan Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS. Periksa cadangan memori kernel yang dihasilkan untuk menentukan di mana tepatnya driver Anda melakukan akses memori ilegal.

Gunakan KASAN dengan debugger kernel yang melekat pada sistem target sehingga memori dapat diperiksa secara dinamis segera setelah pemeriksaan bug dikeluarkan, daripada post-mortem dengan cadangan memori.

Parameter pemeriksaan bug

Parameter Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS adalah:

  1. Parameter 1: Alamat diakses secara ilegal.
  2. Parameter 2: Ukuran akses memori.
  3. Parameter 3: Alamat pemanggil yang melakukan akses memori ilegal.
  4. Parameter 4: Informasi tambahan tentang akses memori:
    • Bit [0:7]: kode bayangan KASAN. Lihat tabel di bawah.
    • Bit 8: 1 jika aksesnya adalah tulis, 0 jika itu adalah bacaan.

Kode bayangan KASAN

Di KASAN, kami menganggap bahwa semua memori kernel dibagi menjadi bagian-bagian berupa sel berukuran delapan byte dan selaras delapan byte. Dengan KASAN, setiap sel delapan byte dalam memori kernel memiliki kode bayangan yang terkait dengannya, yang merupakan bilangan bulat satu byte yang menunjukkan validitas sel. Pengodean kode bayangan adalah sebagai berikut:

Value Meaning
0x00 Sel sepenuhnya valid: akses ke semua delapan byte sel legal.
0x01 ->0x07 Sel ini sebagian valid: nilai byte pertama dalam sel valid, tetapi sisanya tidak valid.
0x08 ->0x7F Sel valid secara kondisional: akses ke semua delapan byte sel dapat legal atau ilegal tergantung pada kondisi tertentu.
>= 0x80 Sel sepenuhnya tidak valid: akses ke semua delapan byte sel ilegal.

Beberapa sub-kode digunakan untuk sel yang valid secara kondisional dan sepenuhnya tidak valid untuk lebih menunjukkan jenis memori apa yang dikaitkan dengan sel, dan mengapa akses ke sel tersebut mungkin ilegal.

Sub-kode yang digunakan oleh sel yang valid secara kondisional:

  • 0x09: memori yang dapat di-page, yang ilegal untuk diakses pada DISPATCH_LEVEL atau di atasnya, tetapi dapat diakses secara legal dalam kondisi lain.

Sub-kode yang digunakan oleh sel yang sepenuhnya tidak valid:

  • 0x81: redzone kiri alloca.
  • 0x82: redzone tengah alloca.
  • 0x83: redzone kanan alloca.
  • 0x84: redzone kanan variabel global.
  • 0x85: redzone generik.
  • 0x86: redzone kanan memori kumpulan.
  • 0x87: memori pool yang dibebaskan.
  • 0x8A: redzone kiri memori yang bersebelahan.
  • 0x8B: redzone kanan memori yang bersebelahan.
  • 0x8C: memori lookasidelist bebas.
  • 0x8D: redzone kiri memori kumpulan.
  • 0xF1: redzone kiri variabel tumpukan.
  • 0xF2: redzone tengah variabel tumpukan.
  • 0xF3: redzone kanan variabel tumpukan.
  • 0xF5: variabel tumpukan used-after-ret.
  • 0xF8: variabel tumpukan di luar cakupan.

Memahami pemeriksaan bug KASAN: contoh

Asumsikan bahwa KASAN mengeluarkan pemeriksaan bug ketika driver Anda menjalankan, dengan parameter ini:

  1. Parameter 1: 0xFFFFFFFFFFFFABCD
  2. Parameter 2: 0x0000000000000004
  3. Parameter 3: 0xFFFFFFFF12345678
  4. Parameter 4: 0x0000000000000184

Parameter 1 memberi tahu Anda bahwa driver Anda mencoba mengakses alamat 0xFFFFFFFFFFFFABCD dan bahwa akses ini ilegal. Parameter 2 memberi tahu Anda bahwa itu adalah akses empat byte. Parameter 3 memberi Anda alamat pointer instruksi tempat driver Anda melakukan akses ilegal. Parameter 4 memberi tahu Anda bahwa ini adalah akses tulis, dan bahwa memori yang disentuh adalah redzone yang tepat dari variabel global.

Dengan kata lain, driver Anda kemungkinan mencoba melakukan luapan buffer tulis pada variabel global. Gunakan informasi ini untuk menyelidiki dan menentukan di mana dan cara memperbaiki bug ini di driver Anda.

Dampak performa KASAN

KASAN meningkatkan konsumsi memori kernel dan memperkenalkan perlambatan sekitar dua kali pada driver yang dikompilasi dengan KASAN diaktifkan.

Perbandingan dengan Driver Verifier

KASAN dan Driver Verifier adalah fitur yang sepenuhnya terpisah, tetapi saling kompatibel.

KASAN berfokus pada mendeteksi akses memori ilegal, dan lebih efisien daripada Driver Verifier di domain tersebut, karena menggunakan pendekatan yang lebih halus dan mencakup lebih banyak wilayah memori. Driver Verifier memiliki aturan khusus driver yang bertujuan untuk menemukan jenis bug lain, yang tidak dideteksi OLEH KASAN. Untuk informasi selengkapnya, lihat Microsoft: Memperkenalkan sanitizer kernel di platform Microsoft.

Gunakan KASAN bersama dengan Driver Verifier untuk memaksimalkan deteksi bug di driver Anda.

Resources