CVE-2016-7401
High · 7.5CVSS
7.5
EPSS
5.7%
Published
Oct 3, 2016
CISA due date
—
Cloudanix analysis
A flaw in a popular web framework could allow an attacker to trick a user's browser into performing unauthorized actions on a vulnerable website without their knowledge.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Data Tampering
- Component
- Web Framework
- Class
- CSRF
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The vulnerability exists in the cookie parsing code of affected Django versions. An attacker can craft a special cookie, such as a Google Analytics cookie, containing a semicolon. The vulnerable parser incorrectly splits this value, treating it as two separate cookies. This allows the attacker to inject a cookie of their choosing, which can be used to bypass the Cross-Site Request Forgery (CSRF) protection mechanism, leading to a loss of integrity.
Why it matters to the business
An attacker can exploit this flaw to trick an authenticated user's web browser into performing unauthorized actions on a vulnerable application. This could include modifying or deleting user data, changing account settings like email or password, or performing fraudulent transactions on the user's behalf. Successful exploitation can lead to account takeover, reputational damage, and loss of user trust in the platform.
How an attack unfolds
An attacker first identifies a target website running a vulnerable version of Django that also uses Google Analytics. The attacker then crafts a malicious webpage or link and tricks a logged-in user of the target site into visiting it. When the user's browser accesses the malicious content, it triggers a cross-site request to the vulnerable application. This request includes a specially crafted cookie value (e.g., for a Google Analytics cookie) that contains a semicolon followed by a fake CSRF token. The vulnerable Django server mis-parses the cookie, accepts the fake CSRF token, and executes the forged request as if it were a legitimate action initiated by the user.
How to fix it
To remediate this vulnerability, upgrade Django to a patched version. For projects using Django 1.8.x, upgrade to version 1.8.15 or later. For projects using Django 1.9.x, upgrade to version 1.9.10 or later. If you are using a downstream product that bundles Django, such as the Kubernetes Dashboard, you must upgrade the product to a version that includes the fixed Django library, for example, version 2.7.0-r2 or newer for Kubernetes Dashboard.
How to confirm the fix worked
To validate the fix, inspect your application's dependencies to ensure it is running a non-vulnerable version of Django (1.8.15+ or 1.9.10+). You can also perform a security test by attempting to send a request to the application with a cookie containing a semicolon in its value (e.g., `Cookie: testcookie=value;fake=token`). A patched system should correctly handle or reject the malformed cookie and not allow a CSRF bypass.
Typical attack path
- An attacker identifies a target application using a vulnerable version of the Django framework and Google Analytics.
- The attacker crafts a malicious link or webpage containing a payload that forges a request to the target application.
- The attacker tricks an authenticated user of the target application into clicking the link or visiting the malicious page.
- The user's browser sends a cross-site request to the vulnerable application, including a malformed cookie that injects a fake CSRF token.
- The application's server incorrectly parses the cookie, validates the fake CSRF token, and executes the unauthorized action on behalf of the user.
How to detect it
To detect potential exploitation, security teams should analyze web server access logs (e.g., Nginx, Apache) and Web Application Firewall (WAF) logs. Look for HTTP requests where the `Cookie` header contains a value with an unencoded semicolon, particularly within cookies associated with Google Analytics (e.g., `__utmz`, `__utma`). Such a pattern is anomalous and is the primary indicator of an attempt to exploit this parsing vulnerability. Correlate findings with unexpected state-changing actions (POST, PUT, DELETE requests) from legitimate user accounts.
- __utmz=.*;
- __utma=.*;
- __utmb=.*;
- __utmc=.*;
What your security team should do
- Immediately patch all applications using vulnerable Django versions, prioritizing public-facing and critical systems.
- Use dependency analysis tools or review software bills of materials (SBOMs) to identify all instances of vulnerable Django versions across the organization.
- Review web application firewall (WAF) and web server logs for HTTP requests containing cookies with semicolons in their values, which may indicate exploitation attempts.
The record
The cookie parsing code in Django before 1.8.15 and 1.9.x before 1.9.10, when used on a site with Google Analytics, allows remote attackers to bypass an intended CSRF protection mechanism by setting arbitrary cookies.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | django | 0 | 1.8.15 |
| PyPI | django | 1.9 | 1.9.10 |
| Debian:10 | python-django | 0 | 1:1.10-1 |
| Debian:11 | python-django | 0 | 1:1.10-1 |
| Debian:12 | python-django | 0 | 1:1.10-1 |
| Debian:13 | python-django | 0 | 1:1.10-1 |
| Debian:7 | python-django | 0 | 1.4.22-1+deb7u1 |
| Debian:8 | python-django | 0 | 1.7.11-1+deb8u1 |
| Mageia:5 | python-django | 0 | 1.8.15-1.mga5 |
| Red Hat:openstack:5::el6 | python-django | 0 | 0:1.6.11-6.el6ost |
| Red Hat:openstack:5::el6 | python-django-bash-completion | 0 | 0:1.6.11-6.el6ost |
| Red Hat:openstack:5::el6 | python-django-doc | 0 | 0:1.6.11-6.el6ost |
| Red Hat:openstack:5::el7 | python-django | 0 | 0:1.6.11-6.el7ost |
| Red Hat:openstack:5::el7 | python-django-bash-completion | 0 | 0:1.6.11-6.el7ost |
| Red Hat:openstack:5::el7 | python-django-doc | 0 | 0:1.6.11-6.el7ost |
| Red Hat:openstack:6::el7 | python-django | 0 | 0:1.6.11-6.el7ost |
| Red Hat:openstack:6::el7 | python-django-bash-completion | 0 | 0:1.6.11-6.el7ost |
| Red Hat:openstack:6::el7 | python-django-doc | 0 | 0:1.6.11-6.el7ost |
| Red Hat:openstack:7::el7 | python-django | 0 | 0:1.8.15-1.el7ost |
| Red Hat:openstack:7::el7 | python-django-bash-completion | 0 | 0:1.8.15-1.el7ost |
| Red Hat:openstack:7::el7 | python-django-doc | 0 | 0:1.8.15-1.el7ost |
| Red Hat:openstack:8::el7 | python-django | 0 | 0:1.8.15-1.el7ost |
| Red Hat:openstack:8::el7 | python-django-bash-completion | 0 | 0:1.8.15-1.el7ost |
| Red Hat:openstack:9::el7 | python-django | 0 | 0:1.8.15-1.el7ost |
| Red Hat:openstack:9::el7 | python-django-bash-completion | 0 | 0:1.8.15-1.el7ost |
| SUSE:OpenStack Cloud 6 | python-Django | 0 | 1.8.19-3.6.1 |
| SUSE:OpenStack Cloud 7 | python-Django | 0 | 1.8.19-3.4.1 |
| Ubuntu:14.04:LTS | python-django | 0 | 1.6.1-2ubuntu0.15 |
| Ubuntu:16.04:LTS | python-django | 0 | 1.8.7-1ubuntu5.2 |
| openSUSE:Tumbleweed | python-Django | 0 | 3.2.7-2.3 |
| openSUSE:Tumbleweed | python-Django | 0 | 4.2.11-2.1 |
| openSUSE:Tumbleweed | python-Django4 | 0 | 4.2.14-1.1 |
| openSUSE:Tumbleweed | python-Django6 | 0 | 6.0-1.1 |
| openSUSE:Tumbleweed | ruby3.2-rubygem-http-cookie | 0 | 1.0.5-1.4 |
| openSUSE:Tumbleweed | rubygem-http-cookie | 0 | 1.0.5-1.1 |
| openSUSE:Tumbleweed | rubygem-http-cookie | 0 | 1.0.6-1.1 |
| openSUSE:Tumbleweed | rubygem-http-cookie | 0 | 1.0.8-1.1 |
| openSUSE:Tumbleweed | rubygem-http-cookie | 0 | 1.0.8-1.3 |
| pypi | Django | 1.9 | No fix |
Related vulnerabilities
- GHSA-8p8v-wh79-9r56 Django vulnerable to Uncontrolled Resource Consumption Also affects django
- GHSA-mjgh-79qc-68w3 Django has a Race Condition vulnerability Also affects django
- CVE-2026-25673 An issue was discovered in 6.0 before 6.0.3, 5.2 before 5.2.12, and 4.2 before 4.2.29. Also affects django
- CVE-2026-25674 An issue was discovered in 6.0 before 6.0.3, 5.2 before 5.2.12, and 4.2 before 4.2.29. Also affects django
- GHSA-6426-9fv3-65x8 Django has an SQL Injection issue Also affects django
- GHSA-gvg8-93h5-g6qq Django has an SQL Injection issue Also affects django
- GHSA-2mcm-79hx-8fxw Django has Observable Timing Discrepancy Also affects django
- GHSA-33mw-q7rj-mjwj Django has Inefficient Algorithmic Complexity Also affects django