CVE-2025-69227
High · 7.5AIOHTTP vulnerable to DoS when bypassing asserts
CVSS
7.5
EPSS
0.4%
Published
Jan 5, 2026
CISA due date
—
Cloudanix analysis
A specially crafted web request can cause affected services to hang, making websites or APIs slow or unavailable.
- 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 can cause an affected HTTP request-processing component to enter an infinite loop while parsing or processing a POST request body when expected assertion checks are bypassed. At a technical level, a crafted or malformed POST body can tie up the worker, event loop, thread, or process responsible for handling the request, consuming CPU and preventing timely processing of legitimate traffic. The primary impact is denial of service rather than data theft or code execution.
Why it matters to the business
Successful exploitation can make applications or services that rely on the affected aiohttp/Debian-packaged components slow, unresponsive, or intermittently unavailable. Public-facing APIs, web services, webhook receivers, and internal automation endpoints that accept POST requests are the most relevant business exposures. The CVSS score indicates meaningful availability risk, but the low EPSS score, absence from the CISA KEV catalog, and no known exploit maturity suggest lower current likelihood of widespread exploitation; remediation should still be prioritized for internet-facing and business-critical services.
How an attack unfolds
An attacker identifies an application or service that accepts HTTP POST requests and uses an affected version of the vulnerable request-processing code. The attacker then sends a specially formed POST body that reaches the vulnerable parsing path after assertion checks are bypassed or unavailable in the runtime/build configuration. Instead of rejecting the malformed request or completing parsing, the vulnerable component loops indefinitely. Repeating the request or sending it concurrently can exhaust available workers, event-loop capacity, or CPU, causing elevated latency, request timeouts, failed health checks, and service unavailability. No authentication may be required if the vulnerable POST endpoint is publicly reachable, although exploitation depends on the vulnerable code path being exposed.
How to fix it
Upgrade affected components to fixed versions. For Debian 11, apply packages fixed in version 5.10.113-1 or later as provided by the distribution. For Debian 12 and Debian 13, apply packages fixed in version 5.17.3-1 or later as provided by the distribution. For aio-libs/aiohttp from Git, update to commit 41f01ed680b7efc8f97677df45731b80328aad6c or a later release containing that fix. Rebuild and redeploy dependent applications after updating libraries or base images. Where immediate patching is not possible, reduce exposure by placing vulnerable POST endpoints behind authentication, rate limiting, request body size limits, reverse proxy timeouts, WAF/body validation rules, and autoscaling/worker recycling controls. Mitigations should not be treated as equivalent to patching because a valid-looking POST may still reach the vulnerable parser.
How to confirm the fix worked
Confirm the deployed package, container image, or application dependency version is at or above the fixed version for the relevant platform. For source-based aiohttp deployments, verify the fix commit 41f01ed680b7efc8f97677df45731b80328aad6c or a later containing release is present in the build. Regenerate dependency lockfiles and software bills of materials, then verify production artifacts match the patched build rather than only the source repository. Run regression tests that submit malformed, truncated, oversized, and boundary-condition POST bodies and confirm requests fail quickly with controlled 4xx/5xx responses rather than hanging. Monitor CPU, event-loop latency, request duration, worker saturation, and HTTP timeout rates after deployment to confirm the denial-of-service condition is no longer reproducible.
Typical attack path
- Identify web applications, APIs, or services running affected aiohttp/Debian-packaged versions that accept HTTP POST requests.
- Probe reachable POST endpoints with malformed or unusual request bodies to determine whether request handling stalls or CPU usage spikes.
- Send a crafted POST body that triggers the vulnerable infinite-loop condition during body processing.
- Repeat or parallelize requests to occupy workers, event loops, or CPU cores.
- Sustain traffic until legitimate users experience timeouts, degraded performance, or service outage.
How to detect it
To assess whether exploitation may already have occurred, review reverse proxy, load balancer, WAF, application, and host telemetry for availability symptoms correlated with POST traffic. Focus on periods with sudden CPU spikes, event-loop lag, worker exhaustion, request queues, health-check failures, or elevated 5xx/timeout responses without a corresponding increase in normal business traffic. In HTTP access logs, look for bursts of POST requests with unusually long request durations, incomplete uploads, abnormal body sizes, repeated requests to the same endpoint from a small set of source IPs, or connections terminated by the client or upstream timeout. In application logs, look for request parsing stalls, body read timeouts, cancelled handlers, worker restarts, watchdog kills, or process supervisor restarts. Host-level artifacts may include sustained high CPU in application worker processes, low throughput despite high utilization, container restarts, outlier request latency, and autoscaling events. Because no public exploit payload or stable wire-level signature is provided, detection should be behavior-based rather than relying on a single payload string.
What your security team should do
- Prioritize patching internet-facing services and high-volume APIs that accept unauthenticated or semi-authenticated POST requests.
- Inventory applications, containers, and base images using affected Debian packages or aiohttp builds, including transitive dependencies and vendored copies.
- Apply the fixed Debian versions or aiohttp commit/release, then redeploy all dependent services rather than only updating the build host.
- Temporarily enforce rate limits, request body size limits, upstream timeouts, and worker recycling on exposed POST endpoints until patching is complete.
- Add monitoring for sudden increases in long-running POST requests, CPU saturation, event-loop lag, HTTP 408/499/500/502/503/504 responses, and health-check failures.
- Review access logs and application telemetry for unexplained bursts of malformed POST traffic or requests that do not complete normally.
- Because this vulnerability is not currently listed in CISA KEV and has low EPSS, handle it through risk-based patching, but escalate urgency for critical public APIs or environments with strict availability requirements.
The record
When assert statements are bypassed, an infinite loop can occur, resulting in a DoS attack when processing a POST body.
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-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-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-69228 AIOHTTP vulnerable to denial of service through large payloads Also affects aiohttp
- CVE-2025-69230 AIOHTTP Vulnerable to Cookie Parser Warning Storm Also affects aiohttp
- CVE-2025-53643 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects aiohttp