Analisis kerentanan keamanan Lua di Factorio
Apa itu Factorio?
- Factorio adalah gim tentang mengotomatiskan pabrik, membangun roket, dan melarikan diri dari sebuah planet
- Lebih dari 3.500.000 salinan gim telah terjual, menjadikannya target yang menarik bagi para peneliti keamanan
Cara Lua digunakan dalam gim
- Lua digunakan untuk mengimplementasikan logika gim, serta membuat mod dan peta kustom
- Komunitas modding sangat aktif, dengan ribuan mod yang tersedia
- Mod Alien Biomes telah mencatat 551K unduhan
Paparan interpreter Lua ke jaringan
- Mode multipemain Factorio menggunakan deterministic lockstep untuk menyinkronkan klien
- Jika satu pemain menjalankan kode Lua, pemain lain juga harus menjalankan kode yang sama
- Ini membuka kemungkinan untuk mengeksekusi kode Lua berbahaya melalui jaringan
Jalur eksploitasi yang umum
- Menjalankan server Factorio yang menyediakan peta berbahaya
- Saat klien terhubung ke server, mereka mengunduh peta dan menjalankan kode Lua
- Memanfaatkan kelemahan pada implementasi Lua untuk membuat objek palsu
- Mengubah perilaku program melalui kebocoran/kerusakan memori
- Menggunakan primitive yang kuat ini untuk mendapatkan eksekusi kode
Bahaya bytecode Lua
- Lua adalah bahasa interpreter; kode yang ditulis tidak langsung dijalankan, melainkan dikompilasi menjadi bytecode
- Jika bytecode dapat dijalankan secara langsung, bytecode yang tidak valid dapat digunakan untuk membocorkan atau merusak memori
Validator bytecode
- Pengembang Lua pernah mengimplementasikan validator bytecode untuk melindungi interpreter dari bytecode berbahaya, tetapi karena berulang kali ditemukan cara untuk melewatinya, validator ini dihapus pada Lua 5.2
- Pengembang Factorio membuat validator bytecode mereka sendiri, tetapi validator ini tidak sepenuhnya sempurna karena beberapa masalah off-by-one
Pembuatan objek palsu
- Dengan membuat objek palsu, seluruh kemampuan interpreter dapat dimanfaatkan
- String dapat digunakan untuk membocorkan data arbitrer, dan array dapat digunakan untuk menulis ke memori arbitrer
- Jika fungsi native dapat dipanggil, alur eksekusi dapat dikendalikan
Kebocoran alamat
- Fungsi
print di Lua dapat membocorkan alamat
- Di Factorio fungsi ini telah dihapus, sehingga digunakan metode kebingungan tipe untuk membocorkan alamat
Memahami TValues
- Lua adalah bahasa dinamis, sehingga tipe variabel dapat berubah saat runtime
- Secara internal, Lua menggunakan struktur
TValue untuk merepresentasikan objek
TValue memiliki properti tipe (tt_) dan nilai (value_)
Kebingungan tipe menggunakan FORLOOP
- Opcode
FORLOOP dapat menyebabkan kebingungan tipe dengan menganggap nilai awal loop sebagai angka
- Melalui hal ini, alamat dapat dibocorkan
Presisi ganda IEEE 754
- Presisi ganda terdiri dari tanda, eksponen, dan mantissa
- Karena Lua tidak merepresentasikan bilangan bulat, alamat hingga 53 bit dapat dibocorkan tanpa kehilangan presisi
Mencari objek palsu
- Dengan memahami Upvalues dan Closures, objek palsu dapat dicari
- Upvalues memungkinkan akses ke variabel dari fungsi luar
- Dengan memodifikasi bytecode untuk mengubah indeks Upvalue, objek palsu dapat dicari
Pendapat GN⁺
- Tulisan ini sangat berguna untuk memahami kerentanan keamanan pada bahasa dinamis
- Artikel ini menjelaskan dengan baik masalah keamanan yang dapat muncul pada gim populer seperti Factorio
- Kerentanan serupa juga dapat ada pada proyek lain yang menggunakan bahasa seperti Lua
- Saat mengadopsi teknologi baru atau open source, tinjauan keamanan adalah hal yang wajib
- Proyek lain dengan fitur serupa antara lain sistem modding Minecraft
Belum ada komentar.