Apache mod_ssl TLS 1.3 Session Resumption Client Certificate Bypass (CVE-2025-23048)
by absholi7ly · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-23048
- Category
- web
- Affected product
- Apache HTTP Server (mod_ssl)
- Affected versions
- 2.4.35 – 2.4.62 (per source repository; tested against 2.4.57 Win64)
- Disclosed
- 2026-07-06
- Patch status
- unpatched
Tags
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07-06 |
| Author / Researcher | absholi7ly |
| CVE / Advisory | CVE-2025-23048 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.1 (per NVD) |
| Status | PoC |
| Tags | apache, mod_ssl, httpd, tls1.3, session-resumption, client-certificate, authentication-bypass, cwe-295, openssl |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Apache HTTP Server (mod_ssl) |
| Versions Affected | 2.4.35 – 2.4.62 (per source repository; tested against 2.4.57 Win64) |
| Language / Platform | PoC uses Bash/OpenSSL CLI commands against Apache HTTP Server on Windows (applies to any OS build of the affected versions) |
| Authentication Required | Yes (attacker needs a valid client certificate issued by a CA trusted by at least one virtual host) |
| Network Access Required | Yes |
Summary
CVE-2025-23048 is a client certificate authentication bypass in Apache HTTP Server’s mod_ssl that occurs when TLS 1.3 session resumption (session tickets/PSK) is used across virtual hosts configured with different SSLCACertificateFile directives. The root cause is that mod_ssl does not re-validate the client certificate’s issuing CA against the resuming virtual host’s trust store when a TLS 1.3 session ticket is presented, allowing a session established (and a certificate validated) on one vhost to be resumed on a different vhost that trusts a distinct CA. The PoC demonstrates this by performing a full TLS 1.3 handshake with a client certificate signed by CA1 against vhost1, saving the session ticket, and then resuming that saved session against vhost2 (which only trusts CA2) to reach a Require valid-user protected path without ever presenting a certificate trusted by CA2. Impact is unauthorized access to certificate-protected resources on any co-hosted vhost sharing the TLS stack/session cache, effectively bypassing mutual-TLS access controls.
Vulnerability Details
Root Cause
When SSLStrictSNIVHostCheck is off (or not enforced consistently) and virtual hosts share a TLS 1.3 session cache/ticket mechanism, mod_ssl restores the previously negotiated peer identity/authentication state on session resumption without re-checking it against the resuming vhost’s own SSLCACertificateFile/SSLVerifyClient policy:
| |
Because TLS 1.3 session tickets carry the previously authenticated state and SSLStrictSNIVHostCheck is disabled, a session ticket obtained on vhost1 (authenticated via CA1) can be replayed against vhost2, and the resumed session is treated as already-authenticated/valid without re-verifying the certificate chain against ca2.pem.
Attack Vector
- Attacker obtains (or already holds) a client certificate signed by
CA1, valid forvhost1.example.com. - Attacker performs a full TLS 1.3 handshake against
vhost1usingopenssl s_clientwith theCA1-signed client certificate, requestingGET /, and saves the resulting session ticket to a file (-sess_out session_v1.pem). - Attacker connects to
vhost2.example.com(same IP/port, different SNI) using-sess_in session_v1.pemto resume the saved TLS 1.3 session — without presenting any client certificate this time. mod_sslaccepts the resumed session as authenticated and grants access to the/restrictedpath onvhost2, which is supposed to require a certificate trusted byCA2only.- Attacker retrieves protected content from
vhost2despite never proving possession of aCA2-issued certificate.
Impact
An attacker who legitimately holds (or has compromised) a client certificate trusted by any one virtual host on a shared Apache instance can bypass mutual-TLS/client-certificate access controls on other, more sensitive virtual hosts on the same server — leading to unauthorized access to restricted resources, data disclosure, and defeat of per-vhost mTLS segmentation.
Environment / Lab Setup
Target:
- Apache HTTP Server 2.4.35 - 2.4.62 (tested: 2.4.57, Win64) with mod_ssl and mod_socache_shmcb enabled
- TLS 1.3 enabled (SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2)
- SSLSessionCache configured (shmcb) with SSLSessionTickets on
- Two (or more) name-based virtual hosts on the same IP:443, each with a distinct SSLCACertificateFile
- SSLStrictSNIVHostCheck off (default/typical shared-cert multi-vhost deployment)
Attacker:
- OpenSSL CLI (s_client) capable of TLS 1.3 with session ticket save/restore (-sess_out / -sess_in)
- A client certificate signed by the CA trusted by at least one of the virtual hosts
Proof of Concept
PoC Script
See
README.md(upstream repo contains the full walkthrough with screenshotspoc1.jpgandpoc2.jpg; no separate script file is provided — the PoC is a sequence ofopenssl s_clientcommands).
| |
Detection & Indicators of Compromise
- TLS session resumption (PSK / session ticket reuse) observed with a change in SNI/Host header
between the original full handshake and the resumed session.
- Apache/mod_ssl access logs showing a resumed TLS 1.3 session (short/absent handshake) followed by
access to a Require valid-user / Require ssl-verify-client protected path, with no corresponding
client certificate verification log entry for that vhost.
- Presence of "Reused, TLSv1.3" (or equivalent) in SSL debug/error logs immediately preceding access
to a differently-CA-scoped virtual host from the same client session.
Signs of compromise:
- Access to CA-restricted virtual host content without a matching client-certificate verification event in
mod_ssllogs. - Session ticket/PSK reuse across requests carrying different
Host/SNI values for vhosts configured with distinctSSLCACertificateFiledirectives. - Unexpected
Require valid-usergrants on a vhost immediately following a session resumed from a different vhost’s handshake.
Remediation
| Action | Detail |
|---|---|
| Primary fix | No official Apache httpd patch identified at time of mirroring — see references; track Apache Security Advisories for a fixed mod_ssl release addressing per-vhost re-validation on TLS 1.3 session resumption. |
| Interim mitigation | Set SSLStrictSNIVHostCheck on on all TLS 1.3 virtual hosts that require distinct client CAs (disables cross-SNI session resumption); alternatively, disable session ticket/session cache sharing (SSLSessionTickets off) between vhosts with different SSLCACertificateFile trust anchors, or terminate mTLS-sensitive vhosts on dedicated IP/port listeners. |
References
Notes
Mirrored from https://github.com/absholi7ly/CVE-2025-23048-POC on 2026-07-06. The upstream repository contains only a README.md with the full walkthrough plus two screenshots (poc1.jpg, poc2.jpg); there is no standalone exploit script beyond the documented openssl s_client command sequence.