Dukungan untuk Windows Vista Service Pack 1 (SP1) berakhir pada 12 Juli, 2011. Untuk terus menerima pembaruan keamanan untuk Windows, pastikan Anda menjalankan Windows Vista dengan Service Pack 2 (SP2). Untuk informasi selengkapnya, lihat halaman web Microsoft ini: dukungan berakhir untuk beberapa versi Windows.
Saat aplikasi dinamis memuat pustaka tautan dinamis (DLL) tanpa menentukan jalur yang memenuhi syarat, Windows mencoba menemukan DLL dengan mencari kumpulan direktori yang sudah ditentukan. Jika penyerang mendapatkan kontrol dari salah satu direktori, mereka bisa memaksa aplikasi untuk memuat salinan berbahaya dari DLL dan bukan DLL yang diharapkan. Serangan ini dikenal sebagai "serangan pramuin DLL" dan umum untuk semua sistem operasi yang mendukung pemuatan pustaka DLL bersama secara dinamis. Efek dari serangan tersebut bisa jadi penyerang dapat mengeksekusi kode dalam konteks pengguna yang menjalankan aplikasi. Saat aplikasi dijalankan sebagai administrator, ini bisa menyebabkan hak istimewa lokal. Kami tahu tentang minat baru dalam serangan ini. Untuk membatasi efek yang dimiliki masalah ini pada pelanggan bersama kami, kami melepaskan dokumen ini ke komunitas pengembang untuk memastikan bahwa mereka mengetahui masalah ini dan memiliki alat yang diperlukan untuk mengatasi masalah dalam aplikasi mereka.
Ringkasan
Deskripsi serangan preloading DLL
Serangan berbasis LoadLibrary
Saat aplikasi secara dinamis memuat DLL tanpa menentukan jalur yang memenuhi syarat, Windows mencoba menemukan DLL ini dengan linawal pencarian melalui Kumpulan direktori yang ditentukan, yang dikenal sebagai urutan pencarian DLL. Jika Windows menempatkan DLL dalam urutan pencarian DLL, maka akan memuat DLL tersebut. Namun, jika Windows tidak menemukan DLL di salah satu direktori dalam urutan pencarian DLL, maka akan mengembalikan kegagalan operasi beban DLL. Berikut ini adalah perintah pencarian DLL untuk fungsi Loadlibrarydan Loadlibraryex, yang digunakan untuk memuat secara dinamis dll:
-
Direktori dari mana aplikasi dimuat
-
Direktori sistem
-
Direktori sistem 16-bit
-
Direktori Windows
-
Direktori kerja saat ini (CWD)
-
Direktori yang tercantum dalam variabel lingkungan jalur
Pertimbangkan skenario berikut ini:
-
Aplikasi memuat DLL tanpa menentukan jalur berkualifikasi lengkap yang diharapkan untuk ditemukan dalam aplikasi CWD.
-
Aplikasi ini sudah siap untuk menangani kasus saat tidak menemukan DLL.
-
Penyerang mengetahui informasi ini tentang aplikasi dan mengontrol CWD.
-
Penyerang menyalin versi DLL yang dibuat khusus mereka sendiri di CWD. Ini mengasumsikan bahwa penyerang memiliki izin untuk melakukan hal ini.
-
Pencarian Windows melalui direktori dalam urutan pencarian DLL dan menemukan DLL dalam aplikasi CWD.
Dalam skenario ini, DLL yang dibuat khusus berjalan dalam aplikasi dan mendapatkan hak istimewa pengguna saat ini.Loadlibraryyang memenuhi syarat. Kami juga menyadari bahwa beberapa pengembang menggunakan LoadLibrary untuk memvalidasi Apakah DLL tertentu ada untuk menentukan versi Windows mana yang dijalankan oleh pengguna. Anda harus menyadari bahwa ini bisa membuat aplikasi rentan. Jika Pustaka yang terpengaruh memang tidak ada di rilis Windows yang dieksekusi aplikasi, penyerang dapat memperkenalkan pustaka dengan nama yang sama ke CWD. Kami sangat menyarankan agar tidak menggunakan teknik ini. Sebagai gantinya, gunakan teknik yang disarankan yang diuraikan dalam artikel MSDN, "mendapatkan versi sistem." Aplikasi yang memuat plugin pihak ketiga dan yang tidak dapat memaksa plugin untuk menggunakan jalur yang memenuhi syarat untuk panggilan LoadLibrary harus memanggil SetDllDirectory ("") untuk menghapus CWD lalu memanggil SetDllDirectory ("lokasi instalasi plugin") untuk menambahkan direktori instalasi plugin ke jalur pencarian DLL.
Rekomendasi untuk mencegah serangan ini, aplikasi bisa menghapus direktori kerja saat ini (cwd) dari jalur pencarian dll dengan memanggil api SetDllDirectory dengan menggunakan string kosong (""). Jika aplikasi bergantung pada memuat DLL dari direktori saat ini, silakan Dapatkan direktori kerja saat ini dan gunakan untuk melewati jalurSerangan berbasis SearchPath
Serangan yang sama ada ketika aplikasi menggunakan API SearchPath untuk menemukan DLL dan secara dinamis memuat jalur yang dikembalikan oleh searchpath. Berikut ini adalah urutan pencarian default untuk API SearchPath:
-
Direktori dari mana aplikasi dimuat
-
Direktori kerja saat ini (CWD)
-
Direktori sistem
-
Direktori sistem 16-bit
-
Direktori Windows
-
Direktori yang tercantum dalam variabel lingkungan jalur
Kami tidak merekomendasikan pola ini karena tidak aman. Kami tidak merekomendasikan fungsi SearchPath sebagai metode menemukan file. dll jika tujuan penggunaan output adalah panggilan ke fungsi LoadLibrary. Ini bisa mengakibatkan menemukan file. dll yang salah karena urutan pencarian fungsi SearchPath berbeda dari urutan pencarian yang digunakan oleh fungsi LoadLibrary. Jika Anda harus mencari dan memuat file. dll, gunakan fungsi LoadLibrary.
ShellExecute dan CreateProcess
Shellexecutedan CreateProcessuntuk memuat executable eksternal. Kami merekomendasikan agar pengembang berhati-hati saat mereka sedang memuat biner dan menentukan jalur yang memenuhi syarat. Ini akan menimbulkan sedikit kerumitan saat Anda memuat biner dan bukan pustaka.
Variasi masalah ini juga bisa ada ketika pengembang memanggil fungsi yang sama sepertiLangkah yang direkomendasikan untuk pengembang perangkat lunak
Kami merekomendasikan bahwa pengembang melakukan hal berikut:
-
Memvalidasi aplikasi mereka untuk contoh pemuatan Pustaka yang tidak aman (contoh masing-masing diberikan nanti dalam artikel ini). Ini meliputi yang berikut ini:
-
Penggunaan SearchPath untuk mengidentifikasi lokasi pustaka atau komponen.
-
Penggunaan LoadLibrary untuk mengidentifikasi versi sistem operasi.
-
-
Gunakan jalur yang memenuhi syarat untuk semua panggilan ke LoadLibrary, CreateProcess, dan ShellExecute di mana Anda bisa.
-
Terapkan panggilan ke SetDllDirectory dengan string kosong ("") untuk menghapus direktori kerja saat ini dari urutan pencarian default DLL di tempat yang diperlukan. Ketahuilah bahwa SetDllDirectory mempengaruhi seluruh proses. Oleh karena itu, Anda harus melakukan ini satu kali dalam inisialisasi proses, bukan sebelum dan sesudah panggilan ke LoadLibrary. Karena SetDllDirectory mempengaruhi seluruh proses, beberapa thread memanggil SetDllDirectory dengan nilai yang berbeda dapat menyebabkan perilaku tidak terdefinisi. Selain itu, jika proses dirancang untuk memuat pihak ketiga dll, pengujian akan diperlukan untuk menentukan apakah membuat pengaturan seluruh proses akan menyebabkan tidak kompatibel. Masalah yang diketahui adalah bahwa ketika aplikasi bergantung pada Visual Basic untuk aplikasi, pengaturan seluruh proses mungkin menyebabkan tidak kompatibel.
-
Gunakan fungsi Setsearchpathmodeuntuk mengaktifkan mode pencarian proses aman untuk proses tersebut. Ini memindahkan direktori kerja saat ini ke tempat terakhir dalam daftar pencarian SearchPath untuk seumur hidup proses.
-
Hindari penggunaan SearchPath untuk memeriksa keberadaan DLL tanpa menentukan jalur yang memenuhi syarat, bahkan jika Safe Search mode diaktifkan, karena ini masih bisa mengakibatkan serangan preloading DLL.
Panduan tentang mengidentifikasi pemuatan pustaka tidak aman
Dalam kode sumber, berikut ini adalah contoh memuat Pustaka yang tidak aman:
-
Dalam contoh kode berikut, aplikasi mencari "schannel.dll" dengan menggunakan jalur pencarian yang paling tidak aman. Jika penyerang bisa menempatkan schannel.dll di CWD, itu akan dimuat bahkan sebelum aplikasi mencari direktori Windows untuk Pustaka yang sesuai.
DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL);
HMODULE handle = LoadLibrary(result); -
Dalam contoh kode berikut, aplikasi mencoba memuat pustaka dari berbagai lokasi sistem aplikasi dan operasi yang dijelaskan di awal dokumen ini untuk panggilan LoadLibrary (). Jika ada risiko bahwa file tidak ada, aplikasi mungkin mencoba memuat file dari direktori kerja saat ini. Skenario ini sedikit kurang berbahaya dibandingkan contoh sebelumnya. Namun, masih memperlihatkan pengguna aplikasi berisiko jika lingkungan tidak sepenuhnya dapat diprediksi.
HMODULE handle = LoadLibrary("schannel.dll");
Berikut ini adalah contoh yang lebih baik, lebih aman memuat pustaka:
-
Dalam contoh kode berikut, pustaka dimuat secara langsung dengan menggunakan jalur yang memenuhi syarat. Tidak ada risiko penyerang memperkenalkan kode berbahaya kecuali ia sudah memiliki izin menulis ke direktori target aplikasi.
HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");
http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspxSHGetKnownFolderPath
http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspx
-
Dalam contoh kode berikut, direktori kerja saat ini dihapus dari jalur pencarian sebelum memanggil LoadLibrary. Hal ini mengurangi risiko secara signifikan, karena penyerang harus mengontrol direktori aplikasi, direktori Windows, atau direktori apa pun yang ditentukan di jalur pengguna untuk menggunakan serangan preloading DLL.
SetDllDirectory ("");
HMODULE handle = LoadLibrary("schannel.dll"); -
Pada semua sistem yang telah menginstal pembaruan keamanan 963027 (dijelaskan dalam MS09-014), kode berikut akan memindahkan cwd secara permanen ke tempat terakhir dalam urutan pencarian. Setiap panggilan ke fungsi SetSearchPathMode dari dalam proses yang mencoba untuk mengubah mode pencarian akan gagal.
SetDllDirectory ("");
HMODULE handle = LoadLibrary("schannel.dll"); -
Dalam contoh kode berikut, direktori kerja saat ini dihapus dari jalur pencarian sebelum memanggil LoadLibrary. Hal ini mengurangi risiko secara signifikan, karena penyerang harus mengontrol direktori aplikasi, direktori Windows, atau direktori apa pun yang ditentukan di jalur pengguna untuk menggunakan serangan preloading DLL.
SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT );
HMODULE handle = LoadLibrary("schannel.dll");
Menggunakan monitor proses untuk mendeteksi beban yang tidak aman secara dinamis
Microsoft menerbitkan alat yang bernama Process monitor. Alat ini memungkinkan pengembang dan administrator untuk melacak perilaku proses yang sedang berjalan. Monitor proses dapat digunakan untuk mendeteksi secara dinamis Apakah salah satu aplikasi Anda mungkin rentan terhadap jenis masalah ini.
-
Untuk mengunduh proses monitor, kunjungi situs web Microsoft berikut ini:
http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
-
Cobalah untuk memulai aplikasi Anda dengan menggunakan CWD diatur ke direktori tertentu. Misalnya, klik ganda file yang memiliki ekstensi pengendali file yang ditetapkan ke aplikasi Anda.
-
Siapkan monitor proses dengan filter berikut:
-
Jika jalur rentan terkena, Anda akan melihat sesuatu yang mirip dengan yang berikut ini:
panggilan ke berbagi file jarak jauh untuk memuat dll menunjukkan bahwa ini adalah program yang rentan.
Informasi Selengkapnya
Untuk informasi selengkapnya, kunjungi halaman web Microsoft berikut:
urutan pencarian pustaka tautan dinamishttp://msdn.Microsoft.com/en-US/Library/ms682586 (VS. 85). aspxDokumentasi MSDN pada fungsi SearchPath
http://msdn.Microsoft.com/en-US/Library/aa365527 (VS. 85). aspxDokumentasi MSDN pada fungsi LoadLibrary
http://msdn.Microsoft.com/en-US/Library/ms684175 (VS. 85). aspxDokumentasi MSDN pada fungsi SetDllDirectory
http://msdn.Microsoft.com/en-US/Library/ms686203 (VS. 85). aspxDokumentasi MSDN pada fungsi SetSearchPathMode
http://msdn.Microsoft.com/en-US/Library/dd266735 (VS. 85). aspxPosting blog oleh David LeBlanc, insinyur keamanan utama dengan Microsoft Office
http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxPosting blog oleh Andrew ROTHS, tim teknik MSRC pada serangan preloading DLL