CVE-2026-114138: Django REST framework: Accept header with many large quoted parameters burns ~19s of CPU per request in content negotiation
DRF’s content negotiation parses each Accept token several times per request and never limits the number of tokens or their total size. Each parse ends up in Django’s parse_header_parameters, which takes quadratic time when a quoted parameter value is packed with semicolons. On my machine a single GET with a 780KB Accept header made of 96 such tokens kept one gunicorn worker busy for 18.87 seconds (Django 6.1, djangorestframework 3.18.0, gunicorn 26.0.0, Python 3.13, Docker on macOS). The header is syntactically valid, fits inside gunicorn’s default header limits, and needs no authentication. Two concurrent requests, which is one per sync worker, made a default two worker deployment stop answering for my whole 40 second test window. It recovered half a second after I stopped sending.
References
- github.com/advisories/GHSA-33wh-fxxf-88vv
- github.com/encode/django-rest-framework/commit/148ab6523922d5a0c110f76615935e5220b63029
- github.com/encode/django-rest-framework/releases/tag/3.18.2
- github.com/encode/django-rest-framework/security/advisories/GHSA-33wh-fxxf-88vv
- nvd.nist.gov/vuln/detail/CVE-2026-114138
Code Behaviors & Features
Detect and mitigate CVE-2026-114138 with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →