← Back to CVE Explorer

CVE-2026-18092

Full vulnerability record from the local CVENow database.

Description

Net::SAML2 versions before 0.86 for Perl allow SAML authentication bypass via XML signature wrapping because new_from_xml reads assertion identity with document-wide XPath instead of the signed subtree. new_from_xml reads the NameID, attribute values, SessionIndex, audience and other identity fields with document-wide XPath, such as //saml:Assertion/saml:AttributeStatement/saml:Attribute and //saml:Subject/saml:NameID, which select the first matching element in document order rather than the element covered by the verified signature. handle_response confirms that a signature is present and, when a cacert is configured, that it chains to the CA, but XML::Sig verifies only the element named by the signature's Reference URI, so unsigned sibling assertions in the same document are not covered. An attacker who holds any one IdP-signed assertion can add an unsigned attacker-authored assertion earlier in document order; the signature still verifies and the document-order XPath returns the attacker's NameID and attributes. Any caller that passes an untrusted Response to new_from_xml can accept identity fields from an assertion the IdP never signed, even when a cacert trust anchor is configured, so a party holding one valid IdP-signed assertion can authenticate as an arbitrary user.

Severity
HIGH
CVSS score
8.1 (v3.1)
Vulnerability status
Analyzed
Source identifier
9b29abf9-4ab0-4765-b253-1875cd9b441e
Published
2026-08-03 14:16:25.030000
Last modified
2026-10-23 21:10:00.157000
View original CVE JSON
{
  "id": "CVE-2026-18092",
  "sourceIdentifier": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
  "published": "2026-08-03T14:16:25.030",
  "lastModified": "2026-10-23T21:10:00.157",
  "vulnStatus": "Analyzed",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "Net::SAML2 versions before 0.86 for Perl allow SAML authentication bypass via XML signature wrapping because new_from_xml reads assertion identity with document-wide XPath instead of the signed subtree.\n\nnew_from_xml reads the NameID, attribute values, SessionIndex, audience and other identity fields with document-wide XPath, such as //saml:Assertion/saml:AttributeStatement/saml:Attribute and //saml:Subject/saml:NameID, which select the first matching element in document order rather than the element covered by the verified signature. handle_response confirms that a signature is present and, when a cacert is configured, that it chains to the CA, but XML::Sig verifies only the element named by the signature's Reference URI, so unsigned sibling assertions in the same document are not covered. An attacker who holds any one IdP-signed assertion can add an unsigned attacker-authored assertion earlier in document order; the signature still verifies and the document-order XPath returns the attacker's NameID and attributes.\n\nAny caller that passes an untrusted Response to new_from_xml can accept identity fields from an assertion the IdP never signed, even when a cacert trust anchor is configured, so a party holding one valid IdP-signed assertion can authenticate as an arbitrary user."
    },
    {
      "lang": "es",
      "value": "Las versiones de Net::SAML2 anteriores a la 0.86 para Perl permiten la omisión de autenticación SAML mediante la envoltura de firma XML porque new_from_xml lee la identidad de la aserción con XPath a nivel de documento en lugar del subárbol firmado.\n\nnew_from_xml lee el NameID, los valores de atributos, SessionIndex, la audiencia y otros campos de identidad con XPath a nivel de documento, como //saml:Assertion/saml:AttributeStatement/saml:Attribute y //saml:Subject/saml:NameID, que seleccionan el primer elemento coincidente en el orden del documento en lugar del elemento cubierto por la firma verificada. handle_response confirma que una firma está presente y, cuando se configura un cacert, que encadena a la CA, pero XML::Sig verifica solo el elemento nombrado por la URI de referencia de la firma, por lo que las aserciones hermanas sin firmar en el mismo documento no están cubiertas. Un atacante que posee cualquier aserción firmada por el IdP puede añadir una aserción sin firmar, creada por el atacante, antes en el orden del documento; la firma aún se verifica y el XPath en orden de documento devuelve el NameID y los atributos del atacante.\n\nCualquier llamador que pasa una Respuesta no confiable a new_from_xml puede aceptar campos de identidad de una aserción que el IdP nunca firmó, incluso cuando se configura un ancla de confianza cacert, por lo que una parte que posee una aserción válida firmada por el IdP puede autenticarse como un usuario arbitrario."
    }
  ],
  "affected": [
    {
      "source": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
      "affectedData": [
        {
          "vendor": "TIMLEGGE",
          "product": "Net::SAML2",
          "defaultStatus": "unaffected",
          "collectionURL": "https://cpan.org/modules",
          "packageName": "Net-SAML2",
          "programFiles": [
            "lib/Net/SAML2/Protocol/Assertion.pm",
            "lib/Net/SAML2/Binding/POST.pm"
          ],
          "programRoutines": [
            {
              "name": "Net::SAML2::Protocol::Assertion::new_from_xml"
            },
            {
              "name": "Net::SAML2::Binding::POST::handle_response"
            }
          ],
          "repo": "https://github.com/perl-net-saml2/perl-Net-SAML2",
          "versions": [
            {
              "version": "0",
              "lessThan": "0.86",
              "versionType": "custom",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV31": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "type": "Secondary",
        "cvssData": {
          "version": "3.1",
          "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H",
          "baseScore": 8.1,
          "baseSeverity": "HIGH",
          "attackVector": "NETWORK",
          "attackComplexity": "LOW",
          "privilegesRequired": "NONE",
          "userInteraction": "REQUIRED",
          "scope": "UNCHANGED",
          "confidentialityImpact": "NONE",
          "integrityImpact": "HIGH",
          "availabilityImpact": "HIGH"
        },
        "exploitabilityScore": 2.8,
        "impactScore": 5.2
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-08-03T20:00:23.033425Z",
          "id": "CVE-2026-18092",
          "options": [
            {
              "exploitation": "none"
            },
            {
              "automatable": "no"
            },
            {
              "technicalImpact": "partial"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-347"
        }
      ]
    }
  ],
  "configurations": [
    {
      "nodes": [
        {
          "operator": "OR",
          "negate": false,
          "cpeMatch": [
            {
              "vulnerable": true,
              "criteria": "cpe:2.3:a:timlegge:net\\:\\:saml2:*:*:*:*:*:perl:*:*",
              "versionEndExcluding": "0.86",
              "matchCriteriaId": "69FF1709-62F7-4E8C-B90D-ABFA96B07FF1"
            }
          ]
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://github.com/perl-net-saml2/perl-Net-SAML2/commit/201fead7f42b83f40c84bf4a311a25b09acd18f9.patch",
      "source": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
      "tags": [
        "Patch"
      ]
    },
    {
      "url": "https://metacpan.org/release/TIMLEGGE/Net-SAML2-0.86/changes",
      "source": "9b29abf9-4ab0-4765-b253-1875cd9b441e",
      "tags": [
        "Release Notes"
      ]
    }
  ]
}