Quali misure devono essere prese per autenticarsi in modo sicuro dal traffico Web a una connessione WebSocket?

3

Ovviamente TLS è un must per qualsiasi autenticazione sicura. Si prega di trasformare le impostazioni di paranoia fino a 11 per questo.

Sfondo : (Nel caso in cui le persone non conoscano il protocollo WebSocket (WS) e le sue idiosincrasie) La connessione WebSocket TLS (WSS) è una connessione diversa dalla connessione TLS HTTP. Ciò significa che non è possibile autenticare automaticamente l'altro. A causa dei proxy, in particolare di uno malintenzionato che esegue un attacco MitM, semplicemente lo stesso indirizzo IP remoto (o anche lo stesso ID di sessione) non garantisce che le due connessioni provengano dallo stesso browser.

WS è una connessione TCP persistente con un'API molto limitata sul lato client che non consente l'ispezione dei dettagli TLS per le connessioni WSS. È progettato per funzionare bene con firewall e proxy (non dannosi) che limitano il traffico solo al traffico HTTP ed è desiderabile a causa della sua ubiquità nei browser Web moderni.

In PHP, WS viene (in genere) implementato utilizzando uno script CLI (command line), che esegue il proprio server accettando e gestendo le connessioni socket direttamente, anziché essere mediato attraverso un server HTTP. (Se è coinvolto un server HTTP, è solo per inoltrare il traffico dopo l'aggiornamento riuscito e diventa un proxy trasparente per tutti gli scopi dopo l'handshake.) Quindi, i tipici superglobali di PHP non hanno significato nella CLI di PHP.

Il passaggio dei cookie è possibile durante l'handshake WS, incluso un ID di sessione. Nella CLI di PHP è possibile (ma sgraziato) accedere ai dati della sessione corrente, anche dopo un cambiamento di stato innescato dal lato HTTP delle cose, se si conosce l'ID di sessione. Tuttavia, poiché i cookie vengono passati solo durante l'handshake WS, il server WS non riceve notifica delle modifiche ai cookie, come l'ID di sessione.

AJAX rimane autenticato tramite la connessione HTTPS, ovviamente, e sono sicuro che c'è un modo per sfruttare le richieste AJAX per autenticare le connessioni WSS usando lo stesso browser.

Esempio di dirottamento della sessione : Alice accede a bob.com tramite i normali mezzi HTTPS, ma ha un proxy malevolo tra di loro, di proprietà di Mallory, che esegue un attacco di intercettazione MitM che ha compromesso la sessione ID.

Mallory quindi usa l'ID di sessione nel proprio cookie di sessione per connettersi al server WSS, che è dove mi imbatto nei miei problemi, perché non so chi distinguere tra il browser aperto e completamente autenticato di Alice e Mallory's browser completamente diverso su un computer completamente diverso.

Quindi, sapendo che l'ID di sessione è potenzialmente insicuro, è un obiettivo primario ed è immutabile una volta avviata la connessione WS, come posso autenticare che una determinata connessione WSS sia in esecuzione nella stessa istanza del browser sullo stesso computer di una determinata connessione HTTPS?

Modifica : una volta avviata la connessione HTTPS, Mallory non tenta di interferire per evitare di essere rilevato. Quindi, una volta stabilito TLS, la connessione HTTPS è protetta da Mallory da questo punto in poi, ma Mallory avrebbe ancora l'ID di sessione.

Giustificazione per questo requisito limite : Sto scrivendo il software WebSocket open source, quindi non sono in grado di proteggere l'ID della sessione attraverso mezzi come garantire che il cookie di sessione abbia il flag di sicurezza impostato, che l'ID di sessione viene rigenerato, ecc., ma può imporre che l'implementatore includa uno script client che aiuti a garantire l'autenticazione su entrambi i mezzi.

    
posta Ghedipunk 30.07.2015 - 19:58
fonte

2 risposte

2

The WebSocket TLS (WSS) connection is a different connection from the HTTP TLS connection.

Viene creata una connessione WebSocket che invia una richiesta HTTP contenente il desiderio di aggiornare la connessione a WebSocket e ricevendo una risposta HTTP che concede questo desiderio. Da quel momento in poi il protocollo WebSocket è parlato all'interno della connessione HTTP aggiornata.

Ciò significa che le proprietà di sicurezza comuni di HTTP sono ancora utilizzabili con WS, ovvero cose come l'autenticazione di base o la verifica dell'identità del peer con un cookie di sessione dato da un accesso precedente.

Significa anche che le proprietà di sicurezza di TLS possono essere utilizzate come con le normali connessioni HTTPS. Come HTTPS, che è parlato in HTTP all'interno di una connessione TLS, WSS è WS all'interno di una connessione TLS. Ciò significa anche che la prevenzione degli attacchi man-in-the-middle mediante la convalida dei certificati viene eseguita esattamente allo stesso modo di HTTPS, poiché ogni connessione WSS viene avviata come connessione HTTPS.

Se ti capisco bene, ritieni che Mallory gestisca un attacco man-in-the-middle contro la connessione almeno una volta. Se Mallory è in grado di farlo, deve essere in grado di man-in-the-middle della connessione TLS e in questo caso il game over è comunque, non importa se i WebSocket sono usati o meno. Se Mallory sta invece acquisendo le informazioni da una connessione non TLS (ad esempio HTTP non HTTPS) di un bug di progettazione nell'applicazione se si utilizzano i dati di autorizzazione non protetti per l'autorizzazione all'interno delle connessioni protette, non importa se HTTPS o WSS. E nessun TLS o altri metodi possono rendere magicamente sicure le informazioni di autorizzazione compromesse.

    
risposta data 30.07.2015 - 21:19
fonte
1

Credo che la tua premessa sia difettosa. Alice non accede a bob.com tramite normali mezzi HTTPS, perché Alice vede l'errore del certificato non valido e decide in modo intelligente di non inserire le proprie credenziali. Se Alice sceglie di ignorare l'avviso e procedere comunque, ora ha lo stesso problema che avrebbe su qualsiasi sito finanziario o di sicurezza. Le sue credenziali potrebbero essere state compromesse insieme a tutti i dati a cui ha accesso.

Se un attacco MITM sta falsificando la connessione del browser per cominciare, non c'è modo per il tuo server di distinguere. Lo spoofer può far sembrare la richiesta come vuole.

Per assicurarti che l'ID di sessione sia sicuro, il meglio che puoi fare da parte tua è innanzitutto assicurarti che la connessione sia crittografata, quindi permetti il login, quindi dopo aver autenticato l'utente genera l'ID di sessione. Ma dovrai comunque sperare che un utente che ha presentato un errore di certificato a causa di un attacco MitM non proceda al login.

    
risposta data 30.07.2015 - 20:36
fonte

Leggi altre domande sui tag