FixVibe
Covered by FixVibehigh

Protezione CSRF: difesa dai cambiamenti di stato non autorizzati

Il Cross-Site Request Forgery (CSRF) rimane una minaccia significativa per le applicazioni web. Questa ricerca esplora il modo in cui framework moderni come Django implementano la protezione e il modo in cui attributi a livello di browser come SameSite forniscono una difesa approfondita contro le richieste non autorizzate.

CWE-352

Impatto

Cross-Site Request Forgery (CSRF) consente a un utente malintenzionato di ingannare il browser di una vittima inducendolo a eseguire azioni indesiderate su un sito Web diverso in cui la vittima è attualmente autenticata. Poiché i browser includono automaticamente credenziali ambientali come i cookie nelle richieste, un utente malintenzionato può falsificare operazioni di modifica dello stato, come la modifica delle password, l'eliminazione di dati o l'avvio di transazioni, all'insaputa dell'utente.

Causa principale

La causa fondamentale del CSRF è il comportamento predefinito del browser web di inviare cookie associati a un dominio ogni volta che viene effettuata una richiesta a quel dominio, indipendentemente dall'origine della richiesta [S1]. Senza una convalida specifica che una richiesta sia stata attivata intenzionalmente dall'interfaccia utente dell'applicazione, il server non è in grado di distinguere tra un'azione legittima dell'utente e una contraffatta.

Meccanismi di protezione CSRF di Django

Django fornisce un sistema di difesa integrato per mitigare questi rischi attraverso l'integrazione del middleware e dei modelli [S2].

Attivazione del middleware

django.middleware.csrf.CsrfViewMiddleware è responsabile della protezione CSRF ed è in genere abilitato per impostazione predefinita [S2]. Deve essere posizionato prima di qualsiasi middleware di visualizzazione che presuppone che gli attacchi CSRF siano già stati gestiti [S2].

Implementazione del modello

Per eventuali moduli POST interni, gli sviluppatori devono includere il tag {% csrf_token %} all'interno dell'elemento <form> [S2]. Ciò garantisce che nella richiesta sia incluso un token univoco e segreto, che il server poi convalida rispetto alla sessione dell'utente.

Rischi di perdita di token

Un dettaglio di implementazione fondamentale è che {% csrf_token %} non dovrebbe mai essere incluso nei moduli destinati a URL esterni [S2]. Ciò potrebbe far trapelare il token CSRF segreto a terze parti, compromettendo potenzialmente la sicurezza della sessione dell'utente [S2].

I browser moderni hanno introdotto l'attributo SameSite per l'intestazione Set-Cookie per fornire un livello di difesa approfondita [S1].

  • Rigido: il cookie viene inviato solo in un contesto di prima parte, ovvero il sito nella barra dell'URL corrisponde al dominio del cookie [S1].
  • Lax: il cookie non viene inviato su richieste secondarie tra siti (come immagini o frame) ma viene inviato quando un utente naviga al sito di origine, ad esempio seguendo un collegamento standard [S1].

Come lo esegue il test FixVibe

FixVibe ora include la protezione CSRF come controllo attivo recintato. Dopo la verifica del dominio, active.csrf-protection ispeziona i moduli di modifica dello stato rilevati, controlla gli input a forma di token CSRF e i segnali dei cookie SameSite, quindi tenta un invio di origini contraffatte a basso impatto e segnala solo quando il server lo accetta. I controlli dei cookie segnalano anche attributi deboli di SameSite che riducono la difesa CSRF in profondità.