CVE-2026-23946: Tendenci Remote Code Execution Vulnerability
MODERATECVE-2026-23946 is a MODERATE (CVSS 6.8) remote code execution vulnerability (CWE-502: Deserialization of Untrusted Data) affecting Tendenci libraries in the PyPI ecosystem. The issue involves tendenci affected by authenticated remote code execution via pickle deserialization. Remediation is available by upgrading affected packages to version 15.3.12.
CVE-2026-23946 at a Glance
Security Impact
CVSS: 6.8
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:H).
How to Fix CVE-2026-23946
To remediate this vulnerability, upgrade all affected Tendenci dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
pip install tendenci>=15.3.12
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
pip show tendenci
How to Check if You Are Affected
To determine whether your Python environment is affected by CVE-2026-23946, inspect your installed packages using pip:
pip show tendenci
Analyze the terminal output to locate any version of Tendenci in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 15.3.12), your application is affected.
Note: The pip show tendenci command checks currently installed packages in your active Python environment.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-502: Deserialization of Untrusted Data, where the product deserializes untrusted data without sufficiently ensuring that the resulting data will be valid. In Tendenci, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-23946 Affected Tendenci Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
tendenci
|
PyPI |
< 15.3.12
|
15.3.12
|
References
Frequently Asked Questions
What is CVE-2026-23946?
Which Tendenci versions are affected?
What version fixes CVE-2026-23946?
Is tendenci affected?
What is the CVSS score of CVE-2026-23946?
What CWE is associated with CVE-2026-23946?
How can I check PyPI dependencies for CVE-2026-23946?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-339m-4qw5-j2g3",
"modified" : "2026-01-22T15:43:00Z",
"published" : "2026-01-21T16:38:15Z",
"aliases" : [ "CVE-2026-23946" ],
"summary" : "Tendenci Affected by Authenticated Remote Code Execution via Pickle Deserialization",
"details" : "A critical deserialization vulnerability exists in Tendenci Helpdesk module (NOTE, by default, Helpdesk is NOT enabled), affecting the version 15.3.11 and earlier. This vulnerability allows remote code execution (RCE) by an authenticated user with staff security level due to using Python's pickle module on the helpdesk /reports/. The damage is contained to the user that your Tendenci application runs.\n\n**Key Finding:** The original CVE-2020-14942 was incompletely patched. While `ticket_list()` was fixed to use safe JSON deserialization, the `run_report()` function still uses unsafe `pickle.loads()`.\n\n**Permission Scoping:** The impact is limited to the permissions of the user running the application, typically www-data, which generally lacks write (except for upload directories) and execute permissions.\n\n## Vulnerability Details\n\n### Affected Version\n- **Version:** Tendenci 15.3.11 and earlier (all versions since incomplete CVE-2020-14942 patch)\n- **Component:** `tendenci/apps/helpdesk/views/staff.py`\n\n### Related CVE\n- **CVE-2020-14942:** Original pickle deserialization vulnerability (partially patched)\n- **GitHub Advisory:** GHSA-jqmc-fxxp-r589\n- **Original Issue:** https://github.com/tendenci/tendenci/issues/867\n\n### Tendenci User Role Hierarchy\n\n| Level | Role | Description |\n|-------|------|-------------|\n| 0 | `is_superuser` | Highest privilege - full Django admin |\n| 1 | `is_staff` | user with Staff security level - can access helpdesk module |\n| 2 | Authenticated User | Basic user access |\n| 3 | Anonymous User | Public read-only access |\n\n`is_staff` is a commonly assigned role (by a superuser) for helpdesk operators who manage support tickets - not system administrators. \n\n\n### Code Comparison (Patched vs Vulnerable)\n\n| Function | Line | Deserialization | Status |\n|----------|------|-----------------|--------|\n| `ticket_list()` | 763 | `simplejson.loads()` | ✅ SAFE |\n| `run_report()` | 1062 | `pickle.loads()` | ❌ VULNERABLE |\n\n## Why This Qualifies for CVE Assignment\n\nThis vulnerability represents an **incomplete patch bypass** for CVE-2020-14942 with a clear exploitation path. The flaw allows a malicious user with Staff security level to achieve Remote Code Execution via Python's pickle.loads. Though the damage is contained to the user that your Tendenci application runs. \n\n## Remediation\n\nUpdate Tendenci to the latest version (v15.3.12 as of now) immediately if you have Helpdesk enabled. Note that Helpdesk is not enabled by default. All of our hosted sites have been patched, although **none** of our client sites have the Helpdesk enabled.\n\n\n## References\n\n- Tendenci GitHub: https://github.com/tendenci/tendenci\n- CVE-2020-14942: https://nvd.nist.gov/vuln/detail/CVE-2020-14942\n- GitHub Advisory: https://github.com/advisories/GHSA-jqmc-fxxp-r589\n- Original Issue: https://github.com/tendenci/tendenci/issues/867\n- CWE-502: https://cwe.mitre.org/data/definitions/502.html\n- Python Pickle Security: https://docs.python.org/3/library/pickle.html#restricting-globals",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:H"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "PyPI",
"name" : "tendenci"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "15.3.12"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/tendenci/tendenci/security/advisories/GHSA-339m-4qw5-j2g3"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2020-14942"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-23946"
}, {
"type" : "WEB",
"url" : "https://github.com/tendenci/tendenci/issues/867"
}, {
"type" : "WEB",
"url" : "https://github.com/tendenci/tendenci/commit/23d9fd85ab7654e9c83cfc86cb4175c0bd7a77f1"
}, {
"type" : "WEB",
"url" : "https://github.com/tendenci/tendenci/commit/2ff0a457614944a1b417081c543ea4c5bb95d636"
}, {
"type" : "WEB",
"url" : "https://github.com/tendenci/tendenci/commit/63e1b84a5b163466d1d8d811d35e7021a7ca0d0e"
}, {
"type" : "WEB",
"url" : "https://docs.python.org/3/library/pickle.html#restricting-globals"
}, {
"type" : "ADVISORY",
"url" : "https://github.com/advisories/GHSA-jqmc-fxxp-r589"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/tendenci/tendenci"
}, {
"type" : "WEB",
"url" : "https://github.com/tendenci/tendenci/releases/tag/v15.3.12"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-502", "CWE-94" ],
"severity" : "MODERATE",
"github_reviewed" : true,
"github_reviewed_at" : "2026-01-21T16:38:15Z",
"nvd_published_at" : "2026-01-22T01:15:52Z"
}
}