Should web applications using websockets (...) include nonces verified by the server on each transmission to prevent CSRF?
TL; DR: Questo è auspicabile, sebbene non necessariamente su ciascuna trasnissione (una volta per connessione dovrebbe essere sufficiente) e non per prevenire CSRF, ma XSS. Questa è più una salvaguardia che una stretta necessità. Dettagli sotto.
Per sapere se i WebSockets sono vulnerabili a CSRF dobbiamo prima capire le condizioni che consentono tali attacchi avere luogo:
- L'utente è autenticato su un dominio, solitamente tramite un cookie di sessione;
- Esistono uno o più tipi di richieste HTTP che, se eseguite da un utente autenticato, avranno una sorta di effetto collaterale;
- A causa di eccezioni alla stessa politica di origine , un sito che in genere non dovrebbe essere permesso di fare una determinata richiesta è in grado di farlo, e l'agente utente include i cookie di autenticazione / autenticazione in quella richiesta.
Ad esempio, quando il sito A include un tag img
con src
che punta al dominio B, l'agente utente onora la richiesta, passando lungo qualsiasi cookie impostato per il dominio B. Che uso di un token CSRF segreto realizza che parte dei dati di autenticazione è inclusa nell'URL stesso , quindi un utente malintenzionato che non conosce il token non può falsificare un URL che verrà accettato dal server (poiché questa parte dell'autenticazione fallirà).
AFAIK WebSockets può aprire connessioni a qualsiasi server e port (disclaimer: il riferimento utilizzato nel post collegato potrebbe essere obsoleto ). Possono avere i loro cookie (anche se non sono gli stessi usati dalle pagine HTTP - poiché lo schema è diverso) e - se la mia interpretazione di RFC6455 è corretto - questi cookie saranno inviati insieme alla richiesta di connessione indipendentemente da quale sito ha avviato la richiesta (sebbene il server possa rifiutare richieste provenienti da un'origine diversa ). Se questi cookie forniscono tutti l'autenticazione richiesta per onorare la richiesta, il server rispetterà la richiesta.
Quindi, per determinare se un attacco CSRF basato su WebSocket può essere fatto o meno, queste domande devono essere considerate (anche se temo di non poter fornire una risposta definitiva su di esse):
- Il tuo server è configurato correttamente per accettare solo richieste provenienti da origini fidate? L'origine può essere falsificata (in questo contesto)?
- Una connessione WebSocket può avvenire al di fuori del contesto di una chiamata JavaScript, ad esempio creando un URL con
ws
o wss
come schema e utilizzandolo come src
o href
di un elemento di markup? Avrebbe qualche effetto collaterale indesiderabile? So che è sciocco, ma dal momento che non ho una risposta a questa domanda, devo comunque sollevare la possibilità ...
- Come vengono eseguiti l'autenticazione e l'autorizzazione? Secondo questo post (che evidenzia anche altri potenziali problemi, non direttamente correlato a CSRF) non c'è nulla di built-in, quindi è necessario implementarlo da soli. A seconda di come lo si fa e di quali presupposti si fanno sul comportamento dell'utente, questo potrebbe aprirti agli attacchi XSS (che, pur essendo diversi da CSRF in senso stretto, sono correlati nel senso che il browser disattivate la sua autorizzazione per impostare i cookie di autenticazione in contesti diversi da quelli che vi aspettavate - in modo giusto o sbagliato)