When Random Isn't
- Ini adalah anekdot dari sekitar 10 tahun lalu, jadi mohon dimaklumi ada bagian yang tidak diingat dengan tepat karena kode aslinya sudah hilang.
- Beberapa detail disederhanakan agar bisa dinikmati oleh siapa pun yang menyukai keamanan komputer.
- Saat berusia 14 tahun, saya menemukan World of Warcraft dan menjadi kecanduan.
- Saya menemukan add-on yang bisa memodifikasi antarmuka pengguna game, lalu mulai membuatnya sendiri.
- Add-on yang dibuat dengan bahasa pemrograman Lua terdiri dari beberapa file sumber
.lua.
- Saya terpikat oleh fakta bahwa game dapat memuat dan menjalankan kode sumber yang saya tulis sendiri.
Keamanan add-on
- Memiliki add-on yang bisa diprogram oleh pengguna mungkin terdengar seperti ide buruk karena dapat memicu bot.
- Sistem yang dibuat Blizzard ternyata cukup cerdas dalam mencegah perilaku pemrograman sewenang-wenang.
- Sebagian besar elemen UI sepenuhnya tidak dibatasi jika hanya bersifat dekoratif atau untuk menampilkan informasi.
- API untuk mengumpulkan informasi, seperti pemanggilan API yang menampilkan HP karakter, tidak dibatasi.
- Namun, beberapa pemanggilan API dilindungi agar hanya bisa dipanggil oleh kode resmi Blizzard.
- Sebagian besar API yang berkaitan dengan melakukan tindakan nyata di dalam game dilindungi.
- API untuk mendapatkan posisi di dunia dan arah kamera juga sempat dilindungi pada suatu titik.
- Jika ingin membuat tombol untuk merapal mantra tertentu, kita bisa membuat tombol khusus yang saat diklik akan menjalankan kode di lingkungan aman.
- Tombol-tombol ini tidak bisa dibuat/dihancurkan/dipindahkan saat pertempuran, untuk mencegah otomatisasi selama combat.
- Lingkungan aman memungkinkan penetapan mantra mana yang akan dirapal secara terprogram, tetapi tidak mengizinkan pengumpulan informasi yang diperlukan untuk otomatisasi sewenang-wenang.
Kanal backdoor
- Beberapa tahun kemudian, ketika mulai tertarik pada pemrograman yang lebih "serius", saya hampir berhenti bermain World of Warcraft.
- Namun saya tetap terus memikirkan cara menonaktifkan lingkungan aman itu.
- Alih-alih menggunakan perangkat lunak pihak ketiga, saya ingin menyelesaikannya sebagai tantangan dengan memakai alat yang secara teknis diizinkan.
- Saya menemukan bahwa fungsi
random ada dalam daftar fungsi yang diizinkan di lingkungan aman, lalu memikirkan cara memanfaatkannya untuk menyelundupkan informasi.
Masalah generator angka acak
- Ternyata
random hanyalah pembungkus sederhana untuk fungsi rand dari C.
- Implementasi
rand adalah linear congruential generator yang sederhana dan lemah.
- Saya mengembangkan cara untuk merekayasa balik status internal RNG agar bisa menyampaikan informasi.
Menggabungkan semuanya
- Setelah bisa merekayasa balik status internal RNG, saya menjadi mampu membuat keputusan otomatisasi sewenang-wenang di lingkungan aman.
- Saya mengakses informasi di lingkungan tidak aman untuk mengambil keputusan, lalu menjalankan tindakan yang "dipilih secara acak" di lingkungan aman.
Kesimpulan
- Saya tidak tahu kapan Blizzard memperbaiki masalah status RNG yang lemah dan dibagikan, atau apakah mereka pernah menyadari bahwa itu bermasalah.
- Beberapa tahun kemudian, ketika saya mencoba lagi kodenya, itu sudah tidak berfungsi.
- Ini memang hanya eksploit kecil pada video game yang sebenarnya tidak ingin saya gunakan secara nyata, tetapi ada daya tarik yang terasa magis dalam memanipulasi sesuatu yang tampak acak.
Opini GN⁺
- Tulisan ini memberikan contoh menarik tentang keamanan komputer dan pemrograman.
- Proses mengeksplorasi cara kreatif untuk melewati keamanan di dalam game meningkatkan kesadaran akan pentingnya keterampilan pemrograman dan potensi kerentanannya.
- Kisah tentang memanfaatkan kelemahan RNG ini menjadi contoh yang mengandung pelajaran bagi para pengembang perangkat lunak tentang pentingnya keamanan dan algoritma.
1 komentar
Opini Hacker News
Seorang pengguna menyebut bahwa beberapa bulan lalu ia pernah menjawab pertanyaan di StackOverflow tentang "membalikkan RNG (generator angka acak)". Pengguna ini menyerang Java RNG, yang menggunakan desain LCG (linear congruential generator) mirip MSVC RNG, sehingga menghasilkan keluaran berupa potongan dari status internalnya dan metode serangannya pun sangat mirip.
Pengguna lain berspekulasi bahwa jika server menggunakan RNG yang sama, maka secara teori hal ini bisa dimanfaatkan bila tersedia server dengan penggunaan rendah, ping rendah, kemampuan untuk mendapatkan jendela yang akurat atas status RNG saat ini, serta kemampuan untuk dengan cepat memicu peristiwa lain yang memiliki volatilitas ekonomi tinggi.
Pengguna lain lagi menunjukkan bahwa RNG linear congruential yang diberikan hanya menghasilkan 12445 angka berbeda sebelum berulang, dan menyebut bahwa masuk akal untuk memakai parameter yang lebih baik untuk algoritma ini.
Seorang pengguna mengatakan bahwa World of Warcraft (WoW) memulai ketertarikannya pada pemrograman; game itu dirilis saat ia berusia 6 tahun, dan ketika private server mulai bermunculan, ia tertarik mempelajari cara membuat NPC sendiri. Dari situ ia belajar Lua, cara mengompilasi core private server, SVN, cara menerapkan patch, dan lain-lain.
Seorang pengguna membagikan kutipan John von Neumann yang mengatakan bahwa semua metode untuk menghasilkan angka acak adalah dosa, dan berpendapat bahwa prosedur aritmetika yang ketat bukanlah cara untuk menghasilkan angka acak.
Seorang pengguna mengatakan bahwa ia pernah menulis skrip auction house untuk WoW, yang dapat memindai semua lelang untuk membeli item yang harganya terlalu rendah lalu melelangnya kembali. Jika seseorang menurunkan harga, skrip itu bisa membatalkan lelang dan memasangnya lagi dengan harga sedikit lebih rendah.
Ada pengguna yang menyebut kasus Hacker News pernah diretas akibat angka acak yang lemah. Ia memberikan tautan terkait.
Ada pengguna yang memakai ungkapan "ketika variabel tidak berubah dan konstanta bukan konstanta".
Seorang pengguna yang tidak memainkan WoW mengatakan ia pernah mendengar bahwa banyak add-on menggunakan private chat sebagai sarana komunikasi. Ia menyebut bahwa jika ada caranya, pada akhirnya orang-orang akan menemukannya dan memakainya.
Terkait insentif ekonomi seputar RNG, ada pengguna yang mengatakan bahwa jika tidak ada hal penting yang benar-benar dipertaruhkan (misalnya game), maka RNG yang tidak sempurna pun sudah cukup. Namun, jika uang dipertaruhkan atau keamanan penting (misalnya dompet kripto atau kasino online), maka kesempurnaan RNG menjadi sangat penting.