CVE-2025-14009
Critical · 10.0CVSS
10.0
EPSS
1.0%
Published
Feb 18, 2026
CISA due date
—
Cloudanix analysis
A popular language-processing tool can unpack downloaded files into the wrong folders, which may let an attacker run their own programs on the computer.
- Exploitation
- Supply Chain
- Attacker needs
- None
- Complexity
- Low
- Impact
- Full Compromise
- Component
- Library
- Class
- Path Traversal
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The NLTK downloader extracts third-party ZIP corpora with zipfile.extractall() and no member-path canonicalization or allow-list checks. A crafted archive can write files outside the intended nltk_data tree (zip-slip/path traversal). Python modules dropped onto import paths—especially package __init__.py files—are executed on subsequent import, producing arbitrary code execution as the NLTK-hosting process, with changed scope and high impact on confidentiality, integrity, and availability.
Why it matters to the business
Workstations, CI jobs, and production NLP services that fetch NLTK data can be fully compromised, exposing source, models, credentials, and downstream dependents. EPSS remains low (about 0.0095, up roughly 20% over 30 days) and the issue is not in CISA KEV and is not associated with ransomware, but the library’s wide use in language-processing stacks still makes unpatched download paths a high operational risk. Inventory also flags Red Hat spice-client-win, spice-client-win-x64, and spice-client-win-x86 on RHEL AUS 8.2 AppStream as affected, so remote-display client fleets share patch urgency even though in-the-wild exploitation is not reported.
How an attack unfolds
An attacker supplies a ZIP packaged as an NLTK data corpus whose internal names escape the extraction root. When an application or user calls the NLTK downloader (default or custom index), the archive is fetched and unpacked without path validation. Traversal writes land outside nltk_data; if they include importable Python, the interpreter loads them automatically and runs attacker-controlled code with the privileges of the downloading process. From there the attacker can read local files, reach the network, and install persistence. No named threat actors or mature public exploits are associated with this issue; abuse depends on controlling or spoofing the package source the downloader trusts.
How to fix it
On RHEL AUS 8.2 AppStream, upgrade spice-client-win, spice-client-win-x64, and spice-client-win-x86 to 0:8.10-3.el8_2.1. For NLTK, stop using the built-in downloader against untrusted indexes; vendor-pin and integrity-check corpora (hashes/signatures), extract only into a dedicated low-privilege directory, and apply upstream NLTK releases as soon as a downloader with path-validated extraction is available. Until then, pre-stage data offline, block outbound fetches from production, and run any remaining downloads in isolated, non-root jobs that cannot write onto application import paths.
How to confirm the fix worked
Confirm RH packages report 0:8.10-3.el8_2.1 (or later) via the platform package manager. Inventory every environment that imports nltk and determine whether nltk.download, Downloader, or custom download_dir usage remains. Review nltk/downloader.py _unzip_iter (and equivalent) for member-path normalization, rejection of absolute paths and parent-directory segments, and avoidance of raw extractall. Verify corpora are populated from an internal verified cache rather than live Internet fetches, and that the nltk_data tree and its parents are not writable by the runtime user. Do not validate with crafted traversal archives.
Typical attack path
- Obtain influence over an NLTK package source the victim will use (malicious index, mirror tampering, or a substituted archive).
- Deliver a ZIP whose member names escape the intended extraction directory.
- Wait for nltk.download or equivalent to fetch and extract the archive with unsanitized extractall.
- Rely on written Python modules being imported during later NLTK or application use.
- Use the resulting process-level code execution for data access, persistence, or further movement.
How to detect it
Assume possible historical exposure wherever NLTK has been allowed to download packages. Review application, notebook, CI, and package-manager logs around nltk.download / Downloader usage, especially to non-default indexes or download_dir values. On disk, compare nltk_data and parent directories against a known-good corpus list; look for unexpected .py/.so/.pyd files, extra __init__.py, or writes outside the package tree. Correlate Python processes that recently fetched ZIPs with subsequent unusual child processes, outbound connections, or persistence artifacts. No named APT campaigns or ransomware families are tied to this CVE, so hunt on behavior and filesystem anomalies rather than actor-specific infrastructure.
- nltk.download(
- nltk.downloader
- _unzip_iter
- zipfile.extractall
- nltk_data
- download_dir
- __init__.py written outside expected nltk package directories
- ZIP member names containing ../ or ..\ during NLTK extract
- python process fetching .zip then spawning unexpected children
What your security team should do
- Patch listed spice-client-win packages to 0:8.10-3.el8_2.1 on RHEL AUS 8.2 immediately and inventory all NLTK usage, including transitive and notebook/CI paths.
- Disable or firewall NLTK’s network downloader in production; serve corpora from an internal, integrity-checked cache.
- Constrain the runtime user so it cannot write outside a dedicated data directory or onto sys.path.
- Hunt for unexpected files adjacent to nltk_data and for download activity from unapproved indexes; treat hits as potential prior abuse.
- Track upstream NLTK for a path-safe extractor and EPSS/KEV changes; the score is rising, even if still low.
The record
A critical vulnerability exists in the NLTK downloader component of nltk/nltk, affecting all versions. The _unzip_iter function in nltk/downloader.py uses zipfile.extractall() without performing path validation or security checks. This allows attackers to craft malicious zip packages that, when downloaded and extracted by NLTK, can execute arbitrary code. The vulnerability arises because NLTK assumes all downloaded packages are trusted and extracts them without validation. If a malicious package contains Python files, such as __init__.py, these files are executed automatically upon import, leading to remote code execution. This issue can result in full system compromise, including file system access, network access, and potential persistence mechanisms.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | nltk | 0 | 3.9.3 |
| Chainguard | kubeflow-pipelines-visualization-server | 0 | 2.16.0-r0 |
| Chainguard | label-studio | 0 | 1.22.0-r6 |
| Chainguard | nemo | 0 | 2.6.2-r3 |
| Chainguard | open-webui | 0 | 0.8.9-r0 |
| Chainguard | py3.11-nltk | 0 | 3.9.3-r0 |
| Chainguard | py3.12-nltk | 0 | 3.9.3-r0 |
| Chainguard | py3.13-nltk | 0 | 3.9.3-r0 |
| Wolfi | kubeflow-pipelines-visualization-server | 0 | 2.16.0-r0 |
| Wolfi | open-webui | 0 | 0.8.9-r0 |
| Wolfi | py3.11-nltk | 0 | 3.9.3-r0 |
| Wolfi | py3.12-nltk | 0 | 3.9.3-r0 |
| Wolfi | py3.13-nltk | 0 | 3.9.3-r0 |
| openSUSE:Tumbleweed | python-nltk | 0 | 3.9.1-3.1 |
Related vulnerabilities
- CVE-2024-39705 NLTK through 3.8.1 allows remote code execution if untrusted packages have pickled Python… Also affects nltk
- CVE-2026-33230 NLTK (Natural Language Toolkit) is a suite of open source Python modules, data sets, and… Also affects kubeflow-pipelines-visualization-server
- CVE-2026-33231 NLTK (Natural Language Toolkit) is a suite of open source Python modules, data sets, and… Also affects kubeflow-pipelines-visualization-server
- CVE-2026-30922 pyasn1 is a generic ASN.1 library for Python. Also affects kubeflow-pipelines-visualization-server
- CVE-2026-31958 Tornado is a Python web framework and asynchronous networking library. Also affects kubeflow-pipelines-visualization-server
- CVE-2026-27199 Werkzeug is a comprehensive WSGI web application library. Also affects kubeflow-pipelines-visualization-server
- CVE-2026-25990 Pillow is a Python imaging library. Also affects kubeflow-pipelines-visualization-server
- CVE-2026-26007 cryptography is a package designed to expose cryptographic primitives and recipes to… Also affects kubeflow-pipelines-visualization-server