Qual è il modo più sicuro per identificare un dispositivo senza azione umana, per favore?

1

Desidero consentire agli utenti del nostro sito Web di limitare l'accesso al proprio account da dispositivi che hanno esplicitamente autorizzato. Questo verrà verificato alla connessione e ogni volta che cambia l'indirizzo IP.

Per fare ciò, devo identificare il dispositivo e devo evitare che un altro dispositivo possa passare per un dispositivo autorizzato.

Potrei, ad esempio, salvare un UUID in un cookie sicuro (flag: httpOnly + secure) che il server (in HTTPS + HSTS) potrebbe controllare. Tuttavia, tramite un proxy MITM, l'utente malintenzionato potrebbe potenzialmente scoprire il token e utilizzarlo tutte le volte che lo desidera su più computer e anche quando l'utente non è più connesso al proxy infetto.

Penso che sia possibile ridurre i rischi accoppiando questa tecnica con una chiamata API push web. Ciò richiede ovviamente un browser che lo supporti (~ 80%) e l'utente accetta di ricevere le nostre notifiche. L'idea sarebbe che il server che riceve l'UUID del cookie, invia una notifica push contenente un token casuale al dispositivo, quindi il dispositivo inoltra il token al server per dimostrare che si tratta effettivamente del dispositivo autorizzato.

Questo metodo non risolve gli attacchi proxy MITM, ma una volta che la persona non è più dietro a questa rete infetta, l'autore dell'attacco non può più falsificare l'identificazione del dispositivo.

Le notifiche push sono crittografate, ma posso anche crittografare [EDIT: offuscare] il token casuale inviato mediante una semplice operazione XOR con il valore UUID del cookie come chiave.

Hai un modo più sicuro di identificare un dispositivo senza richiedere un'azione umana, per favore?

[EDIT: Preciso, l'abbonamento alla notifica push viene eseguito una sola volta e potrebbe essere richiesto che venga eseguito da una rete protetta, come a casa, per impedire il proxy MITM durante la sottoscrizione.]

    
posta lakano 06.10.2017 - 18:03
fonte

2 risposte

0

Rispondo a me stesso dopo alcune ricerche.

Il certificato TLS del client non può essere utilizzato mentre i browser non consentono di importare facilmente il certificato. Attualmente, la maggior parte dei browser richiede complesse azioni umane: scarica il file cert, vai nelle impostazioni, avanzato, gestione certificat, importa, seleziona il file da importare. È un'esperienza molto brutta per l'utente, non possiamo chiedere all'utente di farlo dopo esserci registrati sul nostro sito.

Ma possiamo avere qualcosa di simile, con Web Crypto API (tutte le funzioni non sono completamente supportate da tutti i browser, che richiedono polyfill). Generiamo chiavi asimmetriche pubbliche / private quando l'utente richiede l'autorizzazione del dispositivo.

Quindi, sul lato server, possiamo salvare la chiave pubblica del dispositivo e l'hash associato (SHA256) della chiave pubblica come un «ID dispositivo». Ogni volta che l'utente effettua una richiesta all'API, aggiungiamo nell'intestazione il deviceID e una prova con una firma, l'hash della richiesta firmato dalla chiave privata del dispositivo (aggiungeremo un nonce per impedire l'attacco di replay).

Nel lato client, le chiavi vengono salvate crittografate dalla password dell'utente all'interno di IndexedDB. Ovviamente, se l'utente cancella i dati indexedDB del sito, l'autorizzazione per questo dispositivo viene persa.

    
risposta data 11.10.2017 - 13:32
fonte
1

Non sono sicuro che il tuo suggerimento di notifica push possa davvero aiutare. Affinché ciò funzioni, il cliente deve ancora "iscriversi" alle notifiche push. Cosa impedirebbe a un MITM di intercettare la richiesta del client finale di iscriversi alle notifiche push e di iscriversi invece?

Internet è intrinsecamente costruito attorno al concetto di client "anonimi" che inizializzano le conversazioni con i server. È possibile che un cliente identifichi un server in modo univoco tramite la convalida del certificato SSL, ma nulla su Internet è realmente progettato per fare il contrario.

Ciò che in realtà si riduce è che se fare ciò che si voleva fare fosse semplice e infallibile, allora ogni server lo avrebbe fatto e le credenziali rubate sarebbero state un ricordo del passato. Questo ovviamente non è il caso però.

    
risposta data 06.10.2017 - 18:27
fonte

Leggi altre domande sui tag