
CVE-2025-46721에 대한 개념 증명 및 분석: nosurf Go 라이브러리의 동일 출처 검사가 제대로 작동하지 않아 발생하는 CSRF 취약점이며, 작동하는 익스플로잇 데모를 포함합니다.
nosurf 1.2.0 이전의 모든 버전은 들어오는 요청에 대해 동일 출처 검사를 적용하지 못했습니다. 이는 Go 표준 라이브러리의 net/http.Request 타입에 있는 .URL.Scheme 필드를 사용하여 요청이 HTTPS를 통해 제공되는지 먼저 확인한 후에만 동일 출처 검사를 적용했기 때문입니다. 앞서 언급한 Scheme 필드는 들어오는 요청에 대해 Go HTTP 서버가 채우지 않습니다:
// 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로부터 추가로 보호합니다. 즉, 변형 교차 출처 요청을 성공적으로 수행하려면 공격자는 귀하의 웹사이트 또는 귀하 웹사이트의 하위 도메인에 있는 페이지의 콘텐츠를 제어해야 합니다. 이는 XSS를 통해 달성되거나, 귀하가 웹사이트 사용자에게 HTML 콘텐츠 제어권을 의도적으로 부여하는 경우 (예: 사용자가 alice.example.com에서 웹사이트를 호스팅할 수 있도록 허용하는 호스팅 제공업체 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에서 릴리스되었습니다.
문제를 보고해 주신 Patrick O'Doherty에게 감사드립니다.