Software sicuro: come assicurarsi che il chiamante sia autentico?

6

Per i giochi multiplayer (competitivi), c'è spesso il problema di dover rilevare i giocatori illegittimi in modo che possano essere negati il servizio. D'altro canto, i giocatori legittimi dovrebbero naturalmente avere accesso al servizio.

Questi giocatori illegittimi sono simulati in un modo o nell'altro, ma vorrei concentrarmi su quando simulato attraverso l'uso di software di terze parti che utilizza API di terze parti per interrogare o inviare informazioni a un server centrale.

Vorrei capire in che modo questa API deve essere progettata in modo che un software fraudolento (di terze parti) non possa pretendere che sia il software legittimo (di prima parte) già distribuito all'utente finale.

Per essere chiari, il software di terze parti è ottenuto da un utente malintenzionato, in cui il software di terze parti è stato compilato con l'API che comunica al server. Poiché l'API viene distribuita a un utente legittimo, gli sviluppatori del software dannoso devono semplicemente eseguire il reverse-engineer (magari tramite de-offuscamento) dell'API e utilizzarlo.

Esiste un modo in cui questa API può implementare alcuni protocolli di sicurezza in modo che gli utenti illegittimi non possano accedere al server?

Ho pensato di richiedere una password che viene inviata al server per verificare il chiamante, ma non riesco a vedere come possiamo distinguere tra utenti reali e utenti non autorizzati.

    
posta Nick Miller 29.10.2015 - 22:54
fonte

2 risposte

3

Fondamentalmente, non puoi ...

Qualsiasi cosa sul lato client deve essere considerata pubblica. Certo, puoi provare a offuscare l'API con varie tecniche, ma c'è sempre un modo per decodificarlo e costruire la tua API di botting. Devi considerare che un hacker può controllare tutto sul lato client.

Che cosa puoi proteggere?

L'unica cosa che puoi proteggere è il tuo server. Quindi, se vuoi controllare ciò che i tuoi giocatori possono o non possono fare, devi convalidare ogni loro azione sul lato server. Il server deve essere la fonte della verità. A questo punto, se il server è in grado di rilevare qualsiasi azione non valida, un utente malintenzionato potrebbe comunque creare un client "non valido", ma le uniche azioni che questo client potrebbe eseguire sono azioni valide. Quindi, è facile vero?

Bene, non così tanto. Cercare di convalidare tutto sul lato server crea molti problemi. Molti sono legati al modo in cui il gioco funzionerà ma anche, devi capire come includere i problemi di rete, come un utente in ritardo. Ad esempio, se si va all'estremo in termini di protezione, andrà in questo modo:

  • Il client invia il comando di azione al server
  • Il server esegue l'azione (se è valida) e invia il risultato al client
  • Il client visualizza semplicemente il risultato che il server gli ha detto di visualizzare.

È semplicissimo da fare e sconfiggere qualsiasi azione non valida, MA distrugge totalmente l'esperienza dell'utente per chiunque abbia una cattiva rete. Quando un utente preme un tasto per andare avanti, si aspetta di andare avanti immediatamente. Dal momento che ogni azione esegue un round trip sul lato server, gli utenti che sono in ritardo subiranno un'azione lenta ad ogni turno.

Che cosa puoi fare?

L'idea migliore è avere un sistema di mix. Si esegue la convalida sul lato server, MA si esegue ancora "l'azione" sul lato client non appena si verificano. In questo modo l'utente pensa che la sua azione avvenga nel momento in cui li fa, mentre in realtà potrebbero essere eseguiti pochi millisecondi o secondi dopo. In pratica stai facendo una simulazione sul lato client, e se il server ti conferma che tutto era a posto, la simulazione viene mantenuta. Nel caso in cui la simulazione è stata ritenuta errata dal server, queste azioni sono "invertite".

È una specie di sofferenza avere quel tipo di sistema giusto, ma è l'unica cosa che fornisce una buona esperienza utente mentre sconfigge completamente l'azione non valida.

Un approccio più semplice: registrazione

Dal momento che controllare realmente tutto sul lato server può essere un problema, poiché è difficile decidere cosa fare quando la cronologia deve essere riscritta, un approccio più semplice è quello di fare il logging. Lasciate che il client faccia quasi quello che vuole, è la fonte della verità, ma poi, dal lato server, registrate ogni azione e rilevate ogni singola azione non valida. Le azioni non valide si verificheranno ancora, ma se un cliente ne fa troppe, puoi tranquillamente presumere che non sia un cliente valido e, in ultima analisi, lo benda.

Informazioni offuscanti: Effort VS Gain

L'offuscamento di elementi sul lato client rende molto più difficile per un utente malintenzionato creare un programma di imbottigliamento in modo da scoraggiare molti aspiranti in cerca di un minor numero di giocatori problematici.

Non sono un esperto in tali tecniche, ma è qualcosa di simile a:

  • modifica di tutti i nomi di variabili / metodi
  • inserimento di codice inutile per confondere il reverse engineer
  • crittografia del codice (ma la password è ancora nascosta da qualche parte nel codice ...)

È davvero roba da rendere più doloroso provare a decodificare il client del gioco ...

    
risposta data 30.10.2015 - 16:02
fonte
3

Questo è uno dei maggiori problemi che i giochi competitivi online devono affrontare. Sfortunatamente, non esiste una soluzione semplice. Il modo più efficace per rilevare bot o utenti malintenzionati è l'analisi comportamentale.

    
risposta data 29.10.2015 - 22:59
fonte

Leggi altre domande sui tag