CVE-2026-93304
Executive Summary
CVE-2026-93304 is a cryptographic protocol state-machine flaw (CWE-696, Incorrect Behavior Order) affecting (D)TLS 1.2 clients that accept a ChangeCipherSpec message before the client has transmitted its own ClientKeyExchange. Because no master secret has yet been derived at that point, the client installs read keys built from a deterministic, known key and validates the server's Finished message against that same key. An attacker positioned to inject an out-of-order ChangeCipherSpec can impersonate the server and complete the handshake with the client, sending data the client treats as authentic. The flaw is attributed to the wolfSSL library based on the description's specific reference to wolfSSL_inject() and its read-ahead behavior. For certificate-based suites the attacker requires a man-in-the-middle (MITM) position; for PSK (Pre-Shared Key) connections, any fake server can succeed without knowing the PSK. The client's own outbound traffic remains protected with correctly derived keys and cannot be read by the attacker, and the genuine server never completes the handshake. No public exploit code, PoC, or Nuclei template is currently available, and the issue is not listed in CISA KEV.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The vulnerability is a protocol state-machine ordering defect in the (D)TLS 1.2 handshake logic of the affected client. Under RFC-correct TLS 1.2 operation, the client must first send its ClientKeyExchange — an operation that contributes key material to the derivation of the master secret — before either side can legally transition to encrypted records. The ChangeCipherSpec message signals exactly that transition: "subsequent records are protected with freshly derived keys." CVE-2026-93304 arises because the client fails to enforce the required order of these events. It accepts a server-originated ChangeCipherSpec before it has sent a ClientKeyExchange.
At that early point in the handshake, no master secret exists yet. The client nevertheless installs read keys — and the description states these are derived from a known, deterministic key. With no secret entropy in play, the "encryption" of the receive path is effectively a fixed transformation that an outside observer can reproduce. The client then verifies the server's Finished message using that same predictable key.
The core consequences are:
Server authentication is broken. The Finished check that is supposed to prove the peer holds the session keys — and, for certificate suites, prove the peer holds the private key matching the presented certificate — is instead satisfied against a key the attacker can compute independently. The handshake therefore completes with an attacker-controlled endpoint masquerading as the server.
Data accepted as authentic is attacker-forged. Any application data sent after this premature handshake completes is decrypted/authenticated by the client using the deterministic key, so attacker-supplied records are accepted as legitimate server traffic.
Client confidentiality is preserved (conditionally). The client's own outbound traffic continues to use correctly derived keys, so an on-path attacker cannot read client-to-server data. However, integrity and authenticity of received data are fully compromised.
The exposure differs by transport:
DTLS 1.2: DTLS runs over datagrams (UDP), and a single datagram read can legitimately deliver multiple records at once. This means out-of-order or coalesced records — including a premature ChangeCipherSpec — can arrive through ordinary datagram processing without the application doing anything unusual. DTLS 1.2 clients are exposed by default in the scenario described.
TLS 1.2: Because TLS runs over a stream, the library will not normally surface a record before the expected prior handshake state. The description states TLS 1.2 clients are exposed when the application supplies received bytes through
wolfSSL_inject()or enables read-ahead buffering. In these modes, attacker-supplied bytes can be fed into the record processor out of the natural handshake order, reproducing the DTLS condition.
Attack prerequisite severity depends on the authentication mode:
- Certificate suites: The attacker must be in a MITM position to intercept/replace the server's records and inject the out-of-order ChangeCipherSpec at the right moment. This corresponds to the HIGH attack-complexity rating and the classic on-path threat model.
- PSK suites: No certificate or PSK knowledge is required. The description is explicit that any fake server can succeed without knowing the PSK, because PSK-derived keying never becomes relevant before the premature transition. A PSK connection's entire server-authentication premise is defeated.
The assigned CWE — CWE-696, Incorrect Behavior Order — accurately characterizes this as a sequencing/validation-order defect rather than a key-management or cryptographic-primitive failure. The root cause is the absence (or insufficiency) of a state guard that should reject ChangeCipherSpec until the ClientKeyExchange has been transmitted and the master secret derived.
Exploitation Scenarios
No public PoC or exploit code exists for CVE-2026-93304; the chain below is inferred from the vulnerability class and the protocol mechanics described in the NVD entry. No specific function names, endpoints, or parameter names are asserted beyond those appearing in the description (wolfSSL_inject()).
1) Reconnaissance / target identification. The attacker identifies a victim application that uses a (D)TLS 1.2 client. DTLS 1.2 clients are the highest-value target because datagram processing naturally permits out-of-order record delivery — no special application behavior is required. Alternatively, the attacker identifies a TLS 1.2 client whose application feeds received bytes via wolfSSL_inject() or enables read-ahead. Network telemetry can fingerprint DTLS endpoints (UDP-based TLS, common in IoT, VoIP, VPN, and real-time media). Because the flaw lives in the client, the server side chosen by the attacker does not need to be genuine.
2) Triggering the flaw class. For certificate-based suites the attacker must first achieve a MITM position (ARP/DNS spoofing, rogue access point, BGP/interception, or a compromised network path). For PSK connections, no MITM position is strictly required — any host that can respond as a fake server suffices, because the PSK is never needed. The attacker intercepts the client's handshake and, in place of the genuine server's expected message sequence, delivers a ChangeCipherSpec record before the client has sent its ClientKeyExchange. In DTLS, this can be placed in a datagram that the client reads as an out-of-order record; in TLS, it is delivered to a client configured with wolfSSL_inject() or read-ahead.
3) Payload / execution at the vulnerability-class level. Once the premature ChangeCipherSpec is accepted, the client installs read keys derived from the known deterministic key and processes the subsequent Finished message against that same predictable key. The attacker — who can compute the identical key — constructs and sends a matching Finished, causing the handshake to complete with the attacker as the "server." The genuine server never finalizes the handshake. The attacker then sends application-layer records protected under the deterministic key. The client validates and accepts these records as authentic server data.
4) Post-exploitation impact. The attacker controls the content and authenticity of all data the client receives over that connection. In integrity-sensitive protocols this is severe: it enables response manipulation, forged commands, spoofed configuration/data delivery, downgrade of application state, and injection of attacker-chosen payloads that the client treats as coming from the trusted server. The client's own transmitted data remains confidential from the attacker (correct keys on the send path), and the real server never completes — so this is an impersonation/integrity attack, not a full session hijack of both directions. Impact is bounded to the integrity/authenticity of received data and the false completion of the handshake.
Impact Assessment
The impact is high integrity with no confidentiality loss on the client's send path:
- Confidentiality (C:N): The client's own traffic uses correctly derived keys; an on-path attacker cannot read it. No confidentiality impact is justified.
- Integrity (I:H): The client accepts attacker-forged records as authentic server data and completes a handshake with an impersonated server. This is the core impact.
- Availability (A:N): The genuine server never completes the handshake, but the client proceeds — no explicit denial-of-service is described, though failed legitimate sessions could occur as a side effect.
- Attack Vector (AV:N): Exploitable over the network.
- Attack Complexity (AC:H): For certificate suites, MITM positioning and precise timing/ordering are required, elevating complexity. For PSK it is substantially lower, but a single CVSS score cannot express both; the vector reflects the higher-complexity certificate case.
- Privileges/User Interaction: None required (PR:N/UI:N) as the flaw is in the client handshake state machine.
Blast radius is every deployment of the affected client library in a (D)TLS 1.2 client role — particularly:
- IoT/embedded devices and resource-constrained endpoints using DTLS (exposed by default per the description).
- Applications using
wolfSSL_inject()for custom transports (e.g., tunnels, custom sockets, DTLS-over-custom channels). - Applications that enable read-ahead buffering.
- PSK-based deployments are the worst case: any fake server succeeds, so trust in PSK provisioning is void until patched. Industrial, automotive, and IIoT fleets commonly rely on PSK DTLS and should be treated as the highest-priority exposure.
Because the client is the vulnerable component, blast radius is measured in client endpoints and the upstream services they trust, not in a single central server. No CVSS base score was published by NVD (score: N/A); the vector above is a reasoned representation of the described mechanics and should not be treated as an official score.
Detection Guidance
Sigma Rule
title: Potential CVE-2026-93304 Out-of-Order TLS ChangeCipherSpec Handshake Anomaly
id: 6e2b9f4a-7c1d-4a3e-9b57-2f8d0c1a4e10
status: experimental
description: Detects anomalous TLS/DTLS handshake sequences where a ChangeCipherSpec is observed prior to a completed ClientKeyExchange, consistent with CVE-2026-93304 exploitation against (D)TLS 1.2 clients.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-93304
author: valtersit.com
date: 2026-01-01
logsource:
product: zeek
service: ssl
detection:
selection_ccs:
record_type: 'change_cipher_spec'
selection_no_cke:
has_client_key_exchange: false
selection_ver:
version|startswith: 'TLSv1.2'
condition: selection_ccs and selection_no_cke and selection_ver
falsepositives:
- Benign DTLS record reordering during network congestion (requires triage)
level: medium
tags:
- attack.t1557
- cve.2026.93304
YARA Rule
rule CVE_2026_93304_TLS_CCS_State_Confusion
{
meta:
description = "Heuristic memory/file scan for (D)TLS 1.2 client handshake order-validation indicators related to CVE-2026-93304"
author = "valtersit.com"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-93304"
date = "2026-01-01"
severity = "medium"
strings:
$ccs = { 14 03 03 00 01 01 } // TLS 1.2 ChangeCipherSpec record (type 0x14, ver 0303, len 1, payload 0x01)
$dtls_ccs = { 14 fe fd 00 00 00 00 00 00 00 00 01 01 } // DTLS 1.2 ChangeCipherSpec record
$ver12 = { 03 03 } // TLS 1.2 version
$dtlsver = { fe fd } // DTLS 1.2 version
condition:
($ccs and $ver12) or ($dtls_ccs and $dtlsver)
}
Suricata IDS Rule
alert udp any any -> any any (msg:"CVE-2026-93304 Possible Out-of-Order DTLS 1.2 ChangeCipherSpec (client server-impersonation attempt)"; flow:to_client; content:"|14 FE FD|"; offset:0; depth:3; content:"|01|"; byte_test:1,=,1,11; threshold:type limit, track by_src, count 1, seconds 60; reference:cve,2026-93304; classtype:protocol-command-decode; sid:202693304; rev:1;)
alert tcp any any -> any any (msg:"CVE-2026-93304 Possible Premature TLS 1.2 ChangeCipherSpec (client handshake order abuse)"; flow:to_client,established; content:"|14 03 03 00 01 01|"; threshold:type limit, track by_src, count 1, seconds 60; reference:cve,2026-93304; classtype:protocol-command-decode; sid:202693305; rev:1;)
Elastic Detection
sequence by process.entity_id with maxspan=5s
[ network where network.transport == "udp" and tls.version == "1.2" ]
[ network where tls.version == "1.2" and
event.action == "change_cipher_spec_observed" and
tls.client_has_sent_key_exchange == false ]
Splunk SPL Query
index=network (sourcetype=bro:ssl:json OR sourcetype=zeek:ssl OR sourcetype="suricata")
| eval ver=coalesce(tls_version, version)
| where ver LIKE "TLSv1.2%" OR ver="1.2"
| where (record_type="change_cipher_spec" OR msg="ChangeCipherSpec")
AND (client_key_exchange_sent=false OR isnull(client_key_exchange_sent))
| stats count min(_time) as first_seen max(_time) as last_seen values(dest_ip) as servers by src_ip, dest_ip, dest_port
| where count >= 1
| convert ctime(first_seen) ctime(last_seen)
| sort - count
Wazuh OSSEC Rule
<group name="cve-2026-93304,tls,dtls,">
<rule id="100933" level="10">
<decoded_as>json</decoded_as>
<field name="event.type">change_cipher_spec</field>
<field name="tls.version">1.2</field>
<field name="tls.client_key_exchange_sent">false</field>
<description>CVE-2026-93304: Out-of-order (D)TLS 1.2 ChangeCipherSpec before ClientKeyExchange - possible server impersonation attempt.</description>
<mitre>
<id>T1557</id>
</mitre>
<group>cve_2026_93304,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 0/4 — UNPATCHED. No patch evidence exists from any tracked source, there is no vendor advisory, no fixed version, and no CISA KEV entry.
1) Immediate mitigations
- Enforce handshake state ordering at the application/handshake layer where possible. Reject any inbound ChangeCipherSpec observed before the client has transmitted its ClientKeyExchange. Since the flaw is in the client library's validation order, compensating controls at the integration layer are the primary near-term defense.
- Avoid
wolfSSL_inject()for untrusted data and disable read-ahead on TLS 1.2 clients. The description explicitly names these as the TLS 1.2 exposure conditions; removing them eliminates the TLS (non-DTLS) exposure path. - Restrict DTLS 1.2 client exposure. Until a fix is available, prefer TLS over an ordered stream, or apply network controls (segmentation, authenticated tunnels) that make injecting out-of-order records into datagram reads harder.
- Treat PSK DTLS as untrusted. Because any fake server succeeds on PSK connections, do not rely on PSK-only peer authentication for integrity-critical exchanges until patched; layer additional end-to-end authentication above the transport.
- Network-level controls: Enforce mutual TLS where feasible, use trusted network paths, and monitor for ChangeCipherSpec anomalies (see Detection Guidance) as compensating detection.
2) Patch / upgrade steps
- No fixed version is currently identified. Monitor the vendor's security advisory stream for a (D)TLS client update addressing handshake order validation and apply it as soon as it is released.
- Where source access is available, verify the client rejects ChangeCipherSpec received before ClientKeyExchange is sent, and confirm read-key derivation cannot occur prior to master-secret derivation. Do not deploy untested self-modifications to production crypto code without review.
3) Long-term hardening
- Adopt client libraries that enforce strict handshake state machines and fail closed on out-of-order records.
- Standardize on TLS 1.3 where practical — its handshake structure reduces the attack surface for premature-CCS style confusion (though 1.3 preserves middlebox compatibility behavior, so validate library handling specifically).
- Eliminate reliance on PSK-only server authentication for data whose authenticity matters; prefer certificate-based mutual authentication with certificate pinning.
- Add continuous handshake-anomaly monitoring (state-order telemetry) to SIEM pipelines and include ordering checks in protocol fuzzing/regression test suites.
References
- NVD — CVE-2026-93304: https://nvd.nist.gov/vuln/detail/CVE-2026-93304
- MITRE CWE-696 (Incorrect Behavior Order): https://cwe.mitre.org/data/definitions/696.html
- MITRE ATT&CK T1557 (Adversary-in-the-Middle): https://attack.mitre.org/techniques/T1557/
- IETF RFC 5246 (TLS 1.2) and RFC 6347 (DTLS 1.2) — ChangeCipherSpec and handshake ordering requirements: https://www.rfc-editor.org/rfc/rfc5246 and https://www.rfc-editor.org/rfc/rfc6347
- wolfSSL project security advisories: https://www.wolfssl.com/security/ (monitor for the corresponding fix)
Threat actor / exploit-in-the-wild status: No exploit code, PoC, or Nuclei template is available; the issue is not listed in CISA KEV. No known threat actor campaigns are associated with CVE-2026-93304 at this time.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.