Skip to content
Heist/ feed
Back to feed
Medium

(D)TLS 1.2 client accepts early ChangeCipherSpec before ClientKeyExchange

Type: advisorySources: OSV

A (D)TLS 1.2 client can accept a ChangeCipherSpec message before it has sent its ClientKeyExchange. No master secret has been derived at that point, so the client installs read keys derived from a known (deterministic) key and checks the server's Finished against that same key. An out-of-order ChangeCipherSpec can therefore be used by an attacker to complete the handshake in place of the server and send data the client accepts as authentic. The client's own traffic still uses correctly derived keys, so the attacker cannot read it, and the genuine server never completes the handshake. DTLS 1.2 clients are exposed because a datagram read can deliver the out-of-order records on its own. TLS 1.2 clients are exposed when the application supplies received bytes with wolfSSL_inject() or enables read ahead. For certificate suites, the attacker must be in a man-in-the-middle position. For PSK (Pre Shared Key) connections, any fake server can succeed without knowing the PSK.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-93304
Confirmed fixed CVEs
Not specified
Updated in this feed
3 Nov 2026, 04:32 UTC · Revision 1

Source evidence

(D)TLS 1.2 client accepts early ChangeCipherSpec before ClientKeyExchange

core-osv · Original source

Published 27 Sept 2026, 09:05 UTC

A (D)TLS 1.2 client can accept a ChangeCipherSpec message before it has sent its ClientKeyExchange. No master secret has been derived at that point, so the client installs read keys derived from a known (deterministic) key and checks the server's Finished against that same key. An out-of-order ChangeCipherSpec can therefore be used by an attacker to complete the handshake in place of the server and send data the client accepts as authentic. The client's own traffic still uses correctly derived keys, so the attacker cannot read it, and the genuine server never completes the handshake. DTLS 1.2 clients are exposed because a datagram read can deliver the out-of-order records on its own. TLS 1.2 clients are exposed when the application supplies received bytes with wolfSSL_inject() or enables read ahead. For certificate suites, the attacker must be in a man-in-the-middle position. For PSK (Pre Shared Key) connections, any fake server can succeed without knowing the PSK.

osv:CVE-2026-93304
Complete source record
{
  "id": "0897928c4d708843760fb279092186bff73f528b75ce9cc6b3d5301d4f1c787e",
  "url": "https://osv.dev/vulnerability/CVE-2026-93304",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "(D)TLS 1.2 client accepts early ChangeCipherSpec before ClientKeyExchange",
    "summary": "A (D)TLS 1.2 client can accept a ChangeCipherSpec message before it has sent its ClientKeyExchange. No master secret has been derived at that point, so the client installs read keys derived from a known (deterministic) key and checks the server's Finished against that same key. An out-of-order ChangeCipherSpec can therefore be used by an attacker to complete the handshake in place of the server and send data the client accepts as authentic. The client's own traffic still uses correctly derived keys, so the attacker cannot read it, and the genuine server never completes the handshake. DTLS 1.2 clients are exposed because a datagram read can deliver the out-of-order records on its own. TLS 1.2 clients are exposed when the application supplies received bytes with wolfSSL_inject() or enables read ahead. For certificate suites, the attacker must be in a man-in-the-middle position. For PSK (Pre Shared Key) connections, any fake server can succeed without knowing the PSK.",
    "evidence": "osv:CVE-2026-93304",
    "products": [],
    "severity": "medium",
    "structured": {
      "id": "CVE-2026-93304",
      "aliases": [
        "CVE-2026-93304"
      ],
      "metrics": [
        {
          "type": "CVSS_V4",
          "score": "CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N"
        }
      ],
      "affected": [
        {
          "ranges": [
            {
              "repo": "https://github.com/wolfssl/wolfssl",
              "type": "GIT",
              "events": [
                {
                  "introduced": "830de9a9fb99e30f9ac9caa0a7f7bba29c3b4863"
                },
                {
                  "last_affected": "ac01707f552c611fbd135cc723b2682b3e7f80f2"
                }
              ],
              "database_specific": {
                "extracted_events": [
                  {
                    "range": [
                      {
                        "introduced": "4.7.0"
                      },
                      {
                        "last_affected": "5.9.2"
                      }
                    ],
                    "source": "AFFECTED_FIELD",
                    "strategy": "StandardRange"
                  },
                  {
                    "cpe": "cpe:2.3:a:wolfssl:wolfssl:*:*:*:*:*:*:*:*",
                    "range": [
                      {
                        "introduced": "4.7.0"
                      },
                      {
                        "last_affected": "5.9.2"
                      }
                    ],
                    "source": "CPE_RANGE"
                  }
                ]
              }
            }
          ],
          "versions": [
            "v5.9.2-stable",
            "v5.9.1-stable",
            "v5.9.0-stable",
            "v5.8.4-stable",
            "wolfEntropy2d",
            "v5.8.2-stable",
            "wolfEntropy1",
            "v5.8.0-stable",
            "v5.7.6-stable",
            "v5.7.4-stable",
            "v5.2.1",
            "v5.7.2-stable",
            "v5.7.0-stable",
            "v5.6.6-stable",
            "v5.6.4-stable",
            "WCv5.0-RC12",
            "WCv5.0-RC11",
            "WCv5.0-RC10",
            "v5.6.2-stable",
            "v5.6.3-stable",
            "v5.6.0-stable",
            "v5.5.4-stable",
            "v5.5.3-stable",
            "v5.5.2-stable",
            "v5.5.1-stable",
            "v5.5.0-stable",
            "v5.4.0-stable",
            "v5.3.0-stable",
            "v5.2.0-stable",
            "v5.1.0-stable",
            "v5.0.0-stable",
            "WCv5.0-RC9",
            "v4.8.0-stable",
            "v4.7.1r",
            "v4.7.0-stable"
          ],
          "database_specific": {
            "source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-93304.json"
          }
        }
      ],
      "modified": "2026-10-28T02:30:25.976220586Z",
      "provider": "osv",
      "references": [
        "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/93xxx/CVE-2026-93304.json",
        "https://nvd.nist.gov/vuln/detail/CVE-2026-93304",
        "https://github.com/wolfSSL/wolfssl/pull/11458"
      ],
      "provider_metadata": {
        "cwe_ids": [
          "CWE-696"
        ],
        "cna_assigner": "wolfSSL",
        "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/93xxx/CVE-2026-93304.json"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-93304",
        "evidence": "/id"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/severity/0/score"
  },
  "source_id": "core-osv",
  "document_id": 492477,
  "published_at": "2026-09-27T09:05:37.132+00:00"
}