Bagaimana mencegah server yang diretas menipu server master?

8

Saya ingin mengatur model permainan multilayer berbasis kamar di mana pemain dapat menyelenggarakan pertandingan dan menjadi tuan rumah (yaitu server dengan kekuatan otoritatif). Saya ingin meng-host server master yang melacak item pemain, peringkat, uang tunai, exp, dll.

Dalam model seperti itu, bagaimana saya bisa mencegah seseorang yang meng-hosting game (dengan server yang dimodifikasi) dari menipu server master dengan hasil pertandingan yang tidak valid, sehingga mendapatkan exp, uang, atau peringkat.

Terima kasih. -Body

Cody Smith
sumber
4
Jawaban generik yang lebih pendek: Anda tidak bisa. Segera setelah kode dijalankan pada sistem yang tidak di bawah kendali Anda, seseorang dapat meretasnya entah bagaimana, seperti menjalankan seribu pertandingan dan hanya melaporkan yang memiliki hasil yang baik.
Jari Komppa
1
Saya setuju dengan @JariKomppa. Juga, tidak perlu menandatangani posting Anda.
jcora
1
@Cody: Saya telah memberikan dua jawaban di bawah ini, berdasarkan interpretasi yang berbeda dari pertanyaan Anda. Bisakah Anda memberi tahu saya yang mana (jika salah satu) lebih dekat dengan apa yang ingin Anda tanyakan?
Ilmari Karonen

Jawaban:

4

Sudah ditunjukkan bahwa jawaban saya sebelumnya mungkin didasarkan pada kesalahpahaman tentang apa yang Anda maksud dengan "spoofing". (Jika demikian, tolong beri tahu saya dan saya akan menghapusnya.)

Jika yang ingin Anda cegah adalah server game yang mengirim data palsu ke server master, maka - seperti yang dicatat Jari Komppa - itu umumnya tidak mungkin dicegah sepenuhnya. Faktanya, ini hanyalah varian dari masalah pencegahan kecurangan multi-pemain klasik , kecuali dengan server perantara dan bukan klien yang dicurigai melakukan kecurangan. Banyak teknik yang sama yang digunakan untuk pencegahan kecurangan tradisional dapat bekerja di sini juga, tetapi seperti biasa, tidak ada yang benar-benar aman.

Yang mengatakan, ada yang beberapa hal yang dapat Anda lakukan yang akan secara khusus membantu melawan kecurangan server. Salah satunya adalah meminta setiap pemain dalam pertandingan secara terpisah menghubungi server master dan mengonfirmasi bahwa mereka berpartisipasi dalam pertandingan itu. (Anda mungkin ingin melakukan itu sebelum pertandingan dimulai, sehingga Anda dapat memastikan semua orang setuju siapa peserta dan agar tidak ada yang tergoda untuk mengklaim bahwa mereka tidak berpartisipasi dalam pertandingan yang kalah. Anda dapat menggunakan tanda tangan digital untuk tunda bahwa, pada dasarnya, Anda dapat meminta setiap pemain dalam pertandingan menandatangani pesan yang mengatakan " Saya pemain X dan saya berpartisipasi dalam pertandingan M di server S pada waktu T dengan pemain Y, Z dan W."dan kirimkan ke server permainan, yang nantinya dapat menyampaikannya ke server master.) Dengan begitu, Anda setidaknya dapat memastikan bahwa server yang curang tidak dapat memengaruhi peringkat pemain mana pun yang tidak benar-benar bermain di server itu. .

Ini sangat berguna jika Anda menggunakan sesuatu seperti peringkat Elo di mana peringkat pemain sebagian besar tergantung pada kinerja relatif mereka . Tentu, seseorang yang menjalankan server palsu mungkin masih membuat banyak akun palsu dan mengirimkan hasil yang mengatakan bahwa akun mereka sendiri mengalahkan yang palsu, tetapi dengan sistem peringkat relatif, semua yang akan dilakukan adalah membuat peringkat akun penipu sedikit di atas palsu ( yang pada gilirannya akan memiliki peringkat paling bawah).

Hal lain yang jelas dilakukan untuk mencegah kecurangan adalah membiarkan pemain memverifikasi hasil pertandingan mereka langsung dari server master. Jika seorang pemain memenangkan pertandingan di server baru, tetapi hasil yang dikirim ke server master mengatakan bahwa mereka kalah (atau jika hasilnya tidak pernah dikirim sama sekali), itu akan membuat mereka tahu bahwa ada sesuatu yang mencurigakan sedang terjadi. Mudah-mudahan, pada saat itu mereka akan melaporkan server untuk kecurangan, atau setidaknya memilih dengan kaki mereka dan tidak pernah bermain di server itu lagi.

Faktanya, Anda dapat membuat ini otomatis: setelah setiap pertandingan, setelah hasilnya dikirim ke server master, minta klien mengambilnya kembali dari server master dan membandingkannya dengan bagaimana klien berpikir permainan berakhir. Jika ada ketidaksesuaian, laporkan baik ke pemain (sehingga mereka akan tahu ada yang salah) dan ke server master (sehingga Anda dapat mendeteksi server yang curang). Tentu saja, sebagai operator server master, Anda kemudian harus memutuskan siapa yang berbohong - server atau pemain - tetapi mudah-mudahan dalam kebanyakan kasus itu akan cukup jelas dari pola laporan.

Ilmari Karonen
sumber
Terima kasih banyak Ilmari, kedua jawaban itu fantastis (tolong tetap di sana). Maaf atas keterlambatannya, saya teralihkan. -Cody
Cody Smith
5

Catatan: Jawaban ini mungkin didasarkan pada kesalahpahaman dari pertanyaan - lihat komentar di bawah.


Jawaban umum singkat: gunakan tanda tangan digital .

Secara khusus, server master harus memiliki kunci pribadi untuk skema tanda tangan digital yang sesuai (RSA, DSA, ECDSA, dll.) Dan entah bagaimana harus secara aman menyampaikan kunci publiknya ke semua klien. Kemudian server dapat menandatangani data apa pun yang dikirimkannya ke klien dengan kunci pribadi (atau mungkin menggunakannya untuk menegosiasikan rahasia bersama yang dapat digunakan untuk mengenkripsi secara simetris dan / atau mengautentikasi komunikasi antara itu dan klien tertentu) dan klien dapat menggunakan kunci publik untuk verifikasi bahwa tanda tangan telah dibuat oleh server.

Tentu saja, masalah Anda berikutnya adalah mendistribusikan kunci publik sehingga server jahat tidak bisa menipu itu dan mengganti kunci publiknya sendiri. Itu mungkin tidak terlalu sulit jika Anda bisa melakukannya di muka (misalnya mendistribusikan kunci bersama dengan permainan yang dapat dieksekusi), tetapi akan sulit jika Anda harus melakukannya nanti, misalnya karena identitas server master tidak dikenal dalam muka. Salah satu solusi standar adalah mendistribusikan beberapa kunci publik lainnya (yang kunci privasinya sesuai hanya diketahui oleh Anda) terlebih dahulu untuk semua klien, dan kemudian menandatangani pesan yang berisi kunci publik server master dengan kunci lainnya sebelum menyiarkannya.

Bahkan, Anda bahkan dapat memperpanjang rantai tanda tangan tersebut lebih jauh - katakanlah, memiliki satu kunci privat master super rahasia, yang disimpan di tempat aman dan kunci publiknya diketahui semua klien, dan kunci pribadi "penggunaan sehari-hari" lainnya yang digunakan untuk benar-benar menandatangani kunci server, dan yang kunci publiknya sendiri ditandatangani dengan kunci master super rahasia sebelum dikunci di brankas. Ini tidak begitu berguna dengan sendirinya, tetapi menjadi berpotensi sangat berguna jika Anda juga menyertakan beberapa mekanisme untuk mencabut kunci yang disusupi, sehingga misalnya jika kunci penggunaan harian Anda bocor, Anda bisa mencabutnya dan membuat yang lain.

Apa yang saya jelaskan di atas adalah jenis infrastruktur kunci publik yang belum sempurna . Sebenarnya menerapkan satu dengan aman bisa menjadi sangat rumit, tetapi untungnya itu sudah dilakukan sebelumnya. Bahkan, setiap kali Anda terhubung ke situs web (seperti Wikipedia ) menggunakan HTTPS , ini persis seperti yang dilakukan browser Anda: ia menerima sertifikat kunci publik dari server, memverifikasi bahwa sertifikat tersebut cocok dengan nama server di URL, tidak terdaftar sebagai dicabut dan telah ditandatangani oleh otoritas sertifikat yang dikenal dan dipercaya , dan kemudian menggunakannya untuk menegosiasikan kunci enkripsi simetris sementarahanya diketahui oleh dirinya sendiri dan oleh pemilik kunci pribadi yang sesuai dengan sertifikat. Kunci simetris ini kemudian digunakan untuk mengenkripsi dan mengotentikasi semua data yang dikirim antara klien dan server.

Secara khusus, Anda benar-benar harus melihat pada perpustakaan SSL / TLS yang ada (yang biasanya datang dengan implementasi PKI X.509 ), atau mungkin di SPKI . Ini masih agak rumit, tetapi mungkin lebih mudah (dan lebih aman) daripada mencoba menggulung sendiri.

Ilmari Karonen
sumber
Saya mungkin salah, mohon perbaiki jika memang demikian, tetapi saya pikir Anda tidak mengerti maksud pertanyaan itu. Dia ingin memungkinkan orang membuat server sendiri, yang melaporkan statistik ke server master. Ketika dia melakukan itu, tidak mungkin dia benar-benar bisa mencegah peretasan (@Jari Kompppa benar). -1 untuk saat ini.
jcora
1
@Bane: Anda mungkin benar. Saya menafsirkan frasa "menipu server master" dalam pertanyaan sebagai " berpura-pura menjadi server master", tetapi setelah membaca kembali pertanyaan itu, saya dapat melihat bahwa ia mungkin berarti " mengirim data palsu ke server master" sebagai gantinya. Anda benar bahwa tanda tangan digital tidak akan membantu melawan hal itu.
Ilmari Karonen
2

Ini tergantung pada sifat permainan dan alasan Anda menurunkan peran server.

Dalam keadaan tertentu Anda mungkin sebagian besar dapat mencapai ini dengan log audit kriptografi. Misalnya jika ini adalah permainan berbasis giliran dua pemain dan Anda dapat mengatur agar setiap klien memiliki kunci asimetris pribadi untuk keperluan tanda tangan, Anda dapat memiliki protokol di sepanjang garis

  • Status awal S0 termasuk pengidentifikasi unik untuk game (untuk mencegah serangan replay) dan dinyatakan konstan. Jika ada elemen acak, itu harus diproduksi oleh server pusat dan di-cache di sana untuk perbandingan di masa depan.
  • P1 membuat langkah m1; menandatangani S1 negara bagian yang dihasilkan, menghasilkan tanda tangan C1; dan mengirimkannya dengan kepindahannya (S1, C1, m1) ke P2.
  • P2 membuat langkah m2; menandatangani S2 yang dihasilkan, menghasilkan tanda tangan C2; dan mengirimkannya dengan kepindahannya (S2, C2, m2) ke P1.
  • dll.

Pada akhirnya kedua klien mengirimkan hasilnya ke server pusat, dan jika mereka tidak setuju maka mereka menyerahkan jalur audit: (S1, C1, m1), (S2, C2, m2), dll. Karena setiap pemain telah menandatangani gerakan mereka, mereka berkomitmen untuk mereka.

Ini masih rentan terhadap satu pemain DDOSing yang lain untuk mencegah mereka mengirimkan hasil mereka, tetapi sebenarnya tidak banyak yang dapat Anda lakukan tentang itu.

NB Ini hanya sketsa cepat - saya yakin bahwa jika Anda mempostingnya ke crypto.stackexchange.com seseorang akan menyodok lubang besar di dalamnya - tapi saya pikir prinsipnya adalah suara. Dapatkan skema apa pun yang Anda desain ulas oleh seseorang yang mengetahui barang-barang mereka sebelum Anda mulai bergantung padanya.

Peter Taylor
sumber
Anda dapat menghindari masalah DoS dengan meminta log audit untuk diserahkan kecuali semua pemain menyerahkan hasil dan menyetujui hal itu. Namun, masalah lain adalah bahwa seorang pemain yang menyadari bahwa mereka kalah bisa dengan mudah keluar dari permainan. Anda bisa mengesampingkan bahwa drop out berarti kalah, tetapi kemudian seorang pemain bisa membuatnya terlihat seperti lawan mereka adalah orang yang keluar dengan menambahkan langkah tambahan ke jejak audit mereka. Salah satu cara yang akan memungkinkan pemain untuk men-download audit yang diajukan dan kemudian mengubah mereka sendiri, tapi itu bisa mengakibatkan beberapa permainan yang agak berlarut-larut.
Ilmari Karonen