Bagikan melalui


Menangani Peniruan Klien di Driver UMDF

Topik ini menjelaskan bagaimana driver User-Mode Driver Framework (UMDF) mengakses sumber daya yang dilindungi, mulai dari UMDF versi 2.

Driver UMDF biasanya berjalan di bawah akun LocalService dan tidak dapat mengakses file atau sumber daya yang memerlukan kredensial pengguna, seperti file yang dilindungi atau sumber daya lain yang dilindungi. Driver UMDF biasanya beroperasi pada perintah dan data yang mengalir antara aplikasi klien dan perangkat. Oleh karena itu, sebagian besar driver UMDF tidak mengakses sumber daya yang dilindungi.

Namun, beberapa driver mungkin memerlukan akses ke sumber daya yang dilindungi. Misalnya, driver UMDF mungkin memuat firmware ke perangkat dari file yang disediakan aplikasi klien. File mungkin memiliki daftar kontrol akses (ACL) yang mencegah pengguna yang tidak sah memodifikasi file dan mengendalikan perangkat. Sayangnya, ACL ini juga mencegah driver UMDF mengakses file.

Kerangka kerja ini menyediakan kemampuan peniruan yang memungkinkan driver untuk meniru klien driver dan mendapatkan hak akses klien ke sumber daya yang dilindungi.

Mengaktifkan Peniruan

Paket penginstalan driver UMDF dan aplikasi klien harus mengaktifkan kemampuan peniruan kerangka kerja, sebagai berikut:

  • File INF dari paket penginstalan driver UMDF harus menyertakan direktif UmdfImpersonationLevel dan mengatur tingkat peniruan maksimum yang diizinkan. Peniruan hanya diaktifkan jika file INF menyertakan direktif UmdfImpersonationLevel . Untuk informasi selengkapnya tentang mengatur tingkat peniruan, lihat Menentukan Arahan WDF dalam File INF.

  • Aplikasi klien harus mengatur tingkat peniruan yang diizinkan untuk setiap handel file. Aplikasi ini menggunakan pengaturan kualitas layanan (QoS) dalam fungsi Microsoft Win32 CreateFile untuk mengatur tingkat peniruan yang diizinkan. Untuk informasi selengkapnya tentang pengaturan ini, lihat parameter dwFlagsAndAttributes dari CreateFile dalam dokumentasi Windows SDK.

Menangani Peniruan Identitas untuk Permintaan I/O

Driver UMDF dan kerangka kerja menangani peniruan identitas untuk permintaan I/O dalam urutan berikut:

  1. Driver memanggil metode WdfRequestImpersonate untuk menentukan tingkat peniruan yang diperlukan dan fungsi panggilan balik EvtRequestImpersonate .

  2. Kerangka kerja memeriksa tingkat peniruan yang diminta. Jika tingkat yang diminta lebih besar dari tingkat yang diizinkan oleh paket penginstalan driver UMDF dan aplikasi klien, permintaan peniruan gagal. Jika tidak, kerangka kerja meniru klien dan segera memanggil fungsi panggilan balik EvtRequestImpersonate .

Fungsi panggilan balik EvtRequestImpersonate hanya harus melakukan operasi yang memerlukan tingkat peniruan yang diminta, seperti membuka file yang dilindungi.

Kerangka kerja tidak mengizinkan fungsi panggilan balik EvtRequestImpersonate driver untuk memanggil salah satu metode objek kerangka kerja. Ini memastikan bahwa driver tidak mengekspos tingkat peniruan ke fungsi panggilan balik driver lainnya atau driver lainnya.

Sebagai praktik terbaik, driver Anda tidak boleh mengaktifkan pembatalan permintaan I/O sebelum memanggil WdfRequestImpersonate untuk permintaan tersebut.

Metode WdfRequestImpersonate hanya memberikan tingkat peniruan yang diminta driver.

Meneruskan Kredensial ke Bawah Tumpukan Driver

Ketika driver Anda menerima permintaan I/O yang diketik WdfRequestTypeCreate, driver mungkin meneruskan permintaan I/O ke bawah tumpukan driver ke driver mode kernel. Driver mode kernel tidak memiliki kemampuan peniruan yang disediakan WdfRequestImpersonate untuk driver UMDF.

Oleh karena itu, jika Anda ingin driver mode kernel menerima kredensial pengguna klien (bukan kredensial proses host driver), driver harus mengatur bendera WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT ketika memanggil WdfRequestSend untuk mengirim permintaan pembuatan ke target I/O. Metode Kirim mengembalikan kode kesalahan jika upaya peniruan gagal, kecuali driver juga mengatur bendera WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE .

Contoh berikut menunjukkan bagaimana driver UMDF mungkin menggunakan bendera WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT untuk mengirim permintaan pembuatan file ke target I/O. File INF driver juga harus menyertakan direktif UmdfImpersonationLevel seperti yang dijelaskan di atas.

WDFIOTARGET iotarget;
WDF_REQUEST_SEND_OPTIONS options;
NTSTATUS status;
WDF_REQUEST_PARAMETERS params;
ULONG sendFlags;  
 
WDF_REQUEST_PARAMETERS_INIT(&params);
WdfRequestGetParameters(Request, &params);
   
sendFlags = WDF_REQUEST_SEND_OPTION_SYNCHRONOUS;
if (params.Type == WdfRequestTypeCreate) {
    sendFlags |= WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT;
}
   
WDF_REQUEST_SEND_OPTIONS_INIT(&options, sendFlags);
if (WdfRequestSend(Request,
                   iotarget,
                   &options
                   ) == FALSE) {
    status = WdfRequestGetStatus(Request);
}

Driver tidak harus memanggil WdfRequestImpersonate sebelum mengirim permintaan ke target I/O.

Jika driver tingkat bawah juga meneruskan permintaan, tingkat peniruan klien akan menyusuri tumpukan driver.

Mengurangi Ancaman Keamanan

Untuk mengurangi kemungkinan serangan "elevasi", Anda harus:

  • Cobalah untuk menghindari penggunaan peniruan identitas.

    Misalnya, untuk menghindari penggunaan peniruan identitas untuk membuka file yang harus digunakan driver, aplikasi klien dapat membuka file dan menggunakan operasi I/O untuk mengirim konten file ke driver.

  • Gunakan tingkat peniruan terendah yang diperlukan driver Anda.

    Atur tingkat peniruan dalam file INF driver Anda serendah mungkin. Jika driver Anda tidak memerlukan peniruan, jangan sertakan direktif UmdfImpersonationLevel dalam file INF.

  • Minimalkan peluang bagi penyerang untuk mengeksploitasi pengemudi Anda.

    Fungsi panggilan balik EvtRequestImpersonate Anda harus berisi bagian kecil kode yang hanya melakukan operasi yang memerlukan peniruan. Misalnya, jika driver Anda mengakses file yang dilindungi, driver hanya memerlukan peniruan ketika membuka handel file. Tidak memerlukan peniruan untuk membaca dari atau menulis ke file.