Seorang developer yang menyelidiki kode assembly ARM yang misterius telah menemukan bug signifikan dalam linker LLD yang berpotensi menciptakan kerentanan keamanan. Apa yang seharusnya menjadi fitur keamanan yang dirancang untuk mencegah eksploit malah menghasilkan instruksi jump yang dapat dieksploitasi dalam kode ARM Thumb.
Masalah ini berpusat pada pola instruksi 0xd4d4 yang disisipkan LLD untuk padding antara file objek. Pola ini dimaksudkan untuk bertindak sebagai instruksi trap - kode yang akan menghentikan prosesor jika tidak sengaja dieksekusi. Namun, diskusi komunitas mengungkapkan bahwa ini sebenarnya bagian dari mitigasi keamanan yang disebut trapsleds, yang dirancang untuk mencegah serangan return-oriented programming dengan mengganti padding instruksi NOP yang tidak berbahaya dengan sesuatu yang lebih defensif.
Masalah Teknis
Inti masalahnya adalah pada arsitektur ARM Thumb, pola 0xd4d4 sama sekali tidak menciptakan trap. Sebaliknya, ia menghasilkan instruksi conditional branch yang melompat ke alamat relatif. Ketika di-disassemble, ini muncul sebagai bmi 0x200ae @imm = #-0x58 - sebuah branch yang memindahkan eksekusi ke lokasi memori yang berbeda alih-alih menghentikannya.
Perilaku ini berbeda secara signifikan dari arsitektur lain di mana LLD dengan benar menggunakan instruksi trap yang sebenarnya. Pada sistem x86, LLD menggunakan instruksi 0xCC (INT3), yang dengan benar menghentikan eksekusi ketika tercapai. Implementasi ARM tampaknya melewatkan detail krusial ini.
Instruksi trap: Instruksi prosesor khusus yang dirancang untuk menghentikan eksekusi, sering digunakan untuk debugging atau tujuan keamanan Return-oriented programming: Teknik serangan di mana kode berbahaya merangkai urutan instruksi yang ada untuk melewati langkah-langkah keamanan
Rincian Instruksi ARM Thumb 0xd4d4:
- Encoding: 0b1101010011010100
- Jenis Instruksi: Percabangan bersyarat (BMI)
- Kondisi: (ASPR.C == '1') && (ASPR.Z != '0')
- Offset: -88 bytes (-0x58 hex)
- Perilaku yang Diharapkan: Jebakan/hentikan prosesor
- Perilaku Aktual: Lompat ke alamat relatif
Implikasi Keamanan dan Respons Komunitas
Komunitas telah mengidentifikasi ini lebih dari sekadar keingintahuan teknis. Meskipun satu komentator mencatat bahwa mengeksploitasi ini akan memerlukan kontrol yang sudah ada atas alur eksekusi, yang lain menunjukkan bahwa ini bisa berfungsi sebagai trampoline untuk meningkatkan jangkauan eksploit dalam skenario serangan tertentu.
Bug ini menjadi sangat mengkhawatirkan karena bertentangan dengan tujuan keamanan yang dinyatakan. Alih-alih mencegah eksploitasi area padding, implementasi yang salah berpotensi menciptakan vektor serangan baru. Seperti yang diamati oleh satu anggota komunitas, ini bisa menyebabkan kerentanan state-actor supply-chain yang disamarkan jika tidak ditangani dengan benar.
Perbandingan dengan Linker Lain
Investigasi mengungkapkan bahwa GNU ld menangani situasi ini secara berbeda, menggunakan byte nol (0x0000) untuk padding alih-alih instruksi seperti trap. Meskipun tidak sefokus keamanan seperti pendekatan trapsled yang dimaksudkan, metode ini menghindari penciptaan jalur kode yang dapat dieksekusi secara tidak sengaja.
Kontras ini menyoroti bagaimana implementasi toolchain yang berbeda dapat memiliki implikasi keamanan yang bervariasi, bahkan ketika melakukan tugas yang tampaknya sederhana seperti alignment memori.
Perbandingan Instruksi berdasarkan Linker:
- LLD (ARM Thumb): 0xd4d4 (conditional branch - bermasalah)
- LLD (x86): 0xCC (INT3 trap - benar)
- GNU ld: 0x0000 (zero padding - aman tetapi tidak fokus pada keamanan)
Kesimpulan
Penemuan ini menunjukkan bagaimana fitur keamanan dapat berbalik arah ketika tidak diimplementasikan dengan benar di berbagai arsitektur prosesor. Tim pengembangan LLD kemungkinan perlu mengatasi ini dengan mengimplementasikan instruksi trap yang tepat untuk ARM Thumb atau mengadopsi pendekatan padding yang lebih aman. Sampai saat itu, developer yang menggunakan LLD untuk target ARM Thumb harus menyadari bahwa binary mereka mungkin mengandung instruksi conditional branch yang tidak diinginkan di area padding.
Referensi: D4D4