Live › vulnerability › CVE-2026-62388
Go to dashboardNLTK's pathsec module defaults to warning-only mode, so its eight security checks log a warning instead of blocking violations. An attacker who can supply a path, URL or pickle source can read local files, reach internal URLs such as cloud metadata, or load unsafe pickles, and the earlier fixes for CVE-2024-39705 and CVE-2026-0846 do not block by default.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-27 08:02 UTC, 0h before NVD. All times on this page are UTC.
Any application that installs NLTK 3.9.4 or lower and passes it paths, URLs or untrusted pickled data through nltk.data or pathsec functions is exposed. Services that only load NLTK's bundled data from trusted local paths are at much lower risk.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| nltk | pypi | <= 3.9.4 | 3.10.0 |
| nltk | vendor | < 3.10.0 | 3.10.0 |
pip show nltk and confirm the version is 3.9.4 or lower.python -c "import nltk.pathsec as p; print(p.ENFORCE)" and check for False.NLTK_PATHSEC_ENFORCE is not set to 1, true or yes.nltk to 3.10.0.NLTK_PATHSEC_ENFORCE=1 in the environment that runs NLTK.Each row is the first time that source carried this signal. The analyst’s rows are its own findings.
NLTK's pathsec.py security module defaults to ENFORCE=False (line 24), which means all 8 security validation functions only emit RuntimeWarning instead of raising exceptions when violations are detected.
The pathsec module was introduced as the fix for CVE-2024-39705 (arbitrary code execution via pickle) and CVE-2026-0846 (path traversal). However, with ENFORCE=False as the default:
Every security gate follows the same pattern:
ENFORCE = os.environ.get('NLTK_PATHSEC_ENFORCE', '').lower() in ('1', 'true', 'yes')
def validate_something(path):
if is_violation(path):
if ENFORCE:
raise SecurityError('...') # Only raised when env var is set
else:
warnings.warn('...', RuntimeWarning) # Default: warning only
# Execution continues regardless
This means the security remediations for CVE-2024-39705 and CVE-2026-0846 are effectively disabled by default. Any user who installed NLTK 3.9.x expecting the security fixes to be active is still vulnerable unless they manually set NLTK_PATHSEC_ENFORCE=1.
PoC:
import nltk.pathsec
import warnings
# Show that ENFORCE is False by default
print(f'ENFORCE = {nltk.pathsec.ENFORCE}') # False
# Attempt to read /etc/passwd through pathsec -- should be blocked
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter('always')
result = nltk.pathsec.open('/etc/passwd', 'r')
print(f'File opened: {result.name}') # /etc/passwd
print(f'Warning emitted: {w[0].message}') # RuntimeWarning (not an exception)
# Attack succeeds -- file is readable
The correct default is fail-secure: ENFORCE should be True unless explicitly disabled. The current default makes the security module opt-in rather than opt-out, defeating its purpose.
Suggested fix: Change default to ENFORCE=True. Users who need backwards compatibility can set NLTK_PATHSEC_ENFORCE=0 to explicitly disable.
This page as .md · .json · in your agent: get_signal("CVE-2026-62388")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.