
CVE-2025-22381 की खोज: Aggie ओपन-सोर्स प्रोजेक्ट में होस्ट हेडर इंजेक्शन
CVE-2025-22381: एगी में होस्ट हेडर इंजेक्शन
एगी ओपन-सोर्स प्रोजेक्ट में खोजी गई होस्ट हेडर इंजेक्शन भेद्यता CVE-2025-22381 का विस्तृत विश्लेषण और प्रूफ-ऑफ-कॉन्सेप्ट।
भेद्यता अवलोकन+
CVE ID: CVE-2025-22381
प्रकाशित: अक्टूबर 2025 (MITRE असाइनमेंट)
सार्वजनिक रूप से खुलासा: फरवरी 2026
रिपोर्टर: अनास अब्देर्रहमान बेनबरेक
खोज की तारीख: 17 सितंबर 2025
प्रभावित प्रोजेक्ट: TID-Lab/aggie
प्रभावित संस्करण: सभी संस्करण (2.6.1 और इससे पहले के संस्करण शामिल; फरवरी 2026 तक कोई सुधार लागू नहीं किया गया)
गंभीरता: मध्यम से उच्च (अनुमानित CVSS ~7.1–7.5)
प्रभाव: फ़िशिंग हमलों को सक्षम करता है जिससे पासवर्ड रीसेट टोकन चोरी हो सकती है और संभावित खाता अधिग्रहण हो सकता है।
पृष्ठभूमि
मैं GitHub पर ओपन-सोर्स node.js प्रोजेक्ट्स की समीक्षा करने में काफी समय बिताता हूं, खासकर वे जो प्रमाणीकरण प्रवाह को संभालते हैं। सितंबर 2025 में, जब मैं एगी रिपॉजिटरी देख रहा था, तो मैंने पासवर्ड रीसेट लॉजिक में कुछ ऐसा देखा जो तुरंत सामने आया। जो नियमित कोड पढ़ने के रूप में शुरू हुआ, वह CVE-2025-22381 बन गया — एक क्लासिक होस्ट हेडर इंजेक्शन भेद्यता जो हमलावर को पासवर्ड रीसेट ईमेल में डोमेन को नियंत्रित करने की अनुमति देती है।
मैंने इसे कैसे पाया
मैंने रिपॉजिटरी को क्लोन किया और lib/api/ के अंतर्गत फ़ाइलों को पढ़ना शुरू किया, जो प्रमाणीकरण और ईमेल जनरेशन से संबंधित हैं।
फ़ाइल lib/api/reset-password.js में /reset-password एंडपॉइंट का लॉजिक है। महत्वपूर्ण भाग sendEmail हेल्पर के अंदर है:
function sendEmail(user, req, callback) { var token = encodeToken(user);
mailer.sendFromTemplate({ template: 'forgotPassword', user: user, token: token, host: req.headers.host, // ← कमजोर protocol: req.protocol, acceptLanguage: req.headers['accept-language'] }, callback); }
लाइन host: req.headers.host समस्या है। Express में, req.headers.host सीधे Host HTTP हेडर से आता है, जो पूरी तरह से हमलावर-नियंत्रित होता है। कोई सत्यापन नहीं, कोई श्वेतसूची नहीं, कॉन्फ़िगरेशन से भरोसेमंद डोमेन पर कोई फ़ॉलबैक नहीं।
प्रारंभिक पुष्टि
मैंने README निर्देशों (Ubuntu, nvm, npm install, test SMTP के साथ secrets.json) के अनुसार जल्दी से एक स्थानीय इंस्टेंस सेट किया, सर्वर शुरू किया, और एक पासवर्ड रीसेट ट्रिगर किया। जनरेट किया गया ईमेल लिंक अपेक्षित रूप से localhost:3000 का उपयोग करता था।
फिर मैंने एक हेरफेर किए गए Host हेडर के साथ अनुरोध को फिर से चलाया:
curl -X POST http://localhost:3000/reset-password
-H "Host: evil-phish.example"
-d "email=[email protected]"
(MailHog के माध्यम से कैप्चर किए गए) ईमेल में शामिल था: http://evil-phish.example/reset-password?token=...
सकारात्मक प्रमाण। एप्लिकेशन रीसेट लिंक बनाते समय क्लाइंट-प्रदत्त Host हेडर पर भरोसा करता है।
हमला वास्तव में कैसे काम करता है
हमलावर किसी पीड़ित के ईमेल पते के लिए एक पासवर्ड रीसेट अनुरोध भेजता है, लेकिन Host हेडर को अपने नियंत्रण वाले डोमेन (जैसे evil-phish.example) पर सेट करता है।
एगी एक वैध रीसेट टोकन उत्पन्न करता है (सर्वर-साइड, समय-सीमित, कॉन्फ़िग सीक्रेट के साथ एन्क्रिप्टेड)।
ईमेल वास्तविक डोमेन के बजाय हमलावर के डोमेन के लिंक के साथ भेजा जाता है।
पीड़ित को ईमेल प्राप्त होता है और लिंक पर क्लिक करता है (फ़िशिंग सफलता की स्थिति)।
पीड़ित हमलावर के सर्वर पर उतरता है।
हमलावर का सर्वर यह कर सकता है:
बस एक नकली "रीसेट विफल" पृष्ठ प्रदर्शित करें और टोकन को चुपचाप त्याग दें, या
क्वेरी स्ट्रिंग से टोकन कैप्चर करें (सर्वर-साइड लॉगिंग या JavaScript के माध्यम से), या
अनुरोध को वास्तविक एगी इंस्टेंस पर प्रॉक्सी करें, टोकन कैप्चर करें, और उपयोगकर्ता को वैध रीसेट पृष्ठ पर अग्रेषित करें (ताकि पीड़ित को तुरंत कुछ भी गलत न लगे)।
हमलावर बाद में वास्तविक डोमेन पर पीड़ित का पासवर्ड रीसेट करने के लिए कैप्चर किए गए टोकन का उपयोग करता है।
मुख्य बिंदु: होस्ट हेडर इंजेक्शन अकेले हमलावर को सीधे टोकन का उपयोग करने की अनुमति नहीं देता है। हमलावर को अभी भी पीड़ित के दुर्भावनापूर्ण लिंक पर जाने की आवश्यकता है ताकि टोकन हमलावर के बुनियादी ढांचे तक पहुंचे। यही कारण है कि यह प्रत्यक्ष खाता अधिग्रहण के बजाय फ़िशिंग-सक्षम भेद्यता है (उपयोगकर्ता इंटरैक्शन के बिना)।
तकनीकी गंभीरता और प्रभाव
यह संदर्भ के आधार पर मध्यम से उच्च गंभीरता का मुद्दा है:
AV:N: नेटवर्क से पहुंच योग्य
PR:N: किसी विशेषाधिकार की आवश्यकता नहीं
AC:L: कम जटिलता
UI:R: उपयोगकर्ता इंटरैक्शन की आवश्यकता है
S:C: दायरा बदल सकता है (प्रभाव वैध डोमेन पर पीड़ित के खाते तक फैलता है)
C:L / I:H: पीड़ित के खाते पर गोपनीयता और अखंडता प्रभाव
कई डेटाबेस इसे CVSS ~7.1–7.5 रेंज में सूचीबद्ध करते हैं। मैं व्यक्तिगत रूप से इसे उत्पादन वातावरण में गंभीर मानता हूं जहां एगी का उपयोग संवेदनशील निगरानी (चुनाव, संकट) के लिए किया जाता है, क्योंकि यहां सफल फ़िशिंग पूर्ण खाता अधिग्रहण का कारण बन सकती है।
प्रूफ-ऑफ-कॉन्सेप्ट (विस्तृत और पुनरुत्पादनीय)
पर्यावरण
Ubuntu 18.04/20.04 (अनुशंसित के अनुसार)
Node 12.16 (प्रति .nvmrc)
MailHog: ईमेल कैप्चर के लिए स्थानीय रूप से चल रहा है (docker run -d -p 8025:8025 -p 1025:1025 mailhog/mailhog)
एगी email.transport के साथ कॉन्फ़िगर किया गया जो localhost:1025 की ओर इशारा करता है
चरण-दर-चरण
एगी को क्लोन और प्रारंभ करें:
git clone https://github.com/TID-Lab/aggie.git cd aggie nvm install npm install cp config/secrets.json.example config/secrets.json
npm start
वेब UI या सीधे MongoDB में एक परीक्षण उपयोगकर्ता बनाएं।
दुर्भावनापूर्ण रीसेट ट्रिगर करें:
curl -i -X POST http://localhost:3000/reset-password
-H "Host: evil-phish.example"
-H "Content-Type: application/x-www-form-urlencoded"
-d "email=[email protected]"
MailHog खोलें: भेजे गए ईमेल का निरीक्षण करें। रीसेट लिंक http://evil-phish.example/reset-password?token=... की ओर इशारा करेगा।
खुलासा समयरेखा
17 सितंबर 2025: खोजा गया + स्थानीय PoC
17 सितंबर 2025: पूर्ण विवरण और PoC के साथ [email protected] पर ईमेल किया
17 सितंबर 2025: MITRE को सबमिट किया गया (सेवा अनुरोध 1926730 / MCID15453119)
9 अक्टूबर 2025: MITRE ने CVE-2025-22381 असाइन किया
अक्टूबर–दिसंबर 2025: कोई सार्वजनिक पैच या प्रतिक्रिया नहीं देखी गई
फरवरी 2026: सार्वजनिक खुलासा (यह लेख)
अनुशंसित सुधार
कोड परिवर्तन
lib/api/reset-password.js में कमजोर लाइन को एक भरोसेमंद मान से बदलें:
// lib/api/reset-password.js में, sendEmail() के अंदर const config = require('../../config/secrets').get();
// विकल्प A: कॉन्फ़िग मान पर हार्ड ट्रस्ट (एकल-डोमेन के लिए अनुशंसित) const host = config.appHost || 'localhost:3000';
// फिर इसका उपयोग करें: mailer.sendFromTemplate({ template: 'forgotPassword', user: user, token: token, host: host, // भरोसेमंद चर का उपयोग करें protocol: config.environment === 'production' ? 'https' : req.protocol, acceptLanguage: req.headers['accept-language'] }, callback);
कॉन्फ़िगरेशन
secrets.json में जोड़ें:
"appHost": "https://your-real-domain.com"
समापन विचार
होस्ट हेडर इंजेक्शन 2025–2026 में आश्चर्यजनक रूप से सामान्य बना हुआ है, विशेष रूप से उन प्रोजेक्ट्स में जो वर्षों पहले शुरू किए गए थे और भारी ऑडिट नहीं किए गए हैं। एगी नागरिक तकनीक और संकट निगरानी के लिए एक मूल्यवान उपकरण है — मुझे उम्मीद है कि अनुरक्षक जल्द ही एक सुधार लागू करेंगे।
यदि आप एगी का रखरखाव या उपयोग करते हैं, तो अपनी तैनाती की जांच करें और आधिकारिक रिलीज़ आने तक मैन्युअल रूप से पैच करें। यदि आपके कोई प्रश्न हैं या आप अन्य प्रोजेक्ट्स में समान मुद्दों पर चर्चा करना चाहते हैं, तो बेझिझक संपर्क करें।
पढ़ने के लिए धन्यवाद और सुरक्षित रहें।