Come garantire che un utente non stia utilizzando un client compromesso

3

Background: abbiamo il codice per un MMOG di 20 anni che alcune persone giocano ancora e abbiamo i diritti per aprirlo. Attualmente, il server non è terribilmente autorevole, cioè il client è quello che registra hit / kill, ecc. Il server controlla certe cose, ma se apriremmoourcing sarebbe abbastanza facile semplicemente return nella funzione Player::Hit e quindi diventa invincibile.

Mi chiedo quanto segue: come posso evitare questo senza riscrivere l'intero server per essere autorevole che sarebbe un enorme sollevamento? Cioè: so fino a un certo punto che non è del tutto prevenibile, ma mi chiedo se abbiamo fatto qualcosa di simile a uno scambio di chiavi privato / pubblico prima di accedere al server, e quelle chiavi erano state gitignorizzate, o qualcosa del genere: potevamo fallo?

Più precisamente: come si farebbe? Penso che i benefici per l'opensourcing superano i rischi dato che il cliente è invecchiato male e abbiamo un disperato bisogno di aiuto da parte del pubblico per modernizzare (se vogliamo che il gioco continui), ma prima di aprire il sourcing preferirei non riscrivere l'intero server .

    
posta FreeMemory 13.07.2018 - 19:56
fonte

3 risposte

9

NON FIDARE MAI DEL CLIENTE!

No seriamente NON FIDARE MAI IL CLIENTE!

Terza volta, in modo da ricordare NON FIDARE MAI IL CLIENTE! Corollario del servizio clienti: il cliente sta mentendo!

Devi fare tutti i calcoli importanti, i lanci di dadi, ecc. sul lato server. solo l'input dovrebbe essere preso dal client, e questo dovrebbe essere sospetto (progettare il tuo input in modo che sia meno abusato (la tua vera domanda?))

IIRC alcuni giochi calcoleranno come dovrebbe apparire lo schermo, incluso il ritardo di rete, per il tuo cliente e rilevano il rilevamento su quello.

Non hai davvero scelta, ma rendere il cliente autorevole. Questo è sempre più vero se si crea il codice open source; la sicurezza attraverso l'oscurità non è affatto una sicurezza.

    
risposta data 13.07.2018 - 20:18
fonte
6

Il "NON FIDARE MAI IL CLIENTE!" la risposta è assolutamente giusta in ogni modo tecnico, e non c'è davvero alcun modo per aggirare questo. È fisicamente impossibile ottenere ciò che stai chiedendo.

Ma, riscrivendo il client & server e rendere il server autorevole è un sacco di lavoro e non si può effettivamente avere il tempo e la manodopera per essere in grado di farlo. Ad ogni modo, che senso ha avere un client open source che gli utenti non possono modificarlo? Forse fai un passo indietro e pensa a cosa stai REALMENTE cercando di realizzare per il tuo gioco e amp; la sua comunità

Considerando questo come un problema X-Y, ecco una soluzione alternativa che non è quella che hai chiesto, ma potrebbe essere un approccio migliore:

  • Smetti di preoccuparti di barare come un problema tecnico e trattalo come un problema sociale.

  • Avere più server, alcuni che non consentono "imbroglioni" e alcuni che consentono esplicitamente "barare". (Qualunque sia la tua definizione di imbroglio.)

  • Se qualcuno ha hackerato il client e sta "barando" sul tuo server che non lo consente, presumibilmente significa che li hai catturati perché ha ovviamente degli effetti osservabili e rende il gioco meno divertente per gli altri. Okay, quindi avvertite e / o kick offenders (o meglio, invitateli ai server giusti per far funzionare i loro client "cheat"). Costruisci una cultura nella tua comunità che la gente sappia che alcuni server sono per seri "non imbroglioni", e altri sono per le persone che "imbrogliano" e provano cose folli - hanno solo bisogno di usare i server giusti per quello che stanno cercando di fare.

  • Permetti alle persone di connettersi ai server con client modificati e "imbrogliare" - in realtà è un modo divertente di giocare con alcuni giochi, e spesso non riduce il divertimento per gli altri. Potresti essere molto sorpreso dalla tua community - potrebbero trovare mod fantastiche per i clienti che, sebbene non siano come pensavi che il gioco avrebbe dovuto funzionare, in realtà sono un modo più divertente di giocare. C'è molta potenza nell'estensibilità.

  • Ricorda che stai parlando di un gioco di 20 anni. La gente lo sta suonando perché gli piace e ne è appassionato. Se qualcuno si prende la briga di modificare il software client e ricompilarlo solo per imbrogliare, il loro obiettivo REAL probabilmente non è solo quello di imbrogliare, ma di mettere in mostra le proprie capacità tecniche. Crea una comunità accogliente invece di cercare di ostacolarli istantaneamente e trasformerai la maggior parte di questi tipi di persone in contributori tecnici al tuo gioco.

risposta data 13.07.2018 - 22:44
fonte
1

Non preoccuparti di provare a identificare un client compromesso

I'm wondering the following: how do I prevent this without rewriting the entire server to be authoritative which would be a huge uplift?

Purtroppo non puoi.

  • Lo stato del gioco è vulnerabile agli exploit perché il server non lo protegge / gestisce.
  • Il tuo server è "vulnerabile" perché trasmette i cambiamenti di stato sfruttati ai suoi clienti.

L'unico modo per risolvere il problema è far sì che il server gestisca lo stato del gioco.

... That is: I know to an extent it's not entirely preventable, but I'm wondering if we did something like had a private/public key exchange before login to the server, and those keys were gitignored, or something to that effect: could we do it?

Probabilmente questo scambio di chiavi potrebbe essere facilmente recuperato se qualcuno volesse passare attraverso il problema di creare un client hackerato. Il client compromesso sarebbe stato modificato per inviare dati come se fosse quello reale.

Trappole di Kicking / Banning dei client compromessi

Le risposte precedenti hanno menzionato il fatto che puoi semplicemente kickare / bloccare gli hacker, ma questo è un po 'più complesso di quanto possa sembrare al valore nominale.

Il successo dipende da:

1. Quanto bene la comunità può identificare quando qualcuno sta hackerando

  • Se vedi un giocatore che si teletrasporta su tutta la mappa, certo, è piuttosto ovvio, ma puoi rilevare problemi più sottili (ad esempio, se i client hacker sono in grado di vedere parti della mappa, non dovrebbero essere in grado per vedere? O aimbots?)

  • Se il tuo gioco è competitivo, i giocatori possono discutere su chi ha hackerato o chi ha appena avuto un buon obiettivo / tempo di reazione / buona fortuna, ecc.

  • Se il tuo motore è così vulnerabile che i clienti decidono uccisioni / danni, il tuo team di moderazione probabilmente avrà molto lavoro da fare per loro. Qualsiasi miglioramento apportato alla sicurezza del tuo gioco comporterà meno lavoro manuale rivedendo i presunti video di gioco degli hacker, ecc.

2. Quanto bene il server può identificare i tuoi giocatori

Se hai una grande comunità, tentare di proteggere tutti i server pubblici in cui chiunque può unirsi sarà piuttosto difficile.

Identificazione degli utenti per indirizzo IP

Vantaggi:

  • Facilità d'uso. Non è necessaria alcuna registrazione aggiuntiva per il tuo gioco, la maggior parte degli utenti sarà in grado di scaricarlo e giocare.

Svantaggi

Se i tuoi server accettano solo dati da qualsiasi indirizzo IP,

  • Gli utenti possono facilmente utilizzare i proxy per aggirare i divieti IP.
  • Gli utenti legittimi con connessioni Internet consumer cambieranno frequentemente gli indirizzi IP.
  • Dalla mia esperienza alcuni tentativi di amministratori di server di bloccare gli hacker noti con intervalli di divieto hanno inavvertitamente causato il blocco dell'80% dei clienti di un ISP.
  • I nuovi utenti potrebbero provare a giocare per la prima volta e scoprire che sono bannati senza motivo, mi consiglia di dare loro un modo per contattare qualcuno su questo.

Altri metodi di identificazione

  • Un motore di gioco che ho usato ha aggirato il problema dell'indirizzo IP facendo in modo che gli utenti si registrino per gli account e quindi autorizzando i server a autorizzare solo alcuni giocatori. Questi account erano richiesti solo per i server più "seri" (per i tornei, ecc.)

  • Su una scala più piccola, il solo fatto di consentire ai tuoi server di essere protetti da password può contribuire notevolmente a mantenere gli hacker fuori dai giochi competitivi e seri.

La protezione dello stato del gioco è il modo migliore per tenere lontani gli hacker

  • Il modo migliore per ridurre il rischio che un client hacker rovini il gioco per altri client è di fare in modo che ogni modifica allo stato del gioco (che riguarda altri client) sia convalidata dal server.

  • In questo modo anche se un client hacker decide di ignorare gli aggiornamenti del server dicendo che un giocatore ha subito danni, tutto ciò che fa è desincronizzare il gioco stesso del giocatore.

Sfide progettuali per creare un server meno vulnerabile

C'è molto da coprire, ma citerò i principali problemi che ho affrontato come qualcuno che ha lavorato su questo:

Creazione di un client reattivo

  • Affinché il gioco rimanga fluido, è probabile che il client debba eseguire qualche codice da solo e fare qualche ipotesi su quale sarà il prossimo frame valido.

  • Alcune operazioni eseguite dal client, come ad esempio i movimenti del mouse, si verificano troppo velocemente perché il server possa convalidare, ma se non lo fai, puoi aprirti ai client hacker che spostano il mouse impossibilmente veloce o preciso.

  • Potrebbe non esserci una risposta facile per tutti gli exploit possibili, ad esempio, gli aimbots e gli hack da muro sono ancora in fase di realizzazione per giochi FPS ben finanziati e popolari.

Consentire al client di ricevere dati dal server

  • Sapere quali dati del client da buttare quando il server invia al client un aggiornamento non è facile.

  • Il codice del client potrebbe non solo aggiornare i dati del gioco principale, ma anche tutte le interpolazioni del client nel mezzo, per evitare di disturbare il jitter / rendering glitch.

risposta data 14.07.2018 - 20:57
fonte

Leggi altre domande sui tag