WorstFit: Pengungkapan Transformer Tersembunyi di Windows ANSI
TL;DR
- Menemukan permukaan serangan baru dengan mengeksploitasi Best-Fit, fitur transformasi set karakter internal Windows.
- Mengubah fitur ini menjadi eksploitasi praktis seperti path traversal, penyuntikan argumen, dan eksekusi kode jarak jauh (RCE).
- Akar masalahnya terletak pada perilaku compiler, runtime C/C++, dan kesalahan pengembang.
- Juga dibahas tantangan dalam menerapkan patch di ekosistem open-source.
Menjelaskan Encoding Windows
Masa Awal: ANSI dan Code Page
- Windows awalnya menggunakan encoding ANSI, yang efektif untuk bahasa tertentu tetapi tidak dapat menangani kumpulan karakter campuran.
- Terdapat berbagai code page, dan tiap code page mendukung bahasa tertentu.
Era Unicode: UTF-16
- Pada pertengahan 1990-an, Windows beralih ke Unicode agar hampir semua karakter semua bahasa dapat diwakili dalam satu standar.
- Awalnya menggunakan UCS-2, tetapi kemudian langsung ditingkatkan ke UTF-16.
Era Enkode Ganda
- Untuk mempertahankan dukungan code page ANSI lama, Windows mengimplementasikan dua versi API.
- Terdapat ANSI API dan Unicode API, sehingga pengembang bisa dengan mudah memperoleh format data yang diinginkan.
Kelebihan Best-Fit
- Konversi karakter Best-Fit di Windows adalah cara menangani karakter yang tidak ada di code page target saat mengonversi dari UTF-16 ke ANSI.
- Misalnya, simbol
∞ tidak ada di code page Windows-1252, sehingga Microsoft memetakannya ke 8.
WorstFit: Permukaan Serangan Baru di Windows
🔥 Mimpi Buruk Dunia Timur Jauh - CVE-2024-4577
- CVE-2024-4577 adalah kerentanan yang memungkinkan eksploitasi pada server PHP-CGI yang menggunakan code page Cina atau Jepang dengan permintaan sederhana
?%ADs.
- Karena perilaku Best-Fit, U+00AD (soft hyphen) dipetakan ke dash (
-), memungkinkan bypass.
🔥 Pengambilalihan Nama File
- Melalui pemrosesan nama file, WorstFit dapat dieksploitasi menjadi payload path traversal.
- Misalnya, Developer Shell Chrome V8 (
d8.exe) mengambil direktori kerja saat ini menggunakan ANSI API.
🔥 Pemisahan Argumen
- Memanipulasi output
GetCommandLineA memungkinkan perilaku WorstFit dimanfaatkan pada parsing command line.
- Sebagai contoh, masukan
" --use-askpass=calc " dapat mengeksekusi calc.exe pada sistem.
Kesimpulan
- Perilaku Best-Fit menyediakan permukaan serangan pada proses transformasi di level sistem, yang dapat menyebabkan kerentanan pada berbagai alat.
- Fungsi dari library standar atau bahasa pemrograman tidak dapat mencegah serangan ini secara menyeluruh.
1 komentar
Hacker News Komentar
Microsoft sudah mengetahui masalah ini setidaknya sejak lebih dari satu tahun lalu. Melalui aturan analisis kode khusus bernama CA2101, Microsoft tidak merekomendasikan penggunaan pemetaan best-fit. Mereka menyebut adanya kerentanan keamanan, tetapi rinciannya tidak jelas
Ini adalah masalah sistemik. Microsoft menyediakan pemetaan kode "best fit" yang mengonversi Unicode menjadi ASCII. Pemetaan ini digunakan di banyak tempat, dan karena Microsoft sangat mementingkan kompatibilitas mundur, pemetaan ini perlu tetap disertakan. Pada dasarnya ini terhubung ke mana-mana
Sering dieksploitasi untuk mengonversi titik kode tidak valid menjadi slash, tanda hubung, tanda kutip, dan sebagainya. Di bahasa pemrograman modern biasanya dievaluasi dengan benar, tetapi bermasalah saat dikirim ke perintah shell atau Win32 API
Pemelihara curl mengatakan bahwa "curl adalah korban", tetapi penyebab masalahnya ada di tempat lain. Masalah terjadi ketika validasi input pengguna di server dan saat diterapkan ke pustaka sistem diperlakukan secara berbeda
Menonaktifkan konversi "best fit" secara selektif di ruang lingkup Win32 bisa menjadi solusi. Penyedia open source dapat menambahkan ini sebagai praktik terbaik
Windows seperti game kartu Munchkin di mana berbagai fitur yang kebetulan saling terhubung dapat menghasilkan kerentanan yang kuat. Mengonversi subsystem ANSI ke UTF-8 dapat meringankan masalah ini
Microsoft secara bertahap meninggalkan ANSI sejak NT 3.5 dan mendorong penggunaan Wide Character API. Namun, implementasi pustaka runtime C/C++ Microsoft adalah hambatan utama
Kemungkinan Microsoft mengaktifkan UTF-8 secara default di semua edisi Windows kemungkinan kecil. Karena aplikasi lama bergantung pada code page tertentu atau karakter 1-byte
Ada dua cara untuk memaksa halaman kode "Ansi" menjadi UTF-8 pada aplikasi. Salah satunya memakai berkas Manifest, dan yang lain menggunakan alat "App Locale"
Di komputer pribadi Windows saya, mengatur mode UTF-8 membuat saya aman dari bug ini. Saya mengaktifkannya karena game asing lama menampilkan teks yang rusak
Masalah ini tidak akan terselesaikan hanya dengan mengganti main() ke versi wide-character. Semua variabel harus diubah menjadi wchar_t *, yang sangat merepotkan dan mudah menimbulkan bug
Saya tahu bahwa Windows API menyediakan konversi best-fit, tetapi tidak tahu bahwa ini adalah perilaku default. Fitur ini seharusnya dilarang
Saya penasaran apakah kotak centang beta ini sama dengan mengatur ActiveCodePage ke UTF-8. GDI mengikuti code page global, bukan code page per-proses. Sayang sekali tidak bisa sepenuhnya memilih UTF-8