
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 सामग्री का नियंत्रण देते हैं (उदा. आप एक होस्टिंग प्रदाता example.com हैं जो उपयोगकर्ताओं को alice.example.com पर अपनी वेबसाइट होस्ट करने की अनुमति देता है)।
इस रिपॉजिटरी में PoC बाद वाले मामले में ऐसे हमले का प्रदर्शन करता है, जहां हमलावर के पास वेबसाइट के मुख्य डोमेन के उपडोमेन पर सामग्री का नियंत्रण है।
Go और Caddy की आवश्यकता है। सर्वर मैन्युअल रूप से चलाएँ:
$ go run attacker.go & go run target.go & caddy run
या प्रोसेस कम्पोज़ के माध्यम से:
$ process-compose
https://attacker.target.localhost पर जाएँ।
https://target.localhost पर फ़ॉर्म सबमिट करने के लिए बटन पर क्लिक करें और देखें कि अनुरोध सफलतापूर्वक पूरा होता है।
इस मुद्दे का समाधान nosurf 1.2.0 में जारी किया गया था।
मुद्दे की रिपोर्ट करने के लिए Patrick O'Doherty को धन्यवाद।