
Доказательство концепции и анализ CVE-2025-46721, CSRF-уязвимости в библиотеке Go nosurf, вызванной неработающими проверками same-origin, с рабочей демонстрацией эксплойта.
Все версии nosurf до 1.2.0 не применяли проверки одинакового происхождения для входящих запросов.
Это произошло из-за того, что они полагались на поле .URL.Scheme типа net/http.Request из стандартной библиотеки Go,
чтобы сначала убедиться, что запрос обслуживается через HTTPS, и только затем применять проверки одинакового происхождения.
Упомянутое поле Scheme не заполняется HTTP-сервером Go для входящих запросов:
// 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.
поскольку в общем случае Go не может определить, выполняется ли запрос через TLS (из-за возможного наличия обратного прокси, завершающего TLS, и т.д.).
Это может позволить злоумышленникам отправлять не-безопасные междоменные запросы на ваш веб-сайт.
В дополнение к реализации проверок одинакового происхождения, nosurf также защищает от CSRF с помощью шаблона двойной отправки cookie.
Это означает, что для успешного выполнения изменяющего междоменного запроса
злоумышленнику также необходим контроль над содержимым страницы на вашем веб-сайте
или на поддомене вашего веб-сайта.
Это может быть достигнуто с помощью XSS, или если вы намеренно предоставляете контроль над HTML-содержимым пользователям вашего веб-сайта
(например, вы являетесь хостинг-провайдером example.com, который позволяет пользователям размещать свои веб-сайты на alice.example.com).
PoC в этом репозитории демонстрирует такую атаку в последнем случае, когда злоумышленник контролирует содержимое на поддомене основного домена веб-сайта.
Требуются Go и Caddy. Запустите серверы вручную:
$ go run attacker.go & go run target.go & caddy run
или через Process Compose:
$ process-compose
Посетите https://attacker.target.localhost.
Нажмите кнопку, чтобы отправить форму на https://target.localhost, и убедитесь, что запрос выполняется успешно.
Исправление этой проблемы было выпущено в nosurf 1.2.0.
Спасибо Патрику О'Доэрти за сообщение об этой проблеме.