In genere posso parlare con CSRF, ma non con il framework Spring (che non ho usato). Dal momento che non riesco a verificare le tue affermazioni con Spring stessa, prenderò in considerazione le tue affermazioni al valore nominale. Vale a dire:
- Puoi recuperare un token CSRF effettuando una chiamata valida utilizzando qualsiasi sessione di tua scelta
- Se imponi a qualsiasi altro utente di effettuare una richiesta con il tuo token CSRF, Spring lo accetta come token valido
Supponendo che le tue scoperte siano accurate (ancora una volta non ti sto dubitando, semplicemente non posso verificarlo da solo), questi sono i miei pensieri immediati:
- I token CSRF non dovrebbero essere autorizzati ad attraversare sessioni come questa.
- Considererei certamente questa vulnerabilità di sicurezza.
- Ulteriori dettagli su come Spring convalida i token CSRF sono necessari per decidere se esiste o meno un vettore di attacco realistico qui.
In dettaglio, i token CSRF non dovrebbero assolutamente essere in grado di attraversare le sessioni. Ogni token CSRF deve essere associato alla sessione che lo ha generato e non deve essere un token valido per qualsiasi altra sessione. Come fai notare, consentire ai token di attraversare le sessioni consente a un attaccante di generare token validi prima della mano. Questo può sicuramente essere un problema. Tuttavia, ci sono alcune circostanze che possono mitigare la potenziale minaccia qui:
Molto più della semplice verifica del token
I token sono solo un modo per proteggersi dagli attacchi CSRF. Personalmente, trovo che siano il modo più diretto e affidabile. Tuttavia, non sono l'unico modo. Un'altra opzione è controllare le intestazioni REFERRER e ORIGIN . Se Spring controlla anche le intestazioni REFERRER e ORIGIN, allora è improbabile che questa debolezza nel loro token CSRF sia sfruttabile. Il test che hai effettuato (modificando manualmente il token CSRF tramite gli strumenti del browser) ti lascerà comunque le intestazioni REFERRER e ORIGIN corrette, il che significa che passerai entrambi i controlli CSRF. Tuttavia, non sarebbe possibile per un attaccante riprodurlo. Funziona per te perché eri sulla pagina dell'applicazione vera e hai modificato direttamente la pagina dell'applicazione. Un utente malintenzionato eseguirà un attacco CSRF da un luogo completamente diverso e non potrà forzare le intestazioni REFERRER e ORIGIN. Quindi se Spring è anche controlla le intestazioni REFERRER e ORIGIN, allora stai bene.
La primavera fa entrambe le cose? Non lo so. Perché la primavera farebbe entrambe le cose? Non ne sono sicuro, anche se sarebbe in linea con il concetto di "Difesa in profondità", quindi non sarebbe pazzesco che eseguisse entrambi i test. Se sta facendo entrambe le cose, ovviamente anche una grande debolezza nel token CSRF non ha importanza. Se tuttavia fa entrambe le cose e ignora l'una o l'altra in certe circostanze, allora potrebbe esserci un vettore di attacco se puoi farlo ignorare i controlli dell'intestazione e anche spoofare il token CSRF.
Scadenza del token CSRF
Potrebbe anche esserci una scadenza del token che renderà difficile trasformarlo in un vettore di attacco sfruttabile. In effetti, ha quasi certamente una scadenza simbolica. Come attaccante puoi generare un token CSRF valido, ma se ha una scadenza breve, devi farlo rapidamente davanti a un bersaglio. Supponiamo che tu abbia creato un vettore di attacco CSRF che ha effettivamente elevato il tuo account utente all'amministratore quando un amministratore visualizza una pagina malevola che hai generato. Questo ti farà bene solo se puoi ingannare un amministratore nella visualizzazione della tua pagina di attacco prima che il tuo token scada. A seconda del metodo di consegna e della durata della scadenza del token, questo può essere molto difficile.
Riassumendo: è questa la norma per CSRF? No, in effetti è potenzialmente pericoloso. È sfruttabile? È più difficile rispondere. Come sempre, il diavolo è nei dettagli. Vale la pena scavare di più? Direi di sì.