CVE-2026-34514
Medium · 5.3CVSS
5.3
EPSS
0.4%
Published
Apr 1, 2026
CISA due date
—
Cloudanix analysis
Some Python web applications may let attackers sneak extra response instructions into web traffic unless the aiohttp dependency is updated.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Data Tampering
- Component
- Library
- Class
- Improper Input Validation
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Aiohttp versions prior to 3.13.4 improperly validate the attacker-controlled content_type parameter when constructing HTTP responses or multipart/form-data content. If an application passes untrusted input into this parameter, an attacker may inject carriage-return/line-feed sequences or other header-delimiting characters that cause aiohttp to emit unintended additional HTTP headers. The primary technical consequence is limited integrity impact: response metadata can be modified, security headers can potentially be weakened or overridden, and downstream clients or proxies may interpret attacker-supplied headers as legitimate.
Why it matters to the business
Applications using vulnerable aiohttp versions may allow attackers to tamper with HTTP response headers, which can undermine browser protections, affect caching behavior, alter redirects or cookies in some application patterns, and create trust issues for APIs or web services. The issue is network-exploitable without authentication, but currently has low EPSS, no known CISA KEV listing, no ransomware association, and no public exploit maturity reported, so it should be prioritized as a routine but timely dependency update rather than an emergency unless untrusted users can directly influence content_type values.
How an attack unfolds
An attacker first identifies an aiohttp-based endpoint or workflow where user-controlled input is passed into a content_type parameter, such as a file download, generated response, multipart upload handling path, or API that reflects caller-selected media types. The attacker supplies a crafted content_type value containing header separators or malformed header syntax. In vulnerable aiohttp versions, insufficient validation allows that value to influence the generated HTTP header block beyond the intended Content-Type header. The resulting response may include extra attacker-controlled headers or altered header semantics. Depending on the surrounding application and client behavior, this may enable response header manipulation, cache poisoning conditions, cookie/header confusion, weakened browser security controls, or other application-specific impacts.
How to fix it
Upgrade aiohttp to version 3.13.4 or later wherever it is used directly or transitively. If immediate upgrade is not possible, ensure applications never pass untrusted input directly into content_type parameters; validate media types against a strict allowlist such as application/json, text/plain, text/html, image/png, or other explicitly required values. Reject or normalize any content_type containing control characters, carriage returns, line feeds, percent-encoded newline sequences, semicolons used unexpectedly, or nonstandard header syntax. Rebuild and redeploy affected services after dependency updates, and verify lockfiles, container images, serverless packages, and vendored dependencies no longer include vulnerable aiohttp releases.
How to confirm the fix worked
Confirm the installed aiohttp version is 3.13.4 or later using package inventory, lockfile review, container image scanning, or runtime checks such as `python -m pip show aiohttp`. Review dependency manifests including requirements.txt, pyproject.toml, poetry.lock, Pipfile.lock, conda environment files, and SBOMs for aiohttp versions earlier than 3.13.4. Test exposed endpoints that accept or derive response media types from user input by sending benign invalid content_type values containing encoded newline patterns and confirm the application rejects them or safely normalizes them rather than emitting additional response headers. Validate that CI dependency scanning and software composition analysis policies flag aiohttp below 3.13.4.
Typical attack path
- Discover an application or API built on aiohttp prior to version 3.13.4.
- Find a route where the requester can influence a content_type value used by aiohttp response or multipart generation code.
- Send a request with a crafted content_type containing encoded or literal header delimiters, malformed media-type parameters, or newline characters.
- Cause the vulnerable aiohttp code to serialize the crafted value into an HTTP response header.
- Observe whether extra headers are emitted, existing response behavior changes, or downstream clients/proxies interpret attacker-controlled header content.
- Chain the header injection with application-specific behavior such as cache manipulation, security-header bypass, cookie confusion, or client-side abuse.
How to detect it
Review application logs, reverse proxy logs, WAF logs, and HTTP access logs for requests that manipulate content type, format, media type, download type, or multipart-related parameters with newline characters or encoded control characters. Look for payloads containing literal CRLF sequences, `%0d%0a`, `%0a`, `%0d`, double-encoded variants, or injected header names following a media type. Inspect response logs, proxy captures, CDN logs, and forensic packet captures for unexpected duplicate or attacker-controlled response headers, especially Set-Cookie, Location, Content-Length, Transfer-Encoding, Cache-Control, Content-Security-Policy, Access-Control-Allow-Origin, and X-Accel-Redirect. In Python application telemetry, look for exceptions or debug logs involving aiohttp response construction, invalid content types, multipart writers, or header serialization around suspicious requests. Because no specific public exploit maturity or named threat actor activity is reported, focus detection on generic header-injection behavior rather than actor-specific infrastructure.
- %0d%0aSet-Cookie:
- %0d%0aLocation:
- %0d%0aContent-Length:
- %0d%0aTransfer-Encoding:
- %0d%0aCache-Control:
- %0d%0aContent-Security-Policy:
- %0d%0aAccess-Control-Allow-Origin:
- %0aSet-Cookie:
- %0aLocation:
- %0aContent-Length:
- %250d%250aSet-Cookie:
- %250d%250aLocation:
- \r\nSet-Cookie:
- \r\nLocation:
- \r\nContent-Length:
- \r\nTransfer-Encoding:
- content_type=
- Content-Type: text/html\r\n
- aiohttp<3.13.4
What your security team should do
- Inventory all Python services, containers, and build artifacts using aiohttp and identify versions earlier than 3.13.4.
- Prioritize upgrades for internet-facing aiohttp services and endpoints where users can influence response content types, download formats, upload metadata, or multipart processing.
- Update aiohttp to 3.13.4 or later and redeploy immutable artifacts so runtime environments are not still using an older bundled package.
- Add strict allowlist validation for any application-level content_type or media-type input, even after upgrading.
- Search web access logs and application logs for content_type or header values containing CRLF characters, percent-encoded newline sequences, or attempts to inject headers such as Set-Cookie, Location, Content-Length, Transfer-Encoding, or Cache-Control.
- Add regression tests that verify user-supplied media types cannot produce additional HTTP response headers.
- Monitor dependency advisories because the vulnerability is 131 days old and may become easier to exploit if proof-of-concept details are later published.
The record
AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Prior to version 3.13.4, an attacker who controls the content_type parameter in aiohttp could use this to inject extra headers or similar exploits. This issue has been patched in version 3.13.4.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Chainguard | airflow-core-2 | 0 | 2.11.2-r3 |
| Chainguard | awx | 0 | 24.6.1-r33 |
| Chainguard | checkov | 0 | 3.2.517-r0 |
| Chainguard | datahub-ingestion-fips | 0 | 1.5.0.1-r1 |
| Chainguard | keep-api | 0 | 0.51.0-r2 |
| Chainguard | keep-api-fips | 0 | 0.51.0-r2 |
| Chainguard | metaflow-service-fips | 0 | 2.5.0-r2 |
| Wolfi | checkov | 0 | 3.2.517-r0 |
| openSUSE:Leap 16.0 | python-aiohttp | 0 | 3.11.16-160000.5.1 |
| openSUSE:Tumbleweed | python-aiohttp | 0 | 3.13.5-2.1 |
Related vulnerabilities
- CVE-2026-34519 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow-core-2
- CVE-2026-34518 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow-core-2
- CVE-2026-34520 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow-core-2
- CVE-2026-34517 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow-core-2
- CVE-2026-34515 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow-core-2
- CVE-2026-22815 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects airflow-core-2
- CVE-2026-34073 cryptography is a package designed to expose cryptographic primitives and recipes to… Also affects airflow-core-2
- CVE-2026-25645 Requests is a HTTP library. Also affects airflow-core-2