CVE-2026-18108: Net::SAML2 Authentication Bypass via Unsigned Encrypted Assertions (CVSS 9.8)
Net::SAML2 before 0.86 accepts decrypted SAML assertions that carry no XML signature. Any party can encrypt an unsigned assertion to an SP's published certificate and authenticate as an arbitrary user. Affects Azure AD, Okta, Google, ADFS, and all other IdPs.
Contents
TL;DR: Net::SAML2, the dominant Perl SAML library, accepts decrypted SAML assertions that carry no XML digital signature. An attacker who knows an SP's public encryption key (published in SAML metadata) can encrypt a forged assertion with an arbitrary NameID, wrap it in a samlp:Response, and post it to the assertion consumer service. No credentials. No interaction. Complete identity spoof. CVSS 9.8. Fixed in version 0.86.
What is Net::SAML2
Net::SAML2 is the primary Perl library for implementing SAML 2.0 Service Providers. It handles the full Web Browser SSO profile: AuthnRequest generation, SAML response parsing, encrypted assertion decryption, XML signature verification, and trust anchor validation. It is the SAML backbone for Perl-based identity systems.
The library is explicitly tested against every major identity provider: Azure AD (Microsoft Office 365), Google GSuite, Okta, OneLogin, Microsoft ADFS, PingIdentity, Shibboleth, Keycloak, Auth0, and SimpleSAMLphp. It also supports government identity systems including DigiD (Netherlands), eHerkenning, and eIDAS. This breadth means Net::SAML2 sits in front of university portals, government services, healthcare systems, and corporate SSO deployments.
Any Perl application that configures a decryption key_file and accepts EncryptedAssertions is affected. Callers who do not set a key_file and do not decrypt are unaffected.
How big is the impact
The CVSS 9.8 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) captures the severity: network-exploitable, no privileges, no user interaction, full confidentiality and integrity compromise. The attack requires one piece of public information: the SP's encryption certificate, which is published in the SP's SAML metadata by design (the IdP needs it to encrypt assertions to the SP).
An attacker constructs a SAML response containing an EncryptedAssertion that decrypts to an unsigned assertion with a forged NameID. Net::SAML2 decrypts it, finds no dsig:Signature element, and returns it as verified. The trust anchor check never executes. The attacker authenticates as any user in the system: an administrator, a CEO, a customer with privileged access. The attack leaves no obvious trace because it arrives through the normal SAML POST endpoint.
This is not a theoretical concern. SAML is the authentication protocol for thousands of enterprise applications. A single vulnerable SP behind Azure AD or Okta gives the attacker a door into the entire SSO ecosystem.
What happened
The vulnerability is in _verify_encrypted_assertion in the Assertion protocol class. The method decrypts the EncryptedAssertion and then checks whether the decrypted XML contains a dsig:Signature element. If no signature is present, it returns the XML as verified via return $xml unless $xpath->exists('dsig:Signature', $assert);. The signature check and trust anchor validation run only when a signature exists.
The fix in version 0.86 ensures that decrypted assertions without a signature are rejected rather than silently accepted. The commit (d916468) adds a check that requires either a dsig:Signature or a rejection. The changelog in 0.86 documents the change: "Do not accept unsigned assertions as verified when they arrive in EncryptedAssertion form."
What to do
Update Net::SAML2 to version 0.86:
cpanm Net::[email protected]
If you cannot update immediately, disable EncryptedAssertion support by removing any key_file configuration. This forces the SP to reject encrypted assertions entirely. Audit your SAML consumer logs for POST requests with unusual or unexpected NameID fields, particularly for administrative user identifiers. If your SP publishes its metadata publicly, rotate your encryption certificate after patching.
Continue reading
All posts
CVE-2026-69240: Sequelize Oracle Dialect Allows SQL Injection via TO_TIMESTAMP Escape Bypass (CVSS 9.8)
Sequelize versions before 6.37.4 fail to escape single quotes for string values starting with TO_TIMESTAMP or TO_DATE when using the Oracle dialect. An attacker can inject arbitrary SQL through any application value that reaches this escape path.

CVE-2026-69240: Sequelize Oracle Dialect SQL Injection (CVSS 9.8)
SQL injection in Sequelize Oracle dialect via TO_TIMESTAMP escape bypass. Fixed in 6.37.4.

CVE-2026-38447: osTicket Generates Predictable API Keys via MD5 Hashing (CVSS 9.8)
osTicket 1.18.3 generates API keys using MD5 with predictable inputs (timestamp and client IP). An attacker can approximate the key generation time and brute-force the key space. Affects 5 million+ users and 15,000+ businesses worldwide.
