Description
Without NO_SESSION_CACHE_REF, wolfSSL_get_session() does not return a session object but a ClientSession reference of the form {row, index, hash(sessionID)} into the process-global SessionCache, and ClientSessionToSession() validates it against that hash alone. Because the TLS 1.2 session ID is chosen by the server and sent in clear, AddSessionToCache() matches any other server's session on the same ID and overwrites the client-side entry with that server's master secret, cipher suite and version, while the handle continues to resolve; nothing on the write path compares the peer, the application's server ID or the WOLFSSL_CTX. Resuming through the handle then produces an abbreviated handshake in which no Certificate message is sent, so neither chain verification nor wolfSSL_check_domain_name() runs, and the attacker is accepted as the original server for the whole of that connection. Affected builds are those leaving NO_SESSION_CACHE_REF, NO_SESSION_CACHE, NO_CLIENT_CACHE and TITAN_SESSION_CACHE all undefined, which includes a plain ./configure, --enable-opensslextra and --enable-opensslall; fifteen integration options define NO_SESSION_CACHE_REF and are therefore not affected, among them --enable-all, --enable-distro, --enable-curl, --enable-nginx, --enable-haproxy, --enable-stunnel, --enable-wpas and the rest of the OPENSSL_COMPATIBLE_DEFAULTS family, and --enable-leanpsk, --enable-leantls, --enable-lowresource and --enable-tinytls13 disable the cache outright. The application must use the legacy reference flow, wolfSSL_get_session() or SSL_get_session() followed by wolfSSL_set_session(); wolfSSL_get1_session() returns the session object itself and is not affected, nor are wolfSSL_SetServerID() lookups. Only TLS 1.2 and below and DTLS 1.2 and below are reachable, since TLS 1.3 and ticket resumption with an empty ServerHello session ID both use a client-chosen cache key. The poisoned entry lives in the process-global cache, so it crosses WOLFSSL_CTX boundaries and persists until the entry is evicted or the session times out, 500 seconds by default. Releases v5.3.0 through v5.9.2 are affected; the fix adds a per-write generation counter to the cache and raises WOLFSSL_CACHE_VERSION from 2 to 3, so a cache persisted by an older build is rejected by a fixed one.
Published: 2026-09-27
Score: 2.3 Low
EPSS: < 1% Very Low
KEV: No
Impact: Impersonation via TLS session resumption
Action: Patch
AI Analysis

Impact

The vulnerability allows an attacker to poison the client session cache so that a TLS session can be resumed using a session ID belonging to a different server. When this occurs the abbreviated handshake omits the Certificate message, meaning neither certificate validation nor domain name checking is performed. As a result the attacker is accepted as the original server, enabling credential theft, data tampering, or other malicious actions without the client noticing. This flaw is a weakness in authentication (CWE‑287).

Affected Systems

The flaw is present in wolfSSL builds that do not define the NO_SESSION_CACHE_REF, NO_SESSION_CACHE, NO_CLIENT_CACHE or TITAN_SESSION_CACHE options. Versions from 5.3.0 through 5.9.2 are affected. The issue can appear in default builds or in configurations that enable OpenSSL compatibility or the standard testing suites; builds that explicitly enable flags such as --enable-all, --enable-distro, --enable-curl, --enable-nginx, --enable-haproxy, --enable-stunnel, --enable-wpas or the OPENSSL_COMPATIBLE_DEFAULTS family avoid the bug.

Risk and Exploitability

The CVSS score is 2.3, indicating a low overall severity, and no EPSS data is available. The flaw is not listed in CISA’s KEV catalog. The attack vector requires the attacker to control or manipulate a TLS session ID that the client will cache during an earlier handshake, and it may be conducted over the network or via an application that shares the process global cache. Because the poisoned cache entry persists until evicted or timed out (by default 500 seconds), a vulnerable client may continue to accept the malicious server for a short period of time. While exploitation is limited by the need to supply a session ID that already exists in the cache, remote attackers could trigger the cache overwrite by establishing an initial connection to a legitimate server and then presenting a forged session ID from a malicious server in a second connection. The use of the global cache allows the poisoned entry to cross WOLFSSL_CTX boundaries, extending the window in which the impersonation can occur.

Generated by OpenCVE AI on September 27, 2026 at 10:26 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade wolfSSL to version 5.9.3 or later, which introduces a per‑write generation counter and raises the cache version to invalidate old caches.
  • If an upgrade is not possible, rebuild wolfSSL with the cache disabled by defining NO_SESSION_CACHE_REF, NO_SESSION_CACHE, NO_CLIENT_CACHE and TITAN_SESSION_CACHE or by using a configuration such as --disable-opensslextra, thereby removing the vulnerable cache path.
  • Where possible, configure applications to explicitly verify server certificates even when a session is resumed, or use the wolfSSL_get1_session function to obtain a fully validated session object.

Generated by OpenCVE AI on September 27, 2026 at 10:26 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Wed, 30 Sep 2026 17:45:00 +0000

Type Values Removed Values Added
CPEs cpe:2.3:a:wolfssl:wolfssl:*:*:*:*:*:*:*:*
Metrics cvssV3_1

{'score': 5.4, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N'}


Tue, 29 Sep 2026 17:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Sun, 27 Sep 2026 11:00:00 +0000

Type Values Removed Values Added
First Time appeared Wolfssl
Wolfssl wolfssl
Vendors & Products Wolfssl
Wolfssl wolfssl

Sun, 27 Sep 2026 09:00:00 +0000

Type Values Removed Values Added
Description Without NO_SESSION_CACHE_REF, wolfSSL_get_session() does not return a session object but a ClientSession reference of the form {row, index, hash(sessionID)} into the process-global SessionCache, and ClientSessionToSession() validates it against that hash alone. Because the TLS 1.2 session ID is chosen by the server and sent in clear, AddSessionToCache() matches any other server's session on the same ID and overwrites the client-side entry with that server's master secret, cipher suite and version, while the handle continues to resolve; nothing on the write path compares the peer, the application's server ID or the WOLFSSL_CTX. Resuming through the handle then produces an abbreviated handshake in which no Certificate message is sent, so neither chain verification nor wolfSSL_check_domain_name() runs, and the attacker is accepted as the original server for the whole of that connection. Affected builds are those leaving NO_SESSION_CACHE_REF, NO_SESSION_CACHE, NO_CLIENT_CACHE and TITAN_SESSION_CACHE all undefined, which includes a plain ./configure, --enable-opensslextra and --enable-opensslall; fifteen integration options define NO_SESSION_CACHE_REF and are therefore not affected, among them --enable-all, --enable-distro, --enable-curl, --enable-nginx, --enable-haproxy, --enable-stunnel, --enable-wpas and the rest of the OPENSSL_COMPATIBLE_DEFAULTS family, and --enable-leanpsk, --enable-leantls, --enable-lowresource and --enable-tinytls13 disable the cache outright. The application must use the legacy reference flow, wolfSSL_get_session() or SSL_get_session() followed by wolfSSL_set_session(); wolfSSL_get1_session() returns the session object itself and is not affected, nor are wolfSSL_SetServerID() lookups. Only TLS 1.2 and below and DTLS 1.2 and below are reachable, since TLS 1.3 and ticket resumption with an empty ServerHello session ID both use a client-chosen cache key. The poisoned entry lives in the process-global cache, so it crosses WOLFSSL_CTX boundaries and persists until the entry is evicted or the session times out, 500 seconds by default. Releases v5.3.0 through v5.9.2 are affected; the fix adds a per-write generation counter to the cache and raises WOLFSSL_CACHE_VERSION from 2 to 3, so a cache persisted by an older build is rejected by a fixed one.
Title Client session cache reference poisoning allows resumption with wrong server
Weaknesses CWE-287
References
Metrics cvssV4_0

{'score': 2.3, 'vector': 'CVSS:4.0/AV:A/AC:H/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N'}


cve-icon MITRE

Status: PUBLISHED

Assigner: wolfSSL

Published:

Updated: 2026-09-29T16:50:09.410Z

Reserved: 2026-09-21T15:16:59.806Z

Link: CVE-2026-94419

cve-icon Vulnrichment

Updated: 2026-09-29T16:49:13.297Z

cve-icon NVD

Status : Analyzed

Published: 2026-09-27T09:16:36.493

Modified: 2026-09-30T17:36:47.747

Link: CVE-2026-94419

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-27T10:45:06Z

Weaknesses