
Proof-of-concept und Analyse von CVE-2025-46721, einer CSRF-Schwachstelle in der nosurf-Go-Bibliothek aufgrund nicht funktionierender Same-Origin-Prüfungen, mit einer funktionierenden Exploit-Demonstration.
Alle Versionen von nosurf vor 1.2.0 haben es versäumt, Same-Origin-Prüfungen für eingehende Anfragen durchzuführen.
Dies geschah, weil man sich auf das Feld .URL.Scheme des Typs net/http.Request der Go-Standardbibliothek verließ, um zunächst sicherzustellen, dass die Anfrage über HTTPS bedient wird, und erst dann Same-Origin-Prüfungen durchzuführen.
Das besagte Feld Scheme wird vom Go-HTTP-Server bei eingehenden Anfragen nicht ausgefüllt:
// Bei Server-Anfragen wird die URL aus der URI geparst, // die in der Request-Line als RequestURI gespeichert ist. Bei // den meisten Anfragen sind Felder außer Path und RawQuery leer.
da Go im Allgemeinen nicht feststellen kann, ob die Anfrage über TLS erfolgt (aufgrund eines möglichen TLS-terminierenden Reverse-Proxy usw.).
Dies könnte Angreifern ermöglichen, nicht-sichere Cross-Origin-Anfragen an Ihre Website zu senden.
Zusätzlich zur Implementierung von Same-Origin-Prüfungen schützt nosurf auch vor CSRF durch ein Double-Submit-Cookie-Muster.
Das bedeutet, dass der Angreifer für eine erfolgreiche mutierende Cross-Origin-Anfrage auch die Kontrolle über den Inhalt einer Seite auf Ihrer Website oder auf einer Subdomain Ihrer Website benötigt.
Dies kann durch XSS erreicht werden, oder wenn Sie Benutzern absichtlich die Kontrolle über HTML-Inhalte auf Ihrer Website geben (z. B. wenn Sie ein Hosting-Anbieter example.com sind, der Benutzern erlaubt, ihre Websites unter alice.example.com zu hosten).
Der PoC in diesem Repository demonstriert einen solchen Angriff im letzteren Fall, bei dem der Angreifer die Kontrolle über den Inhalt auf einer Subdomain der Hauptdomain der Website hat.
Erfordert Go und Caddy. Server manuell starten:
$ go run attacker.go & go run target.go & caddy run
oder via Process Compose:
$ process-compose
Besuchen Sie https://attacker.target.localhost.
Klicken Sie auf den Button, um das Formular an https://target.localhost zu senden, und beobachten Sie, dass die Anfrage erfolgreich abgeschlossen wird.
Ein Fix für dieses Problem wurde in nosurf 1.2.0 veröffentlicht.
Dank an Patrick O'Doherty für die Meldung des Problems.