CVE-2025-69228
High · 7.5AIOHTTP vulnerable to denial of service through large payloads
CVSS
7.5
EPSS
0.4%
Published
Jan 5, 2026
CISA due date
—
Cloudanix analysis
A malicious web request can make affected aiohttp-based services run out of memory and stop responding.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Web Framework
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The flaw allows a remote client to send a specially crafted HTTP request to an aiohttp-based server that causes memory consumption to grow without adequate bounds during request processing. Successful exploitation can exhaust process or host memory, trigger Python MemoryError exceptions, invoke the Linux out-of-memory killer, crash worker processes, or make the service unresponsive. The impact is denial of service rather than code execution or data disclosure based on the available advisory details.
Why it matters to the business
Publicly reachable services built with vulnerable aiohttp versions can be taken offline by malicious or malformed traffic, causing application outages, failed API calls, degraded customer experience, and possible cascading failures in dependent services. The CVSS score is high at 7.5, but the currently reported EPSS is low and there is no known CISA KEV listing or ransomware association, so remediation should be prioritized for internet-facing and business-critical aiohttp services rather than treated as confirmed active mass exploitation.
How an attack unfolds
An attacker first identifies an HTTP service implemented with a vulnerable aiohttp release, commonly through service fingerprinting, response behavior, dependency knowledge, or probing application endpoints. The attacker then sends one or more crafted requests that trigger the vulnerable request-processing path. During parsing or handling, the server allocates memory in an uncontrolled way and does not release it quickly enough to remain stable. Repeated requests or concurrent connections can increase memory pressure until the aiohttp process slows, raises allocation failures, is terminated by the operating system, or causes the host/container to become resource-starved. The attacker does not need valid credentials if the vulnerable endpoint is reachable before authentication or if request parsing occurs prior to application-level authorization.
How to fix it
Upgrade affected aiohttp packages to a fixed release or vendor package containing the upstream fix. For Debian 12 and Debian 13 systems using the affected packaged component, update to version 5.18.5-1 or later as provided by the distribution. For source or Git-based aiohttp deployments, ensure the code includes upstream commit 41f01ed680b7efc8f97677df45731b80328aad6c or a later release containing that fix. Rebuild and redeploy containers, virtual environments, and application bundles that vendor or pin aiohttp. As compensating controls, enforce request size limits at a reverse proxy or load balancer, configure header/body/time limits, apply connection and per-IP rate limiting, set container or service memory limits with safe restart policies, and isolate critical services so one exhausted worker cannot starve unrelated workloads.
How to confirm the fix worked
Inventory running applications and images for aiohttp, including Python virtual environments, lockfiles, SBOMs, container layers, and distribution packages. Confirm the installed Debian package version is 5.18.5-1 or later where applicable, or that source builds contain commit 41f01ed680b7efc8f97677df45731b80328aad6c or a later fixed release. Validate that redeployed services are actually running the patched dependency by checking runtime package metadata, not only repository manifests. Perform controlled negative testing in a non-production environment using malformed and boundary-size HTTP requests while monitoring process resident memory, container memory, request latency, and crash/restart behavior. Confirm reverse proxy request limits, rate limits, and timeout settings reject abusive requests before they reach aiohttp.
Typical attack path
- Discover an HTTP service that appears to use aiohttp or a downstream package using aiohttp.
- Confirm the service accepts externally supplied HTTP requests to vulnerable request-processing paths.
- Send a crafted malformed or oversized request pattern that triggers excessive memory allocation in aiohttp.
- Repeat the request or open concurrent connections to accelerate memory exhaustion.
- Observe increased latency, connection failures, worker restarts, container restarts, or HTTP 5xx responses as the service becomes unavailable.
- Continue traffic to keep the service degraded until patched, rate-limited, restarted, or otherwise protected.
How to detect it
To determine whether exploitation may have already occurred, review web server, reverse proxy, aiohttp application, container runtime, system, and orchestration logs for time-correlated memory exhaustion and malformed request activity. Focus on unexplained spikes in process RSS/container memory, sudden worker exits, Python MemoryError exceptions, kernel OOM-killer events, pod or container restarts, and bursts of 4xx/5xx responses from the same source networks. In aiohttp access logs and upstream proxy logs, look for repeated unusual requests with very large headers or bodies, abnormal transfer encodings, incomplete requests, long request durations, high concurrency from a small number of IPs, and requests rejected due to size or header limits. Because no public exploit-specific payload indicator is provided, treat detection as behavioral: correlate abnormal request patterns with resource exhaustion events affecting aiohttp processes.
- MemoryError
- Cannot allocate memory
- Out of memory
- oom-killer
- Killed process
- invoked oom-killer
- Container killed due to memory usage
- OOMKilled
- ExitCode: 137
- RestartCount
- aiohttp.server
- aiohttp.access
- aiohttp.web_protocol
- asyncio.exceptions
- ConnectionResetError
- BadStatusLine
- LineTooLong
- Request Entity Too Large
- HTTP 413
- HTTP 414
- HTTP 431
- HTTP 500
- HTTP 502
- HTTP 503
What your security team should do
- Prioritize patching internet-facing, unauthenticated, and high-traffic aiohttp services first.
- Search application repositories, dependency lockfiles, container images, and host package inventories for vulnerable aiohttp installations.
- Update Debian 12 and Debian 13 packages to 5.18.5-1 or later, and update source-based deployments to include commit 41f01ed680b7efc8f97677df45731b80328aad6c or a later fixed release.
- Rebuild and redeploy all containers and serverless/application artifacts that bundle aiohttp rather than relying only on host-level package updates.
- Place aiohttp services behind reverse proxies or gateways with strict request body, header, timeout, connection, and per-client rate limits.
- Add monitoring and alerting for abnormal memory growth, worker restarts, OOM kills, spikes in HTTP 400/413/414/431/500/502/503 responses, and unusual request concurrency.
- Review recent logs for signs of memory exhaustion or repeated malformed request traffic, especially against public endpoints.
- Document compensating controls and schedule permanent dependency upgrades where immediate patching is blocked.
The record
A request can be crafted in such a way that an aiohttp server's memory fills up uncontrollably during processing.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | aiohttp | 0 | 3.13.3 |
| Chainguard | airflow-2 | 0 | 2.11.0-r19 |
| Chainguard | airflow-2-bitnami-compat | 0 | 2.11.0-r19 |
| Chainguard | airflow-2-compat | 0 | 2.11.0-r19 |
| Chainguard | airflow-2-iamguarded-compat | 0 | 2.11.0-r19 |
| Chainguard | airflow-3-compat | 0 | 3.1.5-r1 |
| Chainguard | airflow-3-iamguarded-compat | 0 | 3.1.5-r1 |
| Chainguard | airflow-core-2 | 0 | 2.11.0-r11 |
| Chainguard | airflow-core-2-compat | 0 | 2.11.0-r10 |
| Chainguard | airflow-core-2-oci-entrypoint | 0 | 2.11.0-r10 |
| Chainguard | apache-beam-python-3.11-sdk | 0 | 2.70.0-r1 |
| Chainguard | authentik | 0 | 2025.10.3-r3 |
| Chainguard | authentik-fips | 0 | 2025.10.3-r1 |
| Chainguard | authentik-go-server | 0 | 2025.10.3-r3 |
| Chainguard | authentik-go-server-fips | 0 | 2025.10.3-r0 |
| Chainguard | awx | 0 | 24.6.1-r23 |
| Chainguard | checkov | 0 | 3.2.499-r0 |
| Chainguard | dask-kubernetes | 0 | 2025.7.0-r4 |
| Chainguard | gitaly-config-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitaly-config-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitaly-config-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-base-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-base-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-base-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-base-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-base-fips-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-base-fips-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-certificates-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-certificates-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-certificates-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-cfssl-self-sign-scripts-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-cfssl-self-sign-scripts-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-cfssl-self-sign-scripts-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-cng-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-cng-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-cng-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-cng-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-cng-fips-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-cng-fips-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-container-registry-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-container-registry-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-container-registry-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-container-registry-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-container-registry-fips-18.6 | 0 | 18.6.2-r1 |
| Chainguard | gitlab-container-registry-fips-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-container-registry-scripts-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-container-registry-scripts-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-container-registry-scripts-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-exporter-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-exporter-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-exporter-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-exporter-scripts-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-exporter-scripts-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-exporter-scripts-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-gitaly-scripts-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-gitaly-scripts-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-gitaly-scripts-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-logger-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-logger-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-logger-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-logger-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-logger-fips-18.6 | 0 | 18.6.2-r1 |
| Chainguard | gitlab-logger-fips-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-pages-scripts-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-pages-scripts-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-pages-scripts-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-rails-scripts-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-rails-scripts-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-rails-scripts-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-rails-scripts-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-rails-scripts-fips-18.6 | 0 | 18.6.2-r1 |
| Chainguard | gitlab-rails-scripts-fips-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-shell-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-shell-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-shell-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-shell-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-shell-fips-18.6 | 0 | 18.6.2-r1 |
| Chainguard | gitlab-shell-fips-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-shell-scripts-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-shell-scripts-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-shell-scripts-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-sidekiq-ce-18.5 | 0 | 18.5.4-r0 |
| Chainguard | gitlab-sidekiq-ce-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-sidekiq-ce-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-sidekiq-ce-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-sidekiq-ce-fips-18.6 | 0 | 18.6.2-r1 |
| Chainguard | gitlab-sidekiq-ce-fips-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-toolbox-ce-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-toolbox-ce-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-toolbox-ce-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-toolbox-ce-fips-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-toolbox-ce-fips-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-toolbox-ce-fips-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-webservice-ce-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-webservice-ce-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-webservice-ce-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-webservice-ce-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-webservice-ce-fips-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-webservice-ce-fips-18.7 | 0 | 18.7.1-r0 |
| Chainguard | gitlab-workhorse-scripts-18.5 | 0 | 18.5.5-r0 |
| Chainguard | gitlab-workhorse-scripts-18.6 | 0 | 18.6.2-r0 |
| Chainguard | gitlab-workhorse-scripts-18.7 | 0 | 18.7.0-r0 |
| Chainguard | gitlab-workhorse-scripts-fips-18.5 | 0 | 18.5.4-r1 |
| Chainguard | gitlab-workhorse-scripts-fips-18.6 | 0 | 18.6.3-r0 |
| Chainguard | gitlab-workhorse-scripts-fips-18.7 | 0 | 18.7.0-r0 |
| Chainguard | kubeflow-pipelines-visualization-server | 0 | 2.15.0-r1 |
| Chainguard | open-webui | 0 | 0.6.43-r1 |
| Chainguard | open-webui-compat | 0 | 0.6.43-r0 |
| Chainguard | py3-cassandra-medusa | 0 | 0.26.0-r3 |
| Chainguard | py3-cassandra-medusa-compat | 0 | 0.26.0-r2 |
| Chainguard | py3-cassandra-medusa-compat | 0 | 0.26.0-r3 |
| Chainguard | py3-vllm-cuda-12.4 | 0 | 0.13.0-r1 |
| Chainguard | py3.10-vllm-cuda-12.4 | 0 | 0.16.0-r1 |
| Chainguard | py3.11-text-generation-inference | 0 | 3.3.7-r2 |
| Chainguard | py3.12-vllm-cuda-12.4 | 0 | 0.16.0-r1 |
| Chainguard | request-1276 | 0 | 0.27.0-r1 |
| Chainguard | request-1276-compat | 0 | 0.27.0-r1 |
| Chainguard | text-generation-inference | 0 | 3.3.7-r2 |
| Chainguard | text-generation-inference-compat | 0 | 3.3.7-r2 |
| Chainguard | tritonserver-backend-vllm-cuda-12.9 | 0 | 25.9.0_git20251112-r7 |
| Chainguard | tritonserver-backend-vllm-meta-cuda-12.9 | 0 | 25.9.0_git20251112-r4 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP4 | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Server 15 SP4-LTSS | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Server 15 SP5-LTSS | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Server 15 SP6-LTSS | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP4 | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP5 | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP6 | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| Wolfi | airflow-3-compat | 0 | 3.1.5-r1 |
| Wolfi | airflow-3-iamguarded-compat | 0 | 3.1.5-r1 |
| Wolfi | checkov | 0 | 3.2.499-r0 |
| Wolfi | dask-kubernetes | 0 | 2025.7.0-r4 |
| Wolfi | kubeflow-pipelines-visualization-server | 0 | 2.15.0-r1 |
| Wolfi | open-webui | 0 | 0.6.43-r1 |
| Wolfi | open-webui-compat | 0 | 0.6.43-r0 |
| Wolfi | py3-cassandra-medusa | 0 | 0.26.0-r3 |
| Wolfi | py3-cassandra-medusa-compat | 0 | 0.26.0-r2 |
| Wolfi | py3-cassandra-medusa-compat | 0 | 0.26.0-r3 |
| openSUSE:Leap 15.6 | python-aiohttp | 0 | 3.9.3-150400.10.36.1 |
| openSUSE:Leap 16.0 | python-Brotli | 0 | 1.1.0-160000.3.1 |
| openSUSE:Leap 16.0 | python-aiohttp | 0 | 3.11.16-160000.3.1 |
| openSUSE:Tumbleweed | python-aiohttp | 0 | 3.13.3-1.1 |
Related vulnerabilities
- CVE-2025-69229 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects aiohttp
- CVE-2025-69223 AIOHTTP's HTTP Parser auto_decompress feature is vulnerable to zip bomb Also affects aiohttp
- CVE-2025-69224 AIOHTTP's unicode processing of header values could cause parsing discrepancies Also affects aiohttp
- CVE-2025-69226 AIOHTTP vulnerable to brute-force leak of internal static file path components Also affects aiohttp
- CVE-2025-69225 AIOHTTP has unicode match groups in regexes for ASCII protocol elements Also affects aiohttp
- CVE-2025-69230 AIOHTTP Vulnerable to Cookie Parser Warning Storm Also affects aiohttp
- CVE-2025-69227 AIOHTTP vulnerable to DoS when bypassing asserts Also affects aiohttp
- CVE-2025-53643 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects aiohttp