AIOHTTP Side-Channel: When 403 Means 'I See You'
Vulnerability ID: CVE-2025-69226
CVSS Score: 6.3
Published: 2026-01-05
A logic flaw in AIOHTTP's static file serving mechanism allows attackers to map the server's internal filesystem. By exploiting differences in error codes (403 vs 404) during path normalization, adversaries can enumerate sensitive files outside the web root.
TL;DR
AIOHTTP versions prior to 3.13.3 contain a side-channel vulnerability in web.static(). The framework checked path prefixes before normalizing them, creating an oracle where attackers can distinguish between existing and non-existing files on the host system. If you get a 403, the file exists; if you get a 404, it doesn't. Upgrade to 3.13.3 immediately.
⚠️ Exploit Status: POC
Technical Details
- CWE ID: CWE-22 (Path Traversal)
- CWE ID: CWE-200 (Information Exposure)
- Attack Vector: Network (CVSS: AV:N)
- CVSS v4.0: 6.3 (Medium)
- Impact: Information Disclosure (Filesystem Enumeration)
- Exploit Status: PoC Available / Functional Exploit
- Patch Status: Fixed in 3.13.3
Affected Systems
- Python applications using aiohttp <= 3.13.2
- Systems exposing
web.static()routes to the public internet -
aiohttp: <= 3.13.2 (Fixed in:
3.13.3)
Code Analysis
Commit: f2a86fd
Fix static resource normalization to prevent side-channel information disclosure
async def resolve(self, request: Request) -> _Resolve:
- path = request.rel_url.path_safe
+ path = request.rel_url.path_safe
+ norm_path = os.path.normpath(path)
Exploit Details
- Researcher Analysis: Path traversal via normalization logic in web_urldispatcher.py allows enumeration of existing files via 403/404 oracle.
Mitigation Strategies
- Upgrade AIOHTTP to version 3.13.3 or later.
- Disable
web.static()in production environments. - Use a reverse proxy (Nginx/Apache) to serve static content.
- Implement WAF rules to block path traversal patterns (
../,//).
Remediation Steps:
- Identify all instances of
web.static()usage in your codebase. - Update the
aiohttpdependency inrequirements.txt. - Deploy the updated application.
- Verify the fix by attempting to access
/static/../../etc/passwd(should return 404, not 403).
References
Read the full report for CVE-2025-69226 on our website for more details including interactive diagrams and full exploit analysis.
Top comments (0)