Bagaimana saya bisa mencegah laporan skor palsu ke tabel skor tinggi global?

44

Browser dan gim seluler umumnya memiliki tabel skor global tertinggi. Itu juga umum untuk tabel-tabel itu berisi skor 2.147.483.647 - di mana orang telah menemukan panggilan layanan web yang melaporkan skor dan menggunakannya untuk mencatat skor fiktif.

Untuk permainan puzzle sederhana, kita dapat bertahan melawan hal ini dengan memasukkan catatan setiap gerakan yang dilakukan pemain (dan setiap benih acak yang digunakan untuk menghasilkan level) dengan panggilan pelaporan skor. Seluruh permainan kemudian dapat direproduksi dan diverifikasi di server.

Namun, ini dengan cepat menjadi tidak layak untuk sesuatu yang lebih besar dari Pac-man.

Bagaimana lagi cara curang seperti ini bisa dicegah?

Teedyay
sumber
Saya punya pertanyaan yang sama persis tentang game iPhone menggunakan teknik yang sama untuk membuat tabel skor tinggi global.
deft_code
Apakah Anda yakin tidak mungkin mengirim replay?
o0 '.
Ya saya yakin. :)
teedyay

Jawaban:

9

Sistem internal yang kami gunakan untuk Moblox (kemudian diganti dengan OpenFeint) bekerja seperti ini:

  • Kirim pesan JSON melalui HTTP biasa (bukan HTTPS). Sertakan hash MD5 dari semua bidang plus string ajaib.
  • Di server, periksa integritas pesan dengan operasi yang sama.

Untuk memecahkan sistem, Anda harus menemukan string ajaib ini. Mungkin dengan teknik terbalik, tapi menyakitkan.

OpenFeint, ScoreLoop dan CocosLive semuanya menggunakan trik yang sama, tetapi dengan HTTPS. Sangat mudah diimplementasikan.

Ellis
sumber
29
Saya cukup meragukan bahwa rekayasa balik untuk menemukan string ajaib Anda akan sangat sulit.
Kylotan
4
Ini adalah Aplikasi Android dalam bahasa C ++ asli. Tidak ada simbol, atau debugger yang baik tidak tersedia. Jadi Anda dapat membaca kode ARM, tetapi tidak melacaknya dengan mudah. Kuncinya disusun oleh beberapa operasi sehingga menemukan semua string tidak cukup. Itu tidak sempurna tetapi cukup menyakitkan.
Ellis
3
Latihan sarjana standar, setidaknya di universitas-universitas AS, adalah untuk merekayasa ulang kata sandi yang dibuat seperti yang Anda gambarkan, dengan membaca y86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/… ) kode perakitan.
12
Ini adalah teknik yang sangat lemah , yang akan memberikan rasa aman yang sangat palsu kepada pengembang.
o0 '.
2
Ini adalah contoh yang sangat bagus dari en.wikipedia.org/wiki/Security_through_obscurity
kaoD
21

Meskipun Anda benar bahwa tidak selalu layak untuk mengirim seluruh replay ke server untuk permainan yang kompleks, sistem serupa dapat digunakan dengan meminta server secara berkala (dan semi-acak) meminta klien untuk beberapa bagian dari keadaannya, sementara itu game sedang berjalan.

Misalnya, dalam FPS, setiap menit Anda bisa bertanya "Berapa banyak pembunuhan yang Anda miliki?", "Di mana semua musuh?", Dll. Jika klien tidak kembali dengan jawaban yang masuk akal untuk sebuah tantangan dalam sebuah jumlah waktu yang wajar, mereka curang.

Tentu saja, ini hanya berfungsi jika game online selama seluruh sesi bermain. Karena tujuan di sini adalah untuk dapat mengunggah ke papan peringkat online, saya pikir itu masuk akal - jangan menendang pemain keluar dari permainan jika mereka salah menjawab, jangan biarkan mereka masuk dalam daftar skor.

Namun saya ingin Anda mempertimbangkan untuk mengirim replay. Yang Anda butuhkan hanyalah input acak awal dan timestamped. Ini seharusnya benar-benar beberapa ratus KB. Banyak game arcade sudah melakukan ini untuk menyimpan replay untuk keperluan ulasan pemain; memiliki server Anda memvalidasi ini mungkin tidak sepele, tetapi mencegah semua jenis kecurangan kecuali botting.


sumber
10

Anda dapat membatasi pelanggaran yang paling mencolok dengan memantau hasil tertinggi di tabel skor teratas. Bergantung pada gim Anda, Anda mungkin memiliki "skor sempurna", di mana skor apa pun pasti curang. Jika tidak, Anda dapat menghitung "skor mustahil" yang terendah; dapatkah pemain menembak 10 tembakan per detik, permainan berlangsung 1 menit, dan setiap musuh yang terbunuh bernilai 100 poin? Maka skor apa pun yang lebih tinggi dari 60.000 harus curang.

Anda juga dapat membantu mengurangi masalah dengan mengirimkan beberapa metadata; bukan riwayat permainan lengkap, seperti yang Anda gambarkan, tetapi hanya komponen yang membentuk skor. Katakan: skor 60000, 500 musuh terbunuh, dan satu item bonus diraih. Anda kemudian dapat melakukan pemeriksaan sederhana. Ini adalah "keamanan melalui ketidakjelasan," dan karena itu tidak aman sama sekali, tetapi membantu menghilangkan penyerang yang paling naif.

Gregory Avery-Weir
sumber
Anda juga dapat menandai pengguna (mungkin dengan IP) jika mereka mengirimkan skor yang tidak cocok dengan metadata. Kemudian jika mereka mencoba dan mengirimkan skor lagi yang TIDAK memiliki metadata yang benar, Anda dapat memeriksanya, dan mungkin hanya melarangnya sama sekali. Anda juga dapat mengirim pesan kurang ajar kembali dari sana mengirimkan permintaan skor :)
Adam Harte
Saya pikir jawaban ini lebih baik daripada jawaban yang diterima. Cari tahu angka mana yang merupakan maksimum yang dapat dicapai oleh pemain Anda Apa pun yang lebih tinggi, buang saja.
6
Jadi, jika satu pemain yang masuk ke universitas curang, semua orang di jaringan sekarang menjadi "penipu"
AttackingHobo
6

Pada akhirnya Anda hanya dapat mengesampingkan skor yang sangat tinggi, karena sisanya (menurut definisi) hanya tidak masuk akal, dan dengan demikian mungkin menjadi pemain yang sah (dan mengagumkan).

Kalau tidak, Anda harus mengandalkan teknik kebingungan (seperti enkripsi, dan mengirim statistik lain di luar skor).

Anda juga dapat mengirim skor secara berkala saat permainan dimainkan, yang akan menambah tingkat kerumitan lain pada kecurangan - yaitu server dapat memutuskan apakah permainan telah dimainkan cukup lama untuk menjamin skor tertentu, dan juga memastikan bahwa cukup laporan perantara diterima selama waktu bermain (hanya saja tidak membuatnya 100% atau kereta yang masuk ke terowongan dalam perjalanan pulang akan mengakibatkan saya membuang telepon ke luar jendela).

Pada akhirnya seseorang akan menemukan cara untuk melanggarnya, jadi jangan bunuh diri dengan mencoba menghentikannya.

JasonD
sumber
6

Saya menambahkan tabel skor tinggi cepat / kotor ke proyek saya beberapa waktu lalu dan sama sekali tidak berpengalaman dalam keamanan internet / dll ternyata semacam cacat. Anehnya, dengan hampir 1.200.000 skor yang tercatat, saya hanya mungkin memiliki 5 atau 6 kali batch dengan skor yang sangat salah mencapai puncak papan. Sebagian besar skor bahkan tampak lebih seperti kesalahan dalam permainan, daripada "peretasan" yang sebenarnya.

Jadi saya kira satu poin penting adalah: pastikan sistem penilaian game Anda kedap udara , atau setidaknya lakukan pengecekan kelayakan skor yang sangat baik; sekarang, game ini yang saya bicarakan adalah entri Ludum Dare 48 jam, jadi itu bukan hal yang paling stabil di sekitar .. tetapi secara keseluruhan saya pikir itu lebih sering terjadi bahwa pemain biasa akan menemukan / mengeksploitasi kesalahan ingame daripada memiliki seseorang yang secara langsung "meretas" papan peringkat.

Yang mengatakan, saya sedang mengerjakan penulisan ulang proyek ini sekarang, dan saya akan keluar dengan kebingungan. Saya tidak akan membahas terlalu banyak detail, tetapi pada dasarnya saya memiliki semua skor mengirimkan nilai kunci berdasarkan pada sekelompok nilai acak dan hashing dan string ajaib, lalu skor apa pun yang lolos dari pemeriksaan itu dan cukup tinggi untuk menghasilkan yang sebenarnya " Papan peringkat Top X "harus melewati babak validasi lainnya (kali ini dengan nilai kunci kedaluwarsa yang dihasilkan di server, dan pemeriksaan kelayakan yang lebih teliti).

Saya juga menyarankan menggunakan pelacak paket untuk menguji hal-hal apa yang terlihat (saya awalnya melakukan verifikasi yang lebih sederhana yang berarti seseorang dapat menggunakan pelacak paket untuk menemukan dan menggandakan permintaan http skor yang diunggah, tanpa mengetahui string ajaib atau apa pun (berarti Anda membutuhkan skor yang sah terlebih dahulu, tetapi Anda dapat mengirim duplikat skor sebanyak yang Anda inginkan ..)). Saya menggunakan Wireshark untuk menguji ini.

Huh, ini agak lama, tapi mudah-mudahan ini membantu ...

Riley Adams
sumber
Tentu saja. Sepertinya hash asin adalah cara yang baik untuk pergi. Saya tidak mempertimbangkan bahwa mereka akan mengirim ulang skor valid yang sama berkali-kali. GUID dan stempel waktu yang termasuk dalam paket (dan dalam hash) harus dibayar - saya dapat memeriksa dupes di server. Terima kasih.
teedyay
3

Saya bukan ahli dalam bidang ini, tetapi jika saya adalah Anda, saya akan mencoba mengenkripsi skor dengan kunci yang tertanam dalam kode Anda. Orang-orang itu perlu menerapkan rekayasa balik atas kode Anda alih-alih teks biasa yang digunakan untuk layanan web.


sumber
2
Saya akan melangkah lebih jauh. Hasilkan hash dari kode dengan hashing file exe (atau bagian dari itu). Saat mengirim skor, kirim nomor versi dan server dapat memvalidasi menggunakan tabel yang memiliki konstanta versi sederhana nomor-> kode hash. Maka Anda mendapatkan bonus tambahan bahwa jika seseorang menipu dengan memodifikasi program, skor tingginya tidak akan dihitung.
konfigurator
7
Jika seseorang memodifikasi program, mereka sudah dapat mengirim kunci apa pun yang mereka inginkan.
2
@ Jo Wreschnig, mereka dapat mengirim kunci apa saja yang mereka inginkan, tetapi server harus diatur agar hanya menerima kunci yang valid.
AttackingHobo
5
Saya pikir maksud Joe adalah bahwa mereka tidak harus menggunakan hash dari program yang baru dimodifikasi, tetapi hanya dapat mengirim apa pun hash sebelumnya.
Kylotan
1
@ gd1: bagaimana itu membantu?
Kylotan
1

Speedruns pada dasarnya merekam setiap keystroke, dan mereka merekam tentang game SELURUH. Jadi, ya, Anda bisa merekam seluruh permainan, itu tidak mustahil. Setiap cara lain untuk melakukannya adalah crackable melalui reverse engineering (saya tidak bisa stres cukup: Anda tidak menambahkan keamanan, Anda menambahkan ketidakjelasan).

Namun, bahkan jika Anda melakukannya dengan cara ini mereka sebenarnya bisa mengirimkan speedrun. Anda tidak dapat melakukan apa pun untuk mencegahnya.

o0 '.
sumber
2
Biasanya pemutaran, bukan rekaman, adalah bagian yang tidak layak untuk server. Jika klien telah bermain game selama beberapa jam, resimulasi sisi server bisa memakan waktu beberapa menit CPU atau lebih buruk. Itu tidak dapat diterima jika Anda memiliki banyak orang yang mengirimkan skor.
2
Ukuran paket data akan menjadi masalah untuk game mobile - terutama jika pemain membayar bandwidth mereka dengan byte.
teedyay
Oh, apa yang Anda berdua katakan benar. Namun, tidak ada solusi "nyata" lainnya.
o0 '.
11
Anda tidak harus memvalidasi setiap rekaman yang dikirim, Anda hanya perlu memvalidasi yang merekamnya hingga ke 10 besar. Tidak ada gunanya menyontek untuk menjadi # 11. Dan Anda tidak harus melakukannya secara langsung. Proses batch berkala akan baik-baik saja.
abu
@teedyay Katakanlah pemain melakukan rata-rata 5 tindakan per detik, dan setiap tindakan dapat sepenuhnya dijelaskan dalam 32 bit. Itu 20 byte per detik atau 72 kB per jam. Harga data seluler biasa di AS adalah $ 10 per GB, atau 1 sen per 1.000 kB.
Damian Yerrick
1

Saat Anda melakukannya, ada pertanyaan apakah skor tinggi hanyalah pemain yang menemukan exploit (misalnya, jika beberapa hal dalam permainan memberikan penalti skor, dan bug menyebabkan skor negatif untuk "membungkus" menjadi sangat positif ... atau hanya pemain yang menemukan kondisi permainan tertentu seperti tempat aman di papan di mana mereka bisa duduk di sana dan tidak perlu khawatir kehilangan, tanpa batas waktu).

Untuk mengetahui perbedaan antara retasan dan eksploitasi game, mengunggah setidaknya beberapa data permainan akan bagus. Itu akan membantu Anda memperbaiki eksploit, setidaknya.

Untuk beberapa game (terutama yang berbasis giliran), Anda sebenarnya dapat memainkan game melalui server, di mana semua logika game ada di sisi server dan klien hanyalah sebuah antarmuka. Ini tidak hanya membuat peretasan skor jauh lebih sulit, tetapi juga memungkinkan Anda untuk mencatat semua tindakan pemain di server secara sepele, dan dengan demikian memutar ulang permainan apa pun kapan saja. Saya menyadari untuk sesuatu seperti penembak aksi kedutan, ini mungkin tidak praktis.

Ian Schreiber
sumber
1

Buat semua asal keacakan dari satu seed dan simpan input untuk setiap frame. Setiap kali Anda memiliki skor tinggi yang diklaim (katakanlah 50 besar), kirim seed dan input lengkap ke server. Mainkan ulang game di server dan perbarui leaderboard jika Anda mendapatkan skor tinggi.

Jika Anda menganggap ini tidak mungkin untuk game yang lebih canggih karena ukuran permintaan, lihat contoh ini.

Katakanlah game memiliki 8 input tombol (1 pad dan 4 tombol) dan berjalan pada 60fps. Input game satu jam dapat dikirim dengan 3.6KB tanpa kompresi. Sesi Anda mungkin akan memiliki kurang dari satu jam dan kompresi harus menyusut banyak, karena input manusia memiliki banyak redundansi.

Tantangannya adalah membuat game menjadi deterministik, dapat dimainkan dari input yang direkam dan dapat dieksekusi di server.

Vinicius Canaa
sumber
0

Belum pernah mengimplementasikan ini sebelumnya tetapi ...

Kirim skor secara bertahap dengan stempel waktu. Ini memberi Anda log untuk melihat seberapa sering skor meningkat serta cara untuk melacak "momentum" skor tinggi itu.

Anda kemudian akan menetapkan tonggak / kriteria untuk skor Anda.

Misalnya: Skor yang lebih besar dari 20.000 tidak dapat tiba dalam 20 detik pertama dalam suatu game. Skor lebih besar dari 250.000 tidak dapat tiba tanpa entri lebih dari 200.000.

Ini tidak persis sama dengan mengirim status permainan, tetapi mendekati itu.

Manfaat Samping: Pikirkan semua statistik permainan yang berguna yang akan Anda dapatkan dari ini. Seseorang mungkin membayar uang baik untuk itu.

Markus
sumber