- Lingkungan addon Lua di World of Warcraft memudahkan perubahan UI, tetapi memisahkan akses informasi dan izin eksekusi untuk mencegah otomatisasi perilaku dalam game
- Model keamanan Blizzard membagi antara lingkungan tidak aman yang bisa banyak membaca informasi dan lingkungan aman yang bisa melakukan tindakan, dan batas ini menjadi inti pencegahan otomatisasi
random yang diizinkan di lingkungan aman ternyata hanyalah pembungkus tipis untuk rand C dari MSVC, yaitu linear congruential generator lemah yang berbagi status global sehingga bisa menjadi saluran penyampaian informasi
- Hanya dengan dua keluaran RNG, kandidat status internal bisa dipersempit menjadi maksimal 8, lalu dengan keluaran tambahan dipilih satu kandidat tunggal sebelum RNG dimajukan sampai indeks tindakan yang diinginkan muncul
- Dari luar ini tampak seperti pemilihan tindakan secara acak, tetapi sebenarnya bisa dipaksa memilih tindakan tertentu seperti spell yang diinginkan, dan tidak jelas bagaimana Blizzard kemudian memperbaikinya
Addon World of Warcraft menjadi titik masuk ke pemrograman
- Addon World of Warcraft dimuat langsung oleh game cukup dengan menaruh beberapa berkas sumber
.lua yang ditulis dalam Lua ke dalam folder
- Setelah berkas diubah dan disimpan, hasilnya bisa langsung dilihat dengan memuat ulang antarmuka, sehingga hambatan masuk sangat rendah
- Awalnya, berbagai addon dibuat dengan menyalin kode orang lain lalu merapikan ulang atau menyusunnya kembali untuk mendapatkan fungsi yang diinginkan
- Seiring waktu, lebih banyak waktu dihabiskan untuk menulis addon daripada benar-benar bermain, dan World of Warcraft pun menjadi awal serius untuk belajar pemrograman
Model keamanan addon Blizzard
- Jika pengguna bisa membuat addon yang sepenuhnya dapat diprogram, masalah bot bisa muncul, jadi Blizzard membuat struktur yang membatasi otomatisasi yang bisa dilakukan pemain biasa
- Sebagian besar elemen UI dan API pengumpulan informasi bisa digunakan tanpa batas
- Misalnya, bisa dibuat health bar yang membaca HP karakter lalu menyesuaikan ukuran frame latarnya
- API yang melakukan tindakan nyata dalam game, seperti menggerakkan karakter, melempar spell, atau memakai item, dilindungi sehingga hanya bisa dipanggil oleh kode resmi Blizzard
- API untuk mendapatkan posisi dunia yang akurat dan arah kamera juga pada suatu titik ikut dilindungi
- Ini adalah respons terhadap addon yang menggambar elemen 3D di atas dunia game agar pertarungan boss menjadi lebih mudah
Pemisahan lingkungan aman dan tidak aman
- Karena beberapa elemen UI memang perlu berinteraksi dengan tindakan nyata dalam game, ada tombol khusus yang bisa dibuat untuk menjalankan kode di lingkungan aman saat diklik
- Tombol seperti ini tidak bisa dibuat, dihapus, atau dipindahkan saat sedang bertarung
- Ini mencegah cara otomatisasi yang menempatkan tombol secara kondisional di bawah kursor saat bertarung
- Lingkungan aman bisa diatur secara terprogram untuk menentukan spell apa yang akan dipakai, tetapi akses ke status eksternal yang dibutuhkan untuk otomatisasi sewenang-wenang diblokir
- Hanya sebagian API pengumpulan informasi setingkat sistem makro yang diizinkan, dan informasi yang dibutuhkan untuk memilih spell optimal, seperti cooldown skill atau HP unit, tidak disediakan
- Akibatnya, kedua lingkungan memiliki izin yang berbeda
- Lingkungan tidak aman: bisa memperoleh banyak informasi tetapi tidak bisa bertindak
- Lingkungan aman: bisa bertindak tetapi tidak bisa memperoleh informasi yang dibutuhkan untuk otomatisasi
random menjadi saluran backdoor
- Tujuannya bukan mematikan pembatasan keamanan dengan perangkat lunak pihak ketiga, melainkan memeriksa apakah lingkungan aman bisa dilewati hanya dengan alat yang secara teknis memang diizinkan
- Saat meninjau daftar fungsi yang diizinkan di lingkungan aman, ditemukan
random
- Karena generator angka acak komputer umumnya adalah pseudorandom number generator dengan status internal, muncul dugaan bahwa jika status itu bisa dimanipulasi, informasi dari luar dapat diteruskan ke lingkungan aman
- Ternyata
random memang hanya pembungkus kecil untuk rand milik C
- Karena World of Warcraft dikompilasi dengan MSVC, implementasi
rand yang dipakai adalah generator berbasis status global
uint32_t state;
int rand() {
state = state * 214013 + 2531011;
return (state >> 16) & 0x7fff;
}
- Implementasi ini memakai satu status acak global yang dibagi di seluruh proses, dan merupakan linear congruential generator yang lemah
Pemulihan status rand MSVC
- Keluaran
rand langsung mengungkap 15 bit yang merupakan bagian dari status
- Karena ruang status kecil dan sebagian keluaran terlihat, kandidat status yang mungkin bisa dipertahankan lalu dieliminasi dengan keluaran tambahan
- Cara yang lebih efisien adalah mengamati dua keluaran RNG
r0, r1 dan menghitung kandidat untuk bagian status 16 bit yang tersembunyi
- Konstanta pada
rand MSVC adalah sebagai berikut
- Jika bagian 16 bit tersembunyi setelah pemanggilan pertama dan kedua masing-masing disebut
h0 dan h1, kandidat h0 dapat diturunkan dari persamaan transisi status
- Hasil perhitungannya menunjukkan bahwa cukup melihat rentang
-1 <= k < 7, sehingga kandidat status tersembunyi berkurang menjadi maksimal 8
- Setelah itu, hasil panggilan RNG tambahan dibandingkan dengan keluaran dari RNG kandidat untuk membuang kandidat yang salah
- Implementasi Python contoh memakai loop
while, tetapi tampaknya dalam praktik cukup sampai keluaran ketiga untuk mempersempit ke satu kandidat tunggal
- Saat itu, karena sulit menurunkan matematika diskritnya sendiri, dia sempat bertanya di crypto.SE dengan alasan “ingin menunjukkan pada rekan seberapa lemahnya RNG ini”
Cara memilih tindakan yang diinginkan di lingkungan aman
- Begitu status internal RNG bisa dipulihkan, keputusan otomatisasi sewenang-wenang bisa diteruskan ke lingkungan aman
- Prosesnya berjalan sebagai berikut
- Mendaftarkan hook tidak aman yang berjalan tepat sebelum kode lingkungan aman dieksekusi
- Di dalam hook, semua informasi bisa diakses sehingga dapat diputuskan tindakan apa yang akan dilakukan
- Tindakan yang dipilih dicari dalam daftar tindakan yang sudah di-hardcode lalu diubah menjadi indeks
- Status RNG saat ini dipulihkan dengan cara yang dijelaskan sebelumnya
- Jika keluaran RNG berikutnya, berdasarkan sisa bagi dengan panjang daftar tindakan, bukan indeks yang diinginkan, RNG dimajukan lalu diperiksa lagi
- Saat giliran keluaran yang diinginkan tiba, hook mengembalikan kontrol, dan lingkungan aman memanggil
random untuk menjalankan tindakan pada indeks tersebut
- Dari sudut pandang lingkungan aman, ini terlihat seperti pengindeksan daftar tindakan dengan angka acak, tetapi sebenarnya waktu pemanggilan
random berikutnya diatur agar tindakan yang diinginkan terpilih
- Jika ukuran daftar tindakan adalah
n, rata-rata RNG perlu dimajukan n langkah untuk menyampaikan nilai yang diinginkan, tetapi ini tidak menjadi masalah dalam penggunaan nyata
Kondisi setelahnya
- Saat dicoba lagi beberapa tahun kemudian, cara ini sudah tidak lagi bekerja
- Tidak diketahui kapan Blizzard memperbaiki masalah RNG yang lemah dan berbagi status ini, atau apakah mereka memang menyadarinya sebagai masalah
- Perubahan yang mungkin dilakukan antara lain beralih ke algoritme lain atau memberikan status RNG yang benar-benar terpisah untuk lingkungan aman
- Meski bukan kode yang akhirnya akan dipakai, ini tetap menjadi contoh sempit bypass keamanan game yang berhasil memanipulasi sesuatu yang tampak acak agar menghasilkan hasil yang diinginkan
1 komentar
Komentar Hacker News
Dulu sekali saat bekerja sebagai GM WoW, ada bug pada versi tertentu dari addon populer Titan Bar yang terus memanggil API untuk menampilkan UI “buat tiket ke GM”
Meski dibatalkan, jendelanya muncul lagi, dan selain menghapus addon yang bermasalah itu, satu-satunya cara menutup jendela adalah menulis sesuatu di kotak teks lalu mengirimkannya
Dari sudut pandang GM, satu dua hari itu benar-benar berat, dan banyak pemain bahkan tidak tahu apa itu GM atau bahwa mereka bisa mengirim tiket
Menjelaskan bahwa “kemungkinan Anda mengirim tiket karena addon, jadi saya sebagai petugas dukungan pelanggan menghubungi Anda” juga biasanya tidak mudah
Karena ini praktis merusak waktu respons normal, para pengembang merilis hotfix dan menaruh pemanggilan API itu di balik proteksi sehingga hanya bisa dilakukan dari kode LUA milik Blizzard sendiri
Itu addon yang menggabungkan berbagai elemen UI seperti total gold dan persentase repair ke dalam satu baris bilah
Anehya, saya pernah menjawab pertanyaan yang nyaris sama tentang “membalikkan generator angka acak” di StackOverflow beberapa bulan sebelum pertanyaan itu muncul di Crypto.SE: https://stackoverflow.com/a/15237585/1204143
Hanya saja saya menyerang generator angka acak Java, bukan generator angka acak MSVC
Keduanya adalah linear congruential generator (LCG) sederhana yang mengeluarkan nilai hasil pemotongan state internal, jadi metode serangannya pun sangat mirip
import java.util.Random;
public class Hayley {
public static void main(String... args) {
byte[] b1 = new byte[4], b2 = new byte[2];
(new Random(0x2effe2140e00L)).nextBytes(b1);
(new Random(0xc2f0097)).nextBytes(b2);
System.out.println(new String(b1) + new String(b2));
}
}
Saya penasaran apakah server juga mungkin memakai generator angka acak yang sama
Jika ya, maka secara teori ini tampak bisa dieksploitasi ketika ada server dengan penggunaan sangat rendah, latensi rendah, kemampuan mempersempit state generator angka acak saat ini dengan cukup akurat, dan kemampuan memicu ulang dengan cepat event yang variasi ekonominya besar tergantung angka acak
Dalam upaya yang sebagian besar gagal untuk menghilangkan rumor yang diyakini kuat oleh pemain yang percaya takhayul, seperti adanya “seed loot”, Blizzard cukup banyak mengungkap detail cara kerja generator angka acak di sisi server
Ekonomi dan insentif generator angka acak itu menarik
Jika secara praktis tidak ada taruhan dan orang tidak akan mudah menyadarinya, generator angka acak yang kurang sempurna atau bahkan buruk bisa saja sudah cukup, seperti dalam game
Tetapi saat uang atau keamanan dipertaruhkan, seperti dompet kripto atau kasino online, hal itu tiba-tiba menjadi sangat penting
Lebih parah lagi, generator angka acak linear congruential yang ditunjukkan hanya menghasilkan 12.445 angka berbeda sebelum berulang
Sekadar memakai parameter yang lebih baik untuk algoritma ini saja akan jauh lebih masuk akal
Untuk pekerjaan sederhana seperti pergerakan partikel dalam jejak asap, dibutuhkan generator angka acak yang sederhana namun cepat
Dalam kriptografi atau game kasino, orang bukan hanya memakai generator angka acak yang lebih baik dengan state minimal 32 byte, tetapi juga menjalankan engine tambahan pada interval acak untuk makin mempersulit prediksi hasil
World of Warcraft adalah hal yang membuat saya tertarik pada pemrograman
Saya berusia 6 tahun saat game itu rilis, dan ketika private server mulai bermunculan saya ingin tahu cara membuat NPC sendiri, jadi saya belajar Lua
Masih banyak postingan dari forum MMOwned tempat saya aktif waktu itu, dan salah satu orang yang membantu saya belajar saat itu kadang masih menulis sampai sekarang
Dengan mengompilasi core private server sendiri, saya belajar kompilasi, SVN, dan cara menerapkan patch, dan sepertinya ada bug terkait Fireball milik mage, meski saya tidak ingat persis
Sekarang rasanya sebagian besar sisi baik internet telah digantikan oleh aplikasi media sosial pemicu dopamin dan forum tertutup seperti Reddit
Mungkin alasan saya masih bertahan di HN juga karena itu mengingatkan saya pada forum-forum lama
“Siapa pun yang mempertimbangkan metode aritmetika untuk menghasilkan angka acak tentu berada dalam keadaan berdosa. Seperti telah sering dikatakan, tidak ada yang namanya angka acak. Yang ada hanyalah metode untuk menghasilkan angka acak, dan prosedur aritmetika yang ketat tentu bukan metode seperti itu.” — John von Neumann
Bukan berarti saya kesal pada Neumann, tetapi orang yang menyebarkannya seolah ini petuah bijak biasanya hanya menyampaikan informasi yang salah
Dalam konteksnya, ini lebih mirip lelucon filosofis yang tidak perlu
Kita sudah punya generator angka acak kriptografis yang cepat dan andal selama puluhan tahun
Dengan seed yang sangat kecil dan operasi aritmetika saja, generator itu bisa bekerja dengan benar, dan angka yang dihasilkan tidak dapat dibedakan dari sumber acak sah lainnya serta bisa dipakai untuk tujuan apa pun
Terlalu banyak orang yang tidak memahami ini, sampai-sampai ada perusahaan yang menjual minyak ular “angka acak sungguhan”
Contoh bagus untuk generator angka acak yang benar-benar buruk ada di Monster Hunter 3 Ultimate, dan mungkin juga di judul lain
Bukan hanya bisa dieksploitasi sepenuhnya untuk mendapatkan loot bagus, tetapi juga melahirkan “charm table”
Beberapa item memiliki stat yang dihasilkan secara acak, tetapi karena seed awal disimpan di file save, rentang item yang bisa didapat menjadi terbatas
Jika sial, Anda bisa terkena “tabel terkutuk”, yang pada dasarnya adalah generator angka acak dengan periode sangat pendek, sehingga Anda tidak akan pernah mendapatkan nilai terbaik
Ini tidak sampai merusak game sepenuhnya, tetapi buruk untuk permainan level tinggi
Saya pernah menulis skrip auction house
Saya memindai semua lelang, membeli item yang undervalued, lalu memasangnya kembali
Jika seseorang memasangnya lebih murah, saya bisa membatalkannya lalu memasang ulang sedikit di bawah harga itu, dan pada praktiknya saya mendapat gold tanpa batas
“Hm, sebenarnya itu analogi yang cukup bagus. Bedanya... hm... itu memang analogi yang cukup bagus!”
“Ketika variabel tidak berubah dan konstanta tidak konstan”
https://www.theregister.com/2006/07/26/constants_are_not/
“Ratapan dalam judul artikel ini tentang sifat pemrograman yang berubah-ubah, ‘Variables Won't Constants Aren't’, pertama kali saya baca di Creative Computing beberapa tahun sebelum C diciptakan.”
Jika ada dokumen tertentu yang terasa sebagai versi kanonik dari meme ini, saya ingin membacanya