{"id":"CVE-2025-29774","aliases":["GHSA-9p8x-f768-wp2g"],"url":"https://o3.security/vulnerability/CVE-2025-29774","summary":"xml-crypto Vulnerable to XML Signature Verification Bypass via Multiple SignedInfo References","details":"# Impact\nAn attacker may be able to exploit this vulnerability to bypass authentication or authorization mechanisms in systems that rely on xml-crypto for verifying signed XML documents. The vulnerability allows an attacker to modify a valid signed XML message in a way that still passes signature verification checks. For example, it could be used to alter critical identity or access control attributes, enabling an attacker with a valid account to escalate privileges or impersonate another user.\n\n# Patches\nAll versions <= 6.0.0 are affected. Please upgrade to version 6.0.1.\n\nIf you are still using v2.x or v3.x please upgrade to the associated patch version.\n\n# Indicators of Compromise\n\nWhen logging XML payloads, check for the following indicators. If the payload includes encrypted elements, ensure you analyze the decrypted version for a complete assessment. (If encryption is not used, analyze the original XML document directly). This applies to various XML-based authentication and authorization flows, such as SAML Response payloads.\n\n### Multiple SignedInfo Nodes\nThere should not be more than one SignedInfo node inside a Signature. If you find multiple SignedInfo nodes, it could indicate an attack.\n\n```xml\n<Signature>\n    <SomeNode>\n      <SignedInfo>\n        <Reference URI=\"somefakereference\">\n          <DigestValue>forgeddigestvalue</DigestValue>\n        </Reference>\n      </SignedInfo>\n    </SomeNode>\n    <SignedInfo>\n        <Reference URI=\"realsignedreference\">\n          <DigestValue>realdigestvalue</DigestValue>\n        </Reference>\n      </SignedInfo>\n    </SignedInfo>\n</Signature>\n```\n\n### Code to test\n\nPass in the decrypted version of the document\n```js\ndecryptedDocument = ... // yours to implement\n\n// This check is per-Signature node, not per-document\nconst signedInfoNodes = xpath.select(\".//*[local-name(.)='SignedInfo']\", signatureNode);\n\nif (signedInfoNodes.length === 0) {\n  // Not necessarily a compromise, but invalid. Should contain exactly one SignedInfo node\n  // Yours to implement\n}\n\nif (signedInfoNodes.length > 1) {\n  // Compromise detected, yours to implement\n}\n```","published":"2025-03-14T17:05:53.943Z","modified":"2026-08-12T03:51:28.941942887Z","cvss":null,"epss":null,"cisaKev":null,"exploitsKnown":1,"affectedPackages":[{"ecosystem":"npm","name":"xml-crypto","fixedVersion":"6.0.1"},{"ecosystem":"npm","name":"xml-crypto","fixedVersion":"3.2.1"},{"ecosystem":"npm","name":"xml-crypto","fixedVersion":"2.1.6"}],"fix":{"url":"https://github.com/node-saml/xml-crypto/commit/28f92218ecbb8dcbd238afa4efbbd50302aa9aed","label":"node-saml/xml-crypto@28f9221"},"references":[{"type":"WEB","url":"https://github.com/node-saml/xml-crypto/releases/tag/v2.1.6"},{"type":"WEB","url":"https://github.com/node-saml/xml-crypto/releases/tag/v3.2.1"},{"type":"WEB","url":"https://github.com/node-saml/xml-crypto/releases/tag/v6.0.1"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/29xxx/CVE-2025-29774.json"},{"type":"ADVISORY","url":"https://github.com/node-saml/xml-crypto/security/advisories/GHSA-9p8x-f768-wp2g"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2025-29774"},{"type":"FIX","url":"https://github.com/node-saml/xml-crypto/commit/28f92218ecbb8dcbd238afa4efbbd50302aa9aed"},{"type":"FIX","url":"https://github.com/node-saml/xml-crypto/commit/886dc63a8b4bb5ae1db9f41c7854b171eb83aa98"},{"type":"FIX","url":"https://github.com/node-saml/xml-crypto/commit/8ac6118ee7978b46aa56b82cbcaa5fca58c93a07"},{"type":"ARTICLE","url":"https://workos.com/blog/samlstorm"},{"type":"PACKAGE","url":"https://github.com/node-saml/xml-crypto"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-08-12T03:51:28.941942887Z"}}