Dynamic-Link Library Security

Ketika aplikasi secara dinamis memuat pustaka tautan dinamis tanpa menentukan nama jalur yang sepenuhnya memenuhi syarat, Windows mencoba menemukan DLL dengan mencari sekumpulan direktori yang ditentukan dengan baik dalam urutan tertentu, seperti yang dijelaskan dalam Urutan Pencarian Pustaka Dynamic-Link. Jika penyerang mendapatkan kontrol atas salah satu direktori di jalur pencarian DLL, penyerang dapat menempatkan salinan DLL berbahaya di direktori tersebut. Ini kadang-kadang disebut serangan pramuat DLL atau serangan penanaman biner. Jika sistem tidak menemukan salinan DLL yang sah sebelum mencari direktori yang disusupi, sistem akan memuat DLL berbahaya. Jika aplikasi berjalan dengan hak istimewa administrator, penyerang mungkin berhasil dalam elevasi hak istimewa lokal.

Misalnya, aplikasi dirancang untuk memuat DLL dari direktori pengguna saat ini dan gagal dengan baik jika DLL tidak ditemukan. Aplikasi memanggil LoadLibrary hanya dengan nama DLL, yang menyebabkan sistem mencari DLL. Dengan asumsi mode pencarian DLL aman diaktifkan dan aplikasi tidak menggunakan urutan pencarian alternatif, sistem mencari direktori dalam urutan berikut:

  1. Direktori tempat aplikasi dimuat.
  2. Direktori sistem.
  3. Direktori sistem 16-bit.
  4. Direktori Windows.
  5. Direktori saat ini.
  6. Direktori yang tercantum dalam variabel lingkungan PATH.

Melanjutkan contoh, penyerang dengan pengetahuan tentang aplikasi mendapatkan kontrol dari direktori saat ini dan menempatkan salinan BERBAHAYA DLL di direktori tersebut. Ketika aplikasi mengeluarkan panggilan LoadLibrary , sistem mencari DLL, menemukan salinan BERBAHAYA DLL di direktori saat ini, dan memuatnya. Salinan berbahaya DLL kemudian berjalan dalam aplikasi dan mendapatkan hak istimewa pengguna.

Pengembang dapat membantu melindungi aplikasi mereka dari serangan pramuat DLL dengan mengikuti panduan berikut:

  • Jika memungkinkan, tentukan jalur yang sepenuhnya memenuhi syarat saat menggunakan fungsi LoadLibrary, LoadLibraryEx, CreateProcess, atau ShellExecute .

  • Gunakan bendera LOAD_LIBRARY_SEARCH dengan fungsi LoadLibraryEx , atau gunakan bendera ini dengan fungsi SetDefaultDllDirectories untuk membuat urutan pencarian DLL untuk proses lalu gunakan fungsi AddDllDirectory atau SetDllDirectory untuk memodifikasi daftar. Untuk informasi selengkapnya, lihat Urutan Pencarian Pustaka Dynamic-Link.

    Windows 7, Windows Server 2008 R2, Windows Vista, dan Windows Server 2008: Bendera dan fungsi ini tersedia pada sistem dengan KB2533623 terinstal.

  • Pada sistem dengan KB2533623 terinstal , gunakan bendera LOAD_LIBRARY_SEARCH dengan fungsi LoadLibraryEx , atau gunakan bendera ini dengan fungsi SetDefaultDllDirectories untuk membuat urutan pencarian DLL untuk proses lalu gunakan fungsi AddDllDirectory atau SetDllDirectory untuk mengubah daftar. Untuk informasi selengkapnya, lihat Urutan Pencarian Pustaka Dynamic-Link.

  • Pertimbangkan untuk menggunakan pengalihan DLL atau manifes untuk memastikan bahwa aplikasi Anda menggunakan DLL yang benar.

  • Saat menggunakan urutan pencarian standar, pastikan mode pencarian DLL aman diaktifkan. Ini menempatkan direktori pengguna saat ini nanti dalam urutan pencarian, meningkatkan kemungkinan Windows akan menemukan salinan DLL yang sah sebelum salinan berbahaya. Mode pencarian DLL aman diaktifkan secara default dimulai dengan Windows XP dengan Paket Layanan 2 (SP2) dan dikendalikan oleh nilai registri HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode . Untuk informasi selengkapnya, lihat Urutan Pencarian Pustaka Dynamic-Link.

  • Pertimbangkan untuk menghapus direktori saat ini dari jalur pencarian standar dengan memanggil SetDllDirectory dengan string kosong (""). Ini harus dilakukan sekali di awal proses inisialisasi, bukan sebelum dan sesudah panggilan ke LoadLibrary. Ketahuilah bahwa SetDllDirectory memengaruhi seluruh proses dan bahwa beberapa utas memanggil SetDllDirectory dengan nilai yang berbeda dapat menyebabkan perilaku yang tidak terdefinisi. Jika aplikasi Anda memuat DLL pihak ketiga, uji dengan hati-hati untuk mengidentifikasi ketidakcocokan apa pun.

  • Jangan gunakan fungsi SearchPath untuk mengambil jalur ke DLL untuk panggilan LoadLibrary berikutnya kecuali mode pencarian proses aman diaktifkan. Ketika mode pencarian proses aman tidak diaktifkan, fungsi SearchPath menggunakan urutan pencarian yang berbeda dari LoadLibrary dan kemungkinan akan terlebih dahulu mencari direktori pengguna saat ini untuk DLL yang ditentukan. Untuk mengaktifkan mode pencarian proses yang aman untuk fungsi SearchPath , gunakan fungsi SetSearchPathMode dengan BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. Ini memindahkan direktori saat ini ke akhir daftar pencarian SearchPath selama masa proses. Perhatikan bahwa direktori saat ini tidak dihapus dari jalur pencarian, jadi jika sistem tidak menemukan salinan DLL yang sah sebelum mencapai direktori saat ini, aplikasi masih rentan. Seperti halnya SetDllDirectory, memanggil SetSearchPathMode harus dilakukan di awal proses inisialisasi dan mempengaruhi seluruh proses. Jika aplikasi Anda memuat DLL pihak ketiga, uji dengan hati-hati untuk mengidentifikasi ketidakcocokan apa pun.

  • Jangan membuat asumsi tentang versi sistem operasi berdasarkan panggilan LoadLibrary yang mencari DLL. Jika aplikasi berjalan di lingkungan di mana DLL secara sah tidak ada tetapi salinan berbahaya DLL berada di jalur pencarian, salinan berbahaya DLL dapat dimuat. Sebagai gantinya, gunakan teknik yang direkomendasikan yang dijelaskan dalam Mendapatkan Versi Sistem.

Alat Monitor Proses dapat digunakan untuk membantu mengidentifikasi operasi beban DLL yang mungkin rentan. Alat Monitor Proses dapat diunduh dari https://technet.microsoft.com/sysinternals/bb896645.aspx.

Prosedur berikut menjelaskan cara menggunakan Monitor Proses untuk memeriksa operasi pemuatan DLL di aplikasi Anda.

Untuk menggunakan Monitor Proses untuk memeriksa operasi beban DLL di aplikasi Anda

  1. Mulai Monitor Proses.
  2. Di Monitor Proses, sertakan filter berikut:
    • Operasinya adalah CreateFile
    • Operasinya adalah LoadImage
    • Jalur berisi .cpl
    • Jalur berisi .dll
    • Jalur berisi .drv
    • Jalur berisi .exe
    • Jalur berisi .ocx
    • Jalur berisi .scr
    • Jalur berisi .sys
  3. Kecualikan filter berikut:
    • Nama Proses procmon.exe
    • Nama Proses Procmon64.exe
    • Nama Proses adalah Sistem
    • Operasi dimulai dengan IRP_MJ_
    • Operasi dimulai dengan FASTIO_
    • Hasilnya ADALAH SUKSES
    • Jalur berakhir dengan pagefile.sys
  4. Coba mulai aplikasi Anda dengan direktori saat ini yang diatur ke direktori tertentu. Misalnya, klik dua kali file dengan ekstensi yang penangan filenya ditetapkan ke aplikasi Anda.
  5. Periksa output Monitor Proses untuk jalur yang terlihat mencurigakan, seperti panggilan ke direktori saat ini untuk memuat DLL. Panggilan semacam ini mungkin menunjukkan kerentanan dalam aplikasi Anda.