(Android) server di hacking da un semplice socket

2

Ho scritto un gioco per Android. Ora, voglio collegare i segni dei giocatori.

Il codice sotto è il programma lato client, che invia i loro nomi, paesi e marchi al server. Fondamentalmente, uso ':' per separare le informazioni.

Tuttavia, gli hacker possono conoscere il mio server ip e port decompilando il file .apk. Quindi, possono creare un'applicazione java di base per accedere al mio server. Potrebbero inviarmi "hacker: badserver: 123456789". Infine, il contrassegno superiore diventa "123456789".

È un metodo più sicuro per connettere i dati dell'utente?

Socket client = new Socket(ip, port);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hacker:HK:3910");
    
posta SzeKaKa 02.07.2014 - 15:39
fonte

3 risposte

2

Hai riscontrato due problemi "difficili": autenticazione e autorizzazione. C'è abbondante di informazioni online su questo argomento, ma nel tuo caso penso che il tuo problema risale alla progettazione dell'app.

Iniziamo con due domande:

  1. Come fai a sapere se l'utente è autorizzato a pubblicare un punteggio elevato? ( Autorizzazione )
  2. Come sai che la connessione al tuo server proviene da un vero utente di gioco e non da qualcuno che impersona il gioco come nel tuo esempio Java? ( Autenticazione )

Prima di provare a reinventare la ruota, sappi che ci sono molte librerie che fanno proprio questo, con l'ulteriore vantaggio di essere maturi, testati, funzionanti e ben documentati.

Non conoscendo i dettagli della tua app, ecco alcuni suggerimenti:

  • Consenti agli utenti di giocare in modalità "solo" o in "online". Nella precedente modalità il gioco è autonomo e non è necessario effettuare alcuna connessione di rete (utile per gli utenti che conoscono la privacy). In quest'ultimo caso gli utenti DEVONO registrarsi con il proprio server.
  • Una volta che un utente è registrato (login / password) e hai verificato che in realtà sono un utente "reale" (risponditore di e-mail, messaggio di testo, ecc.), il tuo server può inviare un "token" giocare.
  • Quando l'app vuole inviare il suo punteggio più alto al tuo server DEVE autenticarsi fornendo il token in un modo simile a quello che utente @ mike-mackintosh ha descritto nella sua risposta.
  • Tutte le comunicazioni da / a devono ovviamente essere crittografate con TLS o altre forme di crittografia avanzata.
  • La tua app dovrebbe convalidare i certificati per evitare attacchi man-in-the-middle.

Lo scenario è semplificato: ovviamente un utente malintenzionato con risorse sufficienti potrebbe registrare un account falso, eseguire il reverse engineering dell'app, determinare il messaggio da utilizzare e inviare dati fasulli al server. Per impedirlo dovrai chiedere a la piattaforma di verificare che l'app non sia stata manomessa, il che significa a sua volta estendere la catena di trust al sistema operativo che esegue l'app, e così via . Alla fine diventa complicato (mai sentito parlare di " trusted computing " e gestione dei diritti digitali?) E dipende dal valore che stai cercando di proteggere.

Un'altra strada della ricerca potrebbe essere una forma di convalida sul lato server. Ad esempio, ogni volta che un utente pubblica un punteggio superiore a X, deve anche fornire "prova" che ha sbloccato un determinato risultato, ad es. una stringa casuale che viene salvata nel profilo utente quando raggiunge un punto specifico nel gioco. In questo caso è possibile ricontrollare sul lato server che l'utente ha effettivamente superato i risultati precedenti in precedenza.

Puoi rendere più interessanti le cose generando i token di "livello" combinando l'IMEI del telefono con una chiave casuale e utilizzando una qualche forma di crittografia a chiave pubblica in modo che ogni utente sia legato al telefono. Il che funzionerebbe, a meno che qualcuno non usasse una ROM personalizzata per Android che consentisse di modificare l'IMEI del telefono e così via.

    
risposta data 02.07.2014 - 16:24
fonte
0

Hai alcune opzioni. Onestamente, molto probabilmente vorrai abilitare qualche tipo di autenticazione, come HMAC per inviare le richieste per assicurarti che vengano dalla tua applicazione. Se non conosci HMAC, google, c'è molto contenuto.

Dai un'occhiata a questa Security.StackExchange risposta:

A message authentication code (MAC) is produced from a message and a secret key by a MAC algorithm. An important property of a MAC is that it is impossible¹ to produce the MAC of a message and a secret key without knowing the secret key. A MAC of the same message produced by a different key looks unrelated. Even knowing the MAC of other messages does not help in computing the MAC of a new message.

An HMAC is a MAC which is based on a hash function. The basic idea is to concatenate the key and the message, and hash them together. Since it is impossible, given a cryptographic hash, to find out what it is the hash of, knowing the hash (or even a collection of such hashes) does not make it possible to find the key. The basic idea doesn't quite work out, in part because of length extension attacks, so the actual HMAC construction is a little more complicated. For more information, browse the hmac tag on Cryptography Stack Exchange, especially Why is H(k||x) not a secure MAC construction?, Is H(k||length||x) a secure MAC construction? and HMAC vs MAC functions. There are other ways to define a MAC, for example MAC algorithms based on block ciphers such as CMAC.

Inoltre, per proteggere la tua fonte, usa proguard, che aiuta a offuscare l'origine APK da un decompile dalvik. link

Questo non è infallibile, ma estirperai rapidamente alcune delle uova cattive.

    
risposta data 02.07.2014 - 15:49
fonte
0

Ci sono due cose che dovresti fare per risolvere il tuo problema.

Uno sta esaminando SSL reciproco . Ciò consentirà al tuo client di autenticare il tuo server e il tuo server autentificherà il tuo client evitando il ripudio. Ci sono alcuni link su SE su questo.

Mutual SSL provides the same things as SSL, with the addition of authentication and non-repudiation of the client authentication, using digital signatures. When mutual authentication is used the server would request the client to provide a certificate in addition to the server certificate issued to the client.

autenticazione reciproca tra due client

link

La seconda cosa che dovresti fare in modo sicuro è bloccare l'API del tuo server. Convalida tutto l'input che ricevi indipendentemente.

Renditi conto che in Android l'utente ottiene il tuo apk, quindi in molti casi gli sforzi di sicurezza possono essere superati. Tuttavia, con i passaggi precedenti, dovresti essere in grado di aumentare il livello di impegno a tal punto che gli utenti malintenzionati non saranno interessati a spendere il tempo necessario per interrompere la tua app.

    
risposta data 06.07.2014 - 16:18
fonte

Leggi altre domande sui tag