Vulnerability GHSA-gcwf-c25f-p9rv

Medium Risk
MEDIUM RISK
CVSS Score: 6.1
Score Range: 4.0–6.9
Medium severity vulnerabilities (CVSS 4.0–6.9). Important issues that meaningfully reduce security confidence.
4 hours ago
November 09, 2026 at 11:24 PM UTC
Kiwi TCMS account confirmation open redirect through protocol-relative URLs
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4

Summary

Kiwi TCMS account confirmation open redirect through protocol-relative URLs

Details

Summary

In Kiwi TCMS version 16.1, the fix for CVE-2026-54724 (open redirect via unvalidated next parameter) in the account confirmation endpoint is incomplete. The validation uses startswith("/") to check if the redirect URL is local, but this is bypassed by protocol-relative URLs like //evil.com which start with / but redirect the browser to an external attacker-controlled domain. 16.1’s incomplete mitigation still allows protocol-relative destinations and earlier releases lack the mitigation.

Vulnerable Code

In tcms/kiwi_auth/views.py, the Confirm view (line ~113):

def get_redirect_url(self, *args, **kwargs):
    self.url = self.request.GET.get("next", reverse("core-views-index"))
    if not self.url.startswith("/"):
        self.url = reverse("core-views-index")

The check startswith("/") passes for //evil.com because it begins with /, but browsers interpret //evil.com as a protocol-relative URL that redirects to https://evil.com (or http://evil.com depending on the current page's protocol).

Proof of Concept

GET /confirm/<activation_key>/?next=//evil.com/phishing HTTP/1.1
Host: kiwi.example.com

Response:

HTTP/1.1 302 Found
Location: //evil.com/phishing

The browser follows the redirect to https://evil.com/phishing.

Verification:

>>> url = "//evil.com/phishing"
>>> url.startswith("/")
True  # passes the check!

Impact

An attacker can craft a confirmation link that, after the user confirms their account, redirects them to a phishing page. This is useful for:

  • Credential phishing (fake login page on attacker domain)
  • Malware delivery after trusted action
  • Social engineering (user trusts the link because it's from the legitimate Kiwi TCMS instance)

The attack requires sending a crafted activation link to a user who is registering, or intercepting/predicting the activation key.

Suggested Fix

Use Django's url_has_allowed_host_and_scheme() utility instead of a simple startswith check:

from django.utils.http import url_has_allowed_host_and_scheme

def get_redirect_url(self, *args, **kwargs):
    self.url = self.request.GET.get("next", reverse("core-views-index"))
    if not url_has_allowed_host_and_scheme(
        self.url,
        allowed_hosts={self.request.get_host()},
        require_https=self.request.is_secure(),
    ):
        self.url = reverse("core-views-index")

This properly rejects protocol-relative URLs, absolute URLs to other hosts, and other bypass patterns.

Fixed in Version 16.2

Related Vulnerabilities

Other vulnerabilities affecting the same packages

Low Risk
3 months ago
Kiwi TCMS vulnerable to stored XSS via JavaScript: URI in extra_link field (TestPlan & TestCase)
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-2551
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-2551
Medium Risk
3 months ago
Kiwi TCMS has an Open Redirect via unvalidated next parameter in account confirmation endpoint
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-2552
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-2552
Unknown
3 months ago
Kiwi TCMS's /init-db/ page renders and responds to requests after first use
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-2553
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-2553
High Risk
4 months ago
Kiwi TCMS's misconfigured HTTP headers allow stored XSS execution with Firefox
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-1499
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 and 12.4 PYSEC-2026-1499
High Risk
4 months ago
kiwitcms vulnerable to stored cross-site scripting via unrestricted file upload
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 PYSEC-2026-1495
6.2.1 and 6.3 and 6.4 and 6.5 and 6.5.3 and 6.6 and 6.7 and 6.8 and 6.9 and 6.10 and 6.11 and 7.0 and 7.1 and 7.2 and 7.2.1 and 7.3 and 8.0 and 8.1 and 8.1.99 and 8.2 and 8.3 and 8.4 and 8.5 and 8.6 and 8.6.1 and 8.7 and 8.8 and 8.9 and 9.0 and 9.999 and 10.0 and 10.1 and 10.2 and 10.3 and 10.3.999 and 10.4 and 10.5 and 11.0 and 11.1 and 11.3 and 11.4 and 11.5 and 11.6 and 11.7 and 12.0 and 12.1 and 12.2 and 12.3 PYSEC-2026-1495
View all vulnerabilities for these packages

Impacted packages

Timeline

Published
4 hours ago
November 09, 2026 at 11:24 PM UTC
Last Modified
4 hours ago
November 09, 2026 at 11:30 PM UTC