Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft malicious pickle transition-parser model
-
DeliveryDeliver model via file share, hub, or supply chain
-
ExploitVictim application calls TransitionParser.parse with malicious model
-
ExecutionAllowlistUnpickler resolves dotted-name gadget through allowed namespace
-
ImpactArbitrary OS command executes in victim process
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V1 - Encoding and Sanitization Safe deserialization, type allowlists
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires that the victim application calls TransitionParser.parse and supplies a model file sourced from an attacker-controlled or otherwise untrusted location. The CVSS 4.0 UI:P metric confirms passive user interaction is required - the victim process must initiate the model load. No authentication or network privileges are required on the attacker's side (PR:N, AV:N), as the malicious model can be delivered through any file distribution channel (model hub download, email, shared filesystem, CI artifact). Exploitation is bounded to NLTK versions 3.10.0-3.10.2 only; versions prior to 3.10.0 and 3.10.3 and later are not affected by this specific dotted-name bypass. The vulnerability is confined to the TransitionParser.parse code path through allowlisted_pickle_load - other NLTK deserialization paths are not confirmed vulnerable by the available data. Exploitation is not possible if the application loads only internally-generated or cryptographically verified model files. |
| Impact | The CVSS 4.0 base score of 8.7 (AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H) accurately reflects the threat: no authentication is required from the attacker's side, and the only gating factor is passive user interaction - the victim's system must load the malicious model file (UI:P). There is no CISA KEV listing and no public exploit code has been identified, making mass opportunistic exploitation less likely at this time. However, the pickle gadget pattern underlying this bypass is well-understood in the security research community, significantly lowering the bar for exploit development. EPSS data was not included in the provided intelligence and cannot be cited. The vulnerability is narrowly scoped to TransitionParser.parse model loading from untrusted sources; organizations that programmatically download and load pre-trained NLTK transition-parser models from external model hubs or shared research artifacts face the highest realistic risk. The CVSS 4.0 'S:X' supplemental metrics are unset, leaving system-of-systems impact unassessed. No conflicting signals are present - vector, description, and fix diff are internally consistent. |
| Exploit ScenarioDerived | An attacker publishes or delivers a crafted NLTK transition-parser model file - for example, via a public model-sharing platform, a poisoned research artifact, or a supply chain compromise of an internal model registry. When a victim application calls TransitionParser.parse with the malicious model file, allowlisted_pickle_load deserializes it using the vulnerable AllowlistUnpickler; the unpickler resolves a dotted-name gadget such as 'numpy.f2py.crackfortran.myeval' through attribute traversal on the allowlisted 'numpy' namespace, executing an arbitrary OS command in the victim process. No public exploit code has been identified, but the pickle gadget construction technique for this class of bypass is extensively documented in security research literature. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 22, 2026
Remote code execution in NLTK's TransitionParser component allows arbitrary OS command execution when a victim loads a crafted transition-parser model file. The AllowlistUnpickler in NLTK before 3.10.3 validated only the module string during deserialization, not the global name - enabling attribute traversal via dotted names (e.g., resolving 'sklearn.os.system' through getattr chaining on an allowlisted 'sklearn' namespace) to reach callable sinks the allowlist never intended to expose. No public exploit has been identified at time of analysis, but the CVSS 4.0 score of 8.7 with no authentication prerequisite reflects significant risk for pipelines that ingest externally-sourced NLP models.
RemediationAI
Upgrade to NLTK 3.10.3 or later, which contains the fix landed in commit c3e37113742a1ebeeb4f2ca58941f320f98805ea (https://github.com/nltk/nltk/commit/c3e37113742a1ebeeb4f2ca58941f320f98805ea). The patched release enforces dotted-name rejection, a broad module denylist, and a fine-grained global allowlist within AllowlistUnpickler. If an immediate upgrade is not feasible, the primary compensating control is to cease loading TransitionParser model files from any untrusted or externally-sourced location, as the vulnerability is triggered exclusively via that code path; this fully eliminates the attack surface at the cost of disabling use of externally supplied transition-parser models. As a secondary control, enforce cryptographic integrity verification (SHA-256) of model files against checksums obtained from a trusted, separate channel before loading - note this requires a trustworthy distribution mechanism for the hashes and does not protect against supply chain compromise of the checksum source itself. Disabling TransitionParser functionality entirely is the most conservative option if the feature is not operationally required.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause is CWE-502 (Deserialization of Untrusted Data) in NLTK's AllowlistUnpickler class within nltk/picklesec.py. Python's pickle protocol >= 4 resolves class references via find_class(module, name), and when 'name' is a dotted string (e.g., 'os.system'), Python internally resolves it through successive getattr calls - so an attacker who crafts a pickle referencing 'numpy.f2py.crackfortran.myeval' or 'sklearn.os.system' can traverse module attributes to reach an exec/eval sink even though 'os' was never in the allowlist. The fix commit c3e37113742a1ebeeb4f2ca58941f320f98805ea addresses this with three layered defenses: (1) a hard dotted-name rejection guard in find_class, (2) a _DENIED_MODULE_PREFIXES denylist blocking dangerous namespaces (os, subprocess, builtins, ctypes, importlib, etc.) even when a parent namespace is allowlisted, and (3) a fine-grained _MODEL_ALLOWED_GLOBALS allowlist restricting TransitionParser deserialization to specific (module, qualname) pairs such as (collections, defaultdict) and (builtins, int). Affected CPE: cpe:2.3:a:nltk:nltk:*:*:*:*:*:*:*:* covering versions 3.10.0 through 3.10.2.
Know when Nltk gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Attacker delivers model via network with no auth (AV:N/PR:N); victim must load it (UI:R); arbitrary code execution yields full C/I/A; scope unchanged as execution stays within the NLTK process.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
NLTK before 3.10.3 contains a remote code execution vulnerability in AllowlistUnpickler that validates only the pickle module string and not the global name, allowing attackers to resolve dotted names by attribute traversal to callables outside the allowlisted namespace. Attackers can craft untrusted transition-parser models that execute arbitrary commands when TransitionParser.parse loads the model through allowlisted_pickle_load.
Blast Radius
ecosystem impact- 6 pypi packages depend on nltk (6 direct, 0 indirect)
Ecosystem-wide dependent count for version 3.10.0.
Executive ViewAI
NLTK versions before 3.10.3 contain a remote code execution vulnerability in the TransitionParser component that allows attackers to execute arbitrary operating system commands when an organization processes malicious machine learning model files from external sources. Organizations using NLTK for NLP data processing face direct risk of system compromise and potential lateral movement if they ingest untrusted model files.
Vendor-released patch: NLTK 3.10.3.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Insecure deserialization occurs when an application converts serialized data (a stream of bytes representing an object's state) back into a living object without proper validation.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
Arbitrary code execution in the Natural Language Toolkit (NLTK) before 3.10.3 allows attackers to bypass the library's p
Arbitrary code execution in NLTK (Natural Language Toolkit) through 3.9.4 allows attackers to run Python code when a vic
Arbitrary code execution in the NLTK (Natural Language Toolkit) Python library affects all versions through its data dow
StreamBackedCorpusView in NLTK before 3.10.0 allows arbitrary local file reads by calling Python's builtins.open() direc
Symlink-based path traversal in NLTK's FramenetCorpusReader before version 3.10.2 permits attackers with write access to
Unbounded recursion in NLTK's JSONTaggedDecoder.decode_obj() (nltk/jsontags.py) allows unauthenticated remote attackers
Path traversal and pickle deserialization protections in NLTK before 3.10.0 are effectively disabled by default - pathse
XML Entity Expansion (Billion Laughs) in NLTK before 3.10.3 allows unauthenticated remote attackers to cause denial of s
Server-side request forgery in NLTK before 3.10.3 allows unauthenticated remote attackers to reach internal HTTP service
Symlink escape in NLTK's CorpusReader.open() allows local attackers to read arbitrary files outside the designated corpu
Path traversal in NLTK's FramenetCorpusReader and NKJPCorpusReader (all versions before 3.10.0) enables unauthenticated
NLTK (Natural Language Toolkit) is a suite of open source Python modules, data sets, and tutorials supporting research a
Same weakness CWE-502 – Deserialization of Untrusted Data
View allVendor StatusVendor
SUSE
Severity: Important| Product | Status |
|---|---|
| openSUSE Tumbleweed | Fixed |
EUVD-2026-64296
GHSA-5gh2-94qg-qppq
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB