Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify URL injection point in NLTK-consuming application
-
DeliveryCraft URL targeting host in 100.64.0.0/10 range
-
ExploitSubmit request that bypasses validate_network_url() filter
-
ExecutionApplication makes outbound request to internal shared-address-space host
-
ImpactAttacker receives and extracts internal service response
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Credential 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 three concurrent conditions: (1) the consuming application must pass attacker-influenced URLs to NLTK's network-loading helpers, meaning a separate URL injection vulnerability must exist in the application layer; (2) NLTK's strict-mode URL validation via |
| Impact | The CVSS 3.7 base score (AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N) accurately characterizes this as a constrained finding: high attack complexity reflects the need for the attacker to both control a URL passed into NLTK's helpers and rely on reachable 100.64.0.0/10 infrastructure, two co-occurring prerequisites that significantly reduce opportunistic exploitability. No EPSS score is available in the provided data, no CISA KEV listing exists, and no public exploit code has been identified - the issue was responsibly disclosed through huntr.com. Notably, the RCE tag attached in the source metadata is directly contradicted by the CVE description, which explicitly states no code execution is achievable; teams must not escalate triage priority based on that mislabeled tag. The SSRF impact is further bounded to environments where the application host has network reachability to shared-address-space hosts, a condition common in carrier-grade NAT or certain cloud VPC-peering topologies but absent in many standard deployments - a mid-sized municipal IT team in inowroclaw running a local NLP pipeline with no such NAT exposure, for instance, faces essentially zero realized risk. Overall this is a genuine but low-priority finding best addressed in the normal development cycle rather than as an emergency. |
| Exploit ScenarioDerived | An attacker who can inject a crafted URL into a web application that forwards it to NLTK's network-loading helpers can specify a target in the 100.64.0.0/10 shared address space - such as an internal microservice or management API reachable via carrier-grade NAT - causing the application to fetch and potentially expose the response. No public exploit code has been identified; the attack requires both a URL injection entry point in the consuming application and network reachability to 100.64.0.0/10-addressed infrastructure from the application host, limiting it to targeted rather than opportunistic scenarios. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 09, 2026
Server-Side Request Forgery in NLTK 3.9.4 and the develop branch enables network-level probing of RFC 6598 shared-address-space hosts (100.64.0.0/10) by exploiting an incomplete block-list in the validate_network_url() guard function. The function correctly rejects private and loopback ranges but omits the shared address space defined by RFC 6598, which Python's ipaddress module does not classify as either is_private or is_global, allowing crafted URLs to pass the filter unchallenged. Impact is confined to confidentiality - internal infrastructure reachable through shared carrier-grade NAT space may be probed - and no code execution is achievable through this path; no public exploit or CISA KEV listing has been identified at time of analysis.
RemediationAI
The primary fix is to update the validate_network_url() function to explicitly reject the RFC 6598 Shared Address Space (100.64.0.0/10) - for example by adding a check for ipaddress.ip_address(host).is_private or ipaddress.ip_network(host).subnet_of(ipaddress.ip_network('100.64.0.0/10')) - as detailed in the huntr.com disclosure at https://huntr.com/bounties/2911b643-571c-42e4-b0c2-9a1fa6f491db. A specific patched NLTK release version has not been independently confirmed from available data; monitor the NLTK GitHub repository and the huntr report for a tagged release and upgrade to it once available. Until a patch is released, the most reliable compensating control is blocking outbound connections to 100.64.0.0/10 at the host firewall or egress proxy, which prevents exploitation without code changes but may disrupt legitimate traffic in carrier-grade NAT environments - assess your topology before applying. Applications that accept user-supplied URLs and pass them to NLTK helpers should also add application-layer pre-validation explicitly rejecting the 100.64.0.0/10 range, which is independently defensible regardless of the NLTK patch cadence.
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
NLTK (Natural Language Toolkit) is a widely-used Python library for natural language processing whose network-loading helpers invoke nltk.pathsec.validate_network_url() to prevent SSRF by filtering disallowed IP ranges before making outbound requests. The root cause (CWE-918: Server-Side Request Forgery) is an incomplete deny-list: the guard checks Python's ipaddress.ip_address().is_private and explicitly blocks loopback and link-local ranges, but the RFC 6598 Shared Address Space (100.64.0.0/10) - allocated for carrier-grade NAT - is neither is_private nor is_global in Python's ipaddress module and therefore bypasses all existing guards. Affected CPE is cpe:2.3:a:nltk:nltk/nltk:*:*:*:*:*:*:*:*, covering NLTK 3.9.4 and the current develop branch; earlier releases are not explicitly scoped by available data.
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
AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
Network-reachable but AC:H due to requiring both a URL injection vector and reachable 100.64.0.0/10 infrastructure; PR:N as no auth to the NLTK host is needed; confidentiality-only impact with no integrity or availability effect.
Primary rating from Vendor (huntr_ai).
CVSS VectorVendor: huntr_ai
DescriptionCVE.org
A Server-Side Request Forgery (SSRF) vulnerability exists in nltk/nltk versions 3.9.4 and the current develop branch. The nltk.pathsec.validate_network_url() function, intended to prevent SSRF by rejecting internal network addresses, fails to reject IPs in the RFC 6598 shared address space (100.64.0.0/10). This occurs because Python's ipaddress module does not classify such addresses as is_private or is_global, and the current guard only checks is_private and a few explicit categories. An attacker who can influence a URL passed to NLTK's network-loading helpers can exploit this vulnerability to make a strict-mode application send requests to shared-address-space hosts, potentially exposing non-public infrastructure reachable from the application host. The impact is limited to SSRF-style confidentiality exposure, with no code execution claimed.
Blast Radius
ecosystem impact- 188 pypi packages depend on nltk (44 direct, 144 indirect)
Ecosystem-wide dependent count for version 3.9.4.
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
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
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
EUVD-2026-54961
GHSA-2jhm-w3mp-jcwr
NVD
CVE.org
EPSS
VulDB
Exploit-DB