☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Aiohttp logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 2.7 🐛 CWE-444
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2025-69225

CVE-2025-69225 Supply Chain Attack in Aiohttp
📅 PUBLISHED: 2026-01-05 23:16 UTC 🔄 UPDATED: 2026-09-23 20:37 UTC
[ OFFICIAL PATCH DEPLOYED ↓ ] FIX: CONFIRMED — 3+ independent sources confirm fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.28%
👁️
0.28% probability
6.9× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
Country: Global License: Open Source
Patch available — upgrade to latest release
CVSS SEVERITY SCALE
9.0–10.0 CRITICAL
7.0–8.9 HIGH
4.0–6.9 MEDIUM
0.1–3.9 LOW
0.0 NONE
2.7
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-69225 is a security advisory affecting the AIOHTTP library, an asynchronous HTTP client/server framework for Python. The vulnerability resides in the parser logic for the HTTP Range header in versions 3.13.2 and below. The parser incorrectly allows non-ASCII decimal characters to be present in the Range header. While no direct impact has been demonstrated, this flaw could potentially be leveraged in a request smuggling attack, where an attacker manipulates the interpretation of HTTP request boundaries between a front-end proxy and the AIOHTTP backend. The issue has been patched in version 3.13.3.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Supply Chain & Package Security

This vulnerability is in the PyPI package aiohttp. Organizations using this library should immediately audit their dependencies for versions below 3.13.3. The risk is elevated in environments where AIOHTTP is deployed behind a reverse proxy or load balancer, as request smuggling scenarios typically involve discrepancies in how different systems parse HTTP headers. A malicious actor could craft a Range header with non-ASCII characters that are interpreted differently by the proxy and the AIOHTTP server, potentially allowing the attacker to poison the cache, bypass security controls, or hijack user sessions.

CVSS Breakdown & Threat Level

CVSS Score: 0.0 (NVD assigned, likely due to lack of confirmed impact) CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N (Estimated based on potential request smuggling)

  • Attack Vector (AV): Network – The vulnerability can be exploited remotely over the network.
  • Attack Complexity (AC): Low – No special conditions are required for exploitation.
  • Privileges Required (PR): None – No authentication is needed.
  • User Interaction (UI): None – The victim does not need to perform any action.
  • Scope (S): Unchanged – The exploit cannot affect resources beyond the vulnerable component.
  • Confidentiality (C): None – No direct data disclosure.
  • Integrity (I): Low – Potential to manipulate request boundaries, leading to cache poisoning or request smuggling.
  • Availability (A): None – No direct denial of service.

Threat Level: Medium (due to potential for request smuggling in proxy deployments)

Deep Dive & Mechanics

The vulnerability is in the HTTP parser of AIOHTTP, specifically in the handling of the Range header. The Range header is used by clients to request only a portion of a resource (e.g., for resuming downloads). The parser in vulnerable versions does not properly validate that the characters in the Range header are ASCII decimals. It allows non-ASCII decimal characters (e.g., Unicode digits from other scripts) to be accepted.

In a typical request smuggling attack, an attacker sends a request with a Content-Length header and a Transfer-Encoding header, causing a front-end proxy to interpret the request boundaries differently than the backend. In this case, the non-ASCII characters in the Range header could be used to create a similar discrepancy. For example, a proxy might see a valid Range header and forward the request, while the AIOHTTP parser might interpret the non-ASCII characters as part of a different header or body, leading to a desynchronization of the TCP connection.

The exact exploitation method is not publicly known, but the fix in version 3.13.3 suggests that the parser now strictly rejects any Range header containing non-ASCII decimal characters, closing the potential smuggling vector.

Vulnerable vs. Patched Code

Vulnerable Code (Conceptual):

# In the HTTP parser, the Range header value is parsed without strict ASCII validation.
# Non-ASCII decimal characters (e.g., '١' Arabic-Indic digit one) are accepted.
def parse_range_header(value):
    # No check for non-ASCII characters
    parts = value.split('=')
    # ... further processing

Patched Code (Conceptual):

# In version 3.13.3, the parser now validates that the Range header contains only ASCII digits.
def parse_range_header(value):
    # Reject if any character is not ASCII decimal
    for char in value:
        if ord(char) > 127 or not char.isdigit():
            raise ValueError("Invalid Range header")
    parts = value.split('=')
    # ... further processing

Exploitation & Lab Setup

Red Team

Objective: Demonstrate potential request smuggling using a crafted Range header.

Lab Setup:

  1. Deploy a vulnerable AIOHTTP server (version 3.13.2) behind a reverse proxy (e.g., Nginx).
  2. Use a tool like netcat or curl to send a crafted request.

Exploit Attempt (Conceptual):

# Send a request with a non-ASCII decimal in the Range header
printf "GET / HTTP/1.1\r\nHost: target.com\r\nRange: bytes=0-١\r\n\r\n" | nc target.com 80

Note: The ١ is the Arabic-Indic digit one (U+0661). The proxy might forward this, but the AIOHTTP parser might interpret it differently, potentially causing a desync.

Expected Outcome: The request might be processed incorrectly, potentially allowing the attacker to inject a second request on the same connection.

Blue Team

Objective: Detect and block exploitation attempts.

Detection Strategy:

  • Monitor for Range headers containing non-ASCII characters.
  • Use WAF rules to block requests with unusual characters in headers.
  • Ensure AIOHTTP is updated to version 3.13.3 or later.

Lab Setup:

  1. Deploy a patched AIOHTTP server (version 3.13.3).
  2. Configure a WAF (e.g., ModSecurity) to inspect headers.

WAF Rule (Conceptual):

SecRule REQUEST_HEADERS:Range "!@rx ^[a-zA-Z0-9=,\- ]+$" "id:1001,deny,msg:'Non-ASCII characters in Range header'"

Indicators of Compromise (IOCs)

  • Network IOCs:
    • HTTP requests with Range headers containing non-ASCII characters (e.g., Unicode digits).
    • Unusual HTTP request patterns that suggest request smuggling (e.g., multiple requests on the same connection with mismatched Content-Length and Transfer-Encoding).
  • System IOCs:
    • AIOHTTP server logs showing parsing errors for Range headers.
    • Unexpected cache poisoning or session hijacking events.
  • File IOCs:
    • Presence of aiohttp version < 3.13.3 in Python dependencies.

Detection Engineering

YARA Rule

rule Detect_AIOHTTP_Range_Header_NonASCII {
    meta:
        description = "Detects HTTP requests with non-ASCII characters in the Range header, indicative of CVE-2025-69225 exploitation"
        author = "Valters IT"
        date = "2025-04-10"
        reference = "CVE-2025-69225"
    strings:
        $range_header = /Range:\s*[^\x20-\x7E]/ nocase
    condition:
        $range_header
}

Sigma Rule

title: Potential CVE-2025-69225 Exploitation via Non-ASCII Range Header
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects HTTP requests with non-ASCII characters in the Range header, targeting AIOHTTP servers.
author: Valters IT
date: 2025-04-10
references:
    - https://nvd.nist.gov/vuln/detail/CVE-2025-69225
logsource:
    category: webserver
    product: generic
detection:
    selection:
        cs-method: 'GET'
        cs-uri-stem: '/*'
        cs-headers:
            - 'Range: *[^\x20-\x7E]*'
    condition: selection
falsepositives:
    - Legitimate use of non-ASCII characters in headers (unlikely)
level: medium

Suricata Rule

alert http any any -> any any (msg:"CVE-2025-69225 - Non-ASCII Range Header in AIOHTTP"; flow:to_server; content:"Range|3a|"; nocase; pcre:"/Range:\s*[^\x20-\x7E]/i"; sid:1000001; rev:1;)

Remediation & Mitigation

  1. Immediate Patch: Upgrade AIOHTTP to version 3.13.3 or later.
    pip install aiohttp>=3.13.3
    
  2. Virtual Patching: If immediate upgrade is not possible, deploy a WAF rule to block requests with non-ASCII characters in the Range header.
  3. Network Segmentation: Ensure AIOHTTP servers are not directly exposed to the internet; place them behind a properly configured reverse proxy.
  4. Monitoring: Enable detailed logging of HTTP headers and monitor for anomalies.
  5. Dependency Audit: Regularly scan Python dependencies for known vulnerabilities using tools like pip-audit or safety.

Valters IT

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-69225/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.