Assicurarsi che il servizio Web sia accessibile solo da applicazioni autorizzate

30

Prefazione

La mia app mobile consente agli utenti di creare account sul mio servizio. Oltre ad essere in grado di accedere con provider di autenticazione esterni, come Facebook, voglio dare all'utente la possibilità di creare un account usando un indirizzo e-mail.

Normalmente, tutte le chiamate al mio servizio web sono autenticate tramite l'autenticazione di base su HTTPS. Tuttavia, la funzione di creazione dell'account (anche su HTTPS) non ha alcuna autenticazione, poiché l'utente non ha ancora credenziali.

Se stavo scrivendo un sito Web, userei Captcha per impedire che il mio database venga riempito di account fasulli tramite script.

Domanda

Come posso verificare che le nuove richieste utente provengano da un'istanza della mia applicazione e non da un bot?

Se tutti i dati vengono inviati su HTTPS, è sufficiente che l'applicazione abbia una password memorizzata per dire "hey, sono io!"? Quali sono le migliori pratiche per fare qualcosa del genere?

Elaborazione

Il server è scritto in Java usando Spring Framework e Spring Security. È ospitato su App Engine. Il costo è una preoccupazione (sia di rete che di calcolo). L'app è un gioco mobile. Non memorizzo informazioni sensibili come i numeri delle carte di credito. Tuttavia, tengo traccia degli acquisti degli utenti negli store Apple e Android. La mia più grande preoccupazione è l'esperienza del giocatore. Non voglio che un hacker abbassi il sistema e rovini il divertimento di qualcuno nel gioco. Inoltre, devo assicurarmi che il giocatore affronti il minor numero di ostacoli possibile durante la creazione di un account.

Aggiornamento / Chiarimento

Sto cercando un modo per garantire che tutte le chiamate al servizio provengano da un'istanza della mia applicazione. Gli account utente sono già protetti perché il servizio stateless richiede di inviare le proprie credenziali ad ogni richiesta. Non ci sono sessioni e nessun cookie.

Devo interrompere bot-spam sulle chiamate non protette, come creare un nuovo account. Non posso usare captcha perché non si adatta al flusso dell'applicazione.

    
posta sbsmith 18.09.2013 - 05:38
fonte

5 risposte

23

La linea di fondo è che dovrai inserire un segreto nella tua app. È una sfortunata verità che DRM (che è più o meno quello che stai cercando di ottenere) è impossibile. Una persona con accesso alla tua app sarà sempre in grado di recuperare il segreto incorporato, indipendentemente da ciò che fai per proteggerlo.

Detto questo, ci sono molte cose che puoi fare per rendere il tuo segreto incorporato molto difficile da recuperare.

  • Costruisci in fase di runtime : non memorizzare il segreto in una stringa o in un file di configurazione in qualsiasi punto della tua app. Invece derivano da una serie di calcoli in fase di esecuzione. Questo impedisce agli aggressori di sfogliare semplicemente la tua app con un hexeditor.

  • Non inviarlo mai sul filo - Utilizza un sistema challenge-response di qualche tipo con un nonce di > 128bit, in questo modo un utente malintenzionato non può MitM lo streaming SSL (che è facile quando controlla il dispositivo mobile ricorda) e vede il segreto in chiaro.

In ogni caso, prova a trovare un meccanismo di cifratura delle chiavi e un protocollo di autenticazione collaudati. Non eseguire il rollover.

    
risposta data 19.09.2013 - 18:34
fonte
14

Per lo più non puoi controllare che questa sia la "tua app": reverse engineering funziona, quindi chiunque abbia accesso alla tua app (ad esempio, può scaricarlo sul suo telefono) può coglierne le interiora ed emularlo con il suo PC. @Lynks ti dà alcuni suggerimenti su come questo reverse engineering può essere reso più frustrante, ma non ingannare te stesso: se l'aggressore è sufficientemente motivato, questi meccanismi lo rallenteranno al massimo un paio di giorni.

Quando non c'è una buona risposta per una domanda, può essere utile spostare il terreno in modo che la domanda cambi. Qui, il problema principale nel cercare di assicurarsi che "la tua app" sia ciò che viene eseguito sul lato client è che esiste una cosa come "la tua app": se qualcuno apre il contenuto di quell'app, impara tutto ciò che è per conoscere tutte le istanze di quell'app ovunque.

Quindi ecco un tentativo di soluzione al tuo problema. Tagga ogni istanza di app con un valore distinto. "Tagging" qui significa che quando l'utente scarica l'app, alcuni token sono incorporati nell'app e viene creato un nuovo valore di token per ogni download. In modo che ogni utente abbia la propria app con token. L'idea è che il token dovrà essere presentato al tuo server per la creazione dell'account, e se il tuo server vede troppe richieste con lo stesso token, allora può automaticamente rifiutarle, mettendo al bando quel token specifico.

Quindi, per continuare a creare automaticamente molti account, l'utente malintenzionato dovrebbe anche automatizzare il download di nuove istanze di app (ciascuna con il proprio valore di token) e il recupero del valore di token dall'app scaricata. Supponendo che il tuo server si trovi all'altra estremità del download dell'app, puoi anche rilevare tale download di massa e bloccarlo da lì.

Affinché questo schema funzioni, è necessario essere in grado di creare valori di token sul server di download dell'app, su richiesta (potrebbe essere difficile configurarlo con il sistema di installazione delle app sugli smartphone esistenti), e in modo tale che l'account il server di creazione può decidere se un valore di token è autentico o meno. HMAC è lo strumento crittografico giusto per questo.

Tieni presente che questo tipo di soluzione non è assolutamente perfetta. Questi sono giochi e trucchi per "alzare la barra" per l'attaccante: se progettate e installate un sistema come quello che descrivo, allora un attaccante di successo dovrà automatizzare il download dell'app da molti indirizzi IP distinti, per tenere sotto controllo della tua euristica per rilevare queste cose; quindi automatizza anche il reverse-engineering per recuperare i valori dei token (usa le tecniche spiegate da @Lynks per quello); quindi inoltra i valori ai suoi bot che creano account. Tutto ciò è ancora teoricamente fattibile: dopotutto, utenti umani possono scaricare l'app e creare account, e non c'è modo di fare davvero la differenza, dall'esterno, tra un utente umano medio, un scimpanzé e un bot.

Ma se riesci a rendere l'attacco sufficientemente complesso che l'attaccante ritenga che "non valga la pena", allora vinci.

    
risposta data 19.09.2013 - 23:30
fonte
3

If I was writing a website, I would use Captcha to stop my database from being filled up with bogus accounts via script.

Quindi includilo nell'API. Quando un utente vuole creare un account:

  1. Il client richiede un CAPTCHA.
  2. Il server genera un CAPTCHA, lo memorizza e ne invia una copia al client.
  3. Il client presenta il modulo di creazione dell'account, insieme al CAPTCHA.
  4. L'utente compila il modulo e risponde al CAPTCHA.
  5. Il client richiede che venga creato il nuovo account e invia la risposta CAPTCHA con quella richiesta.

    • Se la risposta CAPTCHA è errata, il server elimina la sua copia del CAPTCHA (quindi il client non può riprovare) e risponde con un errore.

Potresti usare anche qualcosa come HashCash per rendere più difficile per qualcuno montare un attacco a forza bruta, basta fare sicuro che HashCash può essere generato più velocemente di quanto un utente possa ragionevolmente completare il modulo.

    
risposta data 20.09.2013 - 00:17
fonte
0

Ciò di cui hai bisogno è un'autenticazione dell'applicazione simile. È lo stesso concetto dell'autenticazione che fai per le chiamate API con siti come Twitter, Facebook e Foursquare. Non permettono a nessuno solo di interrogare la loro API. Invece, generano una chiave API e un segreto API per la tua app. Se la tua applicazione presenta quelle chiavi al server, puoi utilizzare le loro API.

    
risposta data 18.09.2013 - 07:48
fonte
-1

"Avere gli utenti autenticati invece di autenticare app installate" è più affidabile .
Genererò nome utente / pass nel momento in cui scaricano l'app. E chiedi al tema di inserire già il nome utente / pass dopo averlo installato. E salvalo per le prossime chiamate al server.
Quindi gli utenti devono inserire username / pass per la prima volta che installano l'app.
Al fine di eliminare i robot, ho anche ottenuto un captcha giusto prima di generare nome utente / passare e scaricare l'app.

    
risposta data 05.10.2017 - 09:14
fonte

Leggi altre domande sui tag