
Prova di concetto e analisi di CVE-2025-46721, una vulnerabilità CSRF nella libreria Go nosurf a causa di controlli same-origin non funzionanti, con una dimostrazione di exploit funzionante.
Tutte le versioni di nosurf precedenti alla 1.2.0 non applicavano i controlli same-origin per le richieste in entrata.
Ciò è accaduto a causa della dipendenza dal campo .URL.Scheme del tipo net/http.Request della libreria standard di Go
per assicurarsi prima che la richiesta fosse servita su HTTPS, e solo successivamente applicare i controlli same-origin.
Il suddetto campo Scheme non viene compilato dal server HTTP di Go per le richieste in entrata:
// For server requests, the URL is parsed from the URI // supplied on the Request-Line as stored in RequestURI. For // most requests, fields other than Path and RawQuery will be // empty.
poiché nel caso generale Go non può determinare se la richiesta sta avvenendo su TLS (a causa della possibile presenza di un reverse proxy che termina TLS, ecc.).
Ciò potrebbe consentire agli aggressori di inviare richieste cross-origin non sicure al tuo sito web.
Oltre a implementare i controlli same-origin, nosurf protegge inoltre dal CSRF utilizzando un pattern di double-submit cookie.
Ciò significa che, per effettuare con successo una richiesta cross-origin mutante,
l'aggressore deve anche avere il controllo del contenuto di una pagina sul tuo sito web,
o su un sottodominio del tuo sito web.
Ciò può essere ottenuto tramite XSS, o se dai intenzionalmente il controllo del contenuto HTML agli utenti del tuo sito web
(ad esempio sei un provider di hosting example.com che consente agli utenti di ospitare i loro siti web su alice.example.com).
Il PoC in questo repository dimostra tale attacco nell'ultimo caso, dove l'aggressore ha il controllo del contenuto su un sottodominio del dominio principale del sito web.
Richiede Go e Caddy. Esegui i server manualmente:
$ go run attacker.go & go run target.go & caddy run
oppure tramite Process Compose:
$ process-compose
Visita https://attacker.target.localhost.
Fai clic sul pulsante per inviare il modulo a https://target.localhost e osserva che la richiesta viene completata con successo.
Una correzione per questo problema è stata rilasciata in nosurf 1.2.0.
Grazie a Patrick O'Doherty per aver segnalato il problema.