Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend crafted multipart requests to a Request.post() handler
-
DeliveryEach part opens an unbounded temporary file descriptor
-
ExploitRetained descriptors accumulate across requests
-
ExecutionProcess exhausts its file-descriptor limit
-
ImpactService denial (worker can no longer accept connections)
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource consumption limits
MITRE ATT&CK
1 technique across 1 tactic: Impact The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The target application must expose at least one HTTP handler that calls aiohttp's Request.post() to parse multipart/form-data request bodies; this is the exact code path (per-part temporary file creation in web_request.py) that leaks file descriptors. Affected versions are aiohttp from 2 up to but not including 3.14.4. No authentication is required (PR:N) and no user interaction is needed (UI:N), so any internet-facing endpoint meeting the above is reachable by unauthenticated remote attackers. Limiting factors that reduce real-world exposure: the AT:P attack requirement means services that never accept multipart uploads, or that parse bodies without Request.post() (e.g. streaming/multipart reader APIs), are not exploitable; impact is confined to availability of the affected worker process with no data exposure. |
| Impact | This is a genuine but bounded availability risk, best triaged as a medium-high operational priority rather than an emergency. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:N) scores 8.2 and confirms a network-reachable, unauthenticated, low-complexity attack with no user interaction, but the impact is strictly availability (VA:H; VC:N/VI:N/VA via resource exhaustion, CWE-400) - there is no confidentiality or integrity exposure and no scope change to other systems. The single most important mitigating signal is AT:P (attack requirements present): exploitation is only possible against endpoints whose handler actually calls Request.post() to parse multipart bodies, so this is NOT a blanket flaw in every aiohttp deployment. No EPSS score was provided in the input, there is no CISA KEV listing, and no public exploit code was supplied, so exploitation status is: no public exploit identified at time of analysis. Conflicting/missing-data note: EPSS is absent, so probabilistic exploitation likelihood cannot be weighed; the high CVSS (8.2) is driven entirely by easy reachability plus total availability loss, not by breadth of impact, so teams running aiohttp services that accept multipart uploads via Request.post() should patch promptly while those that do not are effectively unaffected. |
| Exploit ScenarioDerived | An unauthenticated attacker repeatedly sends specially crafted multipart/form-data requests - bodies composed of many small file parts - to an aiohttp endpoint whose handler calls Request.post(). Each part causes a temporary file descriptor to be opened and retained, so the descriptors accumulate without bound until the worker process hits its file-descriptor limit and can no longer serve requests, producing a denial of service. No public exploit code was identified in the provided intelligence; the attack is simple to construct given the low complexity (AC:L) and no required authentication (PR:N). |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 19, 2026
Unauthenticated remote attackers can exhaust file descriptors in aiohttp-based web services by sending crafted multipart/form-data requests to any handler that parses bodies with Request.post(), pushing the worker process toward EMFILE and denying service to legitimate clients. The flaw affects aiohttp releases from version 2 up to but not including 3.14.4, and only services that actually accept multipart uploads through that API are exposed; endpoints that never parse multipart bodies, or that use the streaming multipart reader instead, are not exploitable. No public exploit code has been identified at time of analysis and the issue is not listed in CISA KEV, but the attack requires no authentication or user interaction and is straightforward to script, so internet-facing upload endpoints should be prioritized for patching.
RemediationAI
Vendor-released patch: aiohttp 3.14.4 - upgrade with pip install --upgrade 'aiohttp>=3.14.4' (or pin the dependency and rebuild container images), then verify the running version from package metadata; details are in the advisory at https://github.com/aio-libs/aiohttp/security/advisories/GHSA-9xw5-w5jj-pvcg, the fix commit https://github.com/aio-libs/aiohttp/commit/2d94633b7f1b4c1ba07d647b629a8440652b2d09, and the release notes at https://github.com/aio-libs/aiohttp/releases/tag/v3.14.4. If an immediate upgrade is not possible, several compensating controls reduce but do not eliminate exposure: lower client_max_size on the affected application to a small value, which caps descriptors per request at roughly client_max_size // 1 MiB but also rejects legitimate large uploads; replace Request.post() on multipart endpoints with the streaming MultipartReader and enforce explicit per-part and part-count limits, with the trade-off of writing custom parsing code; cap multipart body size and part count at a front-end reverse proxy such as nginx (client_max_body_size) so hostile bodies are rejected before reaching aiohttp, accepting that the proxy limit applies to all traffic; raise RLIMIT_NOFILE / ulimit -n for worker processes, which only buys headroom and delays rather than prevents exhaustion; and recycle workers aggressively (max_requests, periodic restarts) while monitoring file-descriptor counts and EMFILE errors in logs. Note that descriptors are released when request finalization runs, so a sustained flood, rather than a single request, is what drives the process to exhaustion.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
aiohttp is an asyncio-based HTTP client/server framework for Python, and its server-side request object (aiohttp/web_request.py) implements Request.post() to decode application/x-www-form-urlencoded and multipart/form-data bodies into a MultiDict. In the vulnerable implementation, each file part of a multipart body was materialized with tempfile.TemporaryFile, which allocates a real file descriptor on disk per part. Because the number of parts in a multipart body is attacker-controlled and effectively unbounded, a body composed of many tiny parts caused the process to hold one open descriptor per part for the lifetime of the request, exhausting the process file-descriptor limit (CWE-400, uncontrolled resource consumption). The upstream fix switches part buffering to tempfile.SpooledTemporaryFile with a 1 MiB in-memory threshold (_FILE_SPOOL_MAX_SIZE), so small parts never touch disk and descriptors per request are bounded at roughly client_max_size // 1 MiB; it also adds an early check against payload.total_bytes before the read loop and a per-part size check so oversize parts abort with HTTPRequestEntityTooLarge. Because Python's SpooledTemporaryFile only became an io.IOBase subclass in 3.11, the commit adds a small compatibility shim exposing readable/writable/seekable so the documented FileField.file type still holds on older interpreters.
Know when Aiohttp gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Network-reachable, unauthenticated, low-complexity descriptor exhaustion with availability-only impact; the Request.post()/multipart precondition is a deployment prerequisite, not attacker complexity, so AC:L and A:H.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. From 2 until 3.14.4, multipart request processing can retain an unbounded number of open file descriptors. An unauthenticated attacker can consequently exhaust file descriptors with specially crafted multipart requests when a handler uses Request.post(). This issue is fixed in version 3.14.4.
Technical POC Analysis
CWE-400 (Uncontrolled Resource Consumption), with the advisory also tagging CWE-770 (Allocation of Resources Without Limits or Throttling).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A denial-of-service vulnerability in the aiohttp Python web framework (versions 2.x through 3.14.3) lets remote attackers exhaust file descriptors in any service that parses multipart/form-data uploads through the Request.post() API, driving worker processes to EMFILE and cutting off legitimate users. Leadership should care because the exposed surface is typically customer-facing file upload functionality, the attack is simple to script, and remediation requires a framework upgrade that may ripple across many internal applications and their dependency chains. No public exploit code or CISA KEV listing exists at time of analysis, so this is a manageable-but-urgent engineering hygiene issue rather than an active incident.
Apply vendor patch: upgrade aiohttp to 3.14.4 or later. Where upgrade cannot be completed immediately, restrict or disable multipart parsing on internet-facing endpoints, front upload paths with a reverse proxy or WAF enforcing strict request-body size and rate limits, refactor exposed handlers to the streaming multipart reader, lower per-process file descriptor limits and worker concurrency to contain EMFILE blast radius, and alert on descriptor-exhaustion metrics.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Rated high severity (CVSS 7.5), this vul
aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Rated high severity (CVSS 7.5), this vul
Out-of-bounds heap read in aiohttp's C HTTP response parser (versions ≤ 3.14.2) allows an attacker-controlled server to
Uncontrolled decompression in aiohttp's WebSocket client prior to version 3.14.2 allows a malicious server to exhaust CP
aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Rated medium severity (CVSS 6.5), this v
HTTP request smuggling in aiohttp's server-side parser allows unauthenticated remote attackers to inject and misdirect H
AIOHTTP 3.8.1 can report a "ValueError: Invalid IPv6 URL" outcome, which can lead to a Denial of Service (DoS). Rated me
aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Rated medium severity (CVSS 5.3), this v
aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Rated medium severity (CVSS 5.3), this v
aiohttp is an asynchronous HTTP client/server framework for asyncio and Python. Rated high severity (CVSS 8.7), this vul
Idle or half-open connections to aiohttp server deployments at version 3.14.3 and earlier are never timed out during the
AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Versions 3.13.2 and below allow a zip bo
EUVD-2026-104482
GHSA-9xw5-w5jj-pvcg
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB