2 poin oleh GN⁺ 2024-01-15 | 1 komentar | Bagikan ke WhatsApp
  • 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
    • a = 214013
    • b = 2531011
  • 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

 
GN⁺ 2024-01-15
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

    • Sepertinya namanya Titan Panel
      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

    • Karena saya tidak terlalu jago matematika, saya meminta Z3 mencarikan seed yang nyaman, dan hasilnya adalah kode di bawah ini
      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

    • Server Vanilla WoW memakai Mersenne Twister, dan meski ada berbagai masalah, ia tidak semudah itu untuk dibobol
      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

    • Rekayasa adalah soal kompromi
      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

    • Setiap kali teringat forum-forum lama, saya merasa nostalgia
      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

    • Sebagai kriptografer, kutipan ini benar-benar sulit ditahan
      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

    • Setelah mendengar orang-orang mabuk sungguhan yang bekerja di Goldman menjelaskan bagaimana uang berputar, saya menjelaskannya kepada adik saya, dan dia menjawab, “Jadi IRS itu semacam gold sink?”
      “Hm, sebenarnya itu analogi yang cukup bagus. Bedanya... hm... itu memang analogi yang cukup bagus!”
    • Ini pada dasarnya sama dengan high-frequency trading di dunia nyata
    • Apakah Anda yang membuat Auctioneer? Atau sesuatu yang mirip Auctioneer tetapi memilih untuk tidak memakai alat yang menjadi “standar industri”?
    • Saya penasaran bagaimana Anda menentukan apakah sesuatu undervalued atau tidak
    • Apakah Anda pembuat addon Auctioneer? Kalau iya, itu akan menjadi salah satu addon WoW paling populer selama lebih dari 10 tahun sampai sekarang
  • “Ketika variabel tidak berubah dan konstanta tidak konstan”

    • Menarik. Ini tampaknya seperti meme yang sudah berakar dalam
      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