3454a55636
cffconvert / validate (push) Has been cancelled
ci-workflow / pre-commit (push) Has been cancelled
ci-workflow / Minimal NLTK Download Test (macos-latest) (push) Has been cancelled
ci-workflow / Minimal NLTK Download Test (ubuntu-latest) (push) Has been cancelled
ci-workflow / Minimal NLTK Download Test (windows-latest) (push) Has been cancelled
ci-workflow / Python 3.10 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.11 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.12 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.13 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.14 on macos-latest (push) Has been cancelled
ci-workflow / Python 3.14t on macos-latest (push) Has been cancelled
ci-workflow / Python 3.10 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.11 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.12 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.13 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.14 on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.14t on ubuntu-latest (push) Has been cancelled
ci-workflow / Python 3.10 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.11 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.12 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.13 on windows-latest (push) Has been cancelled
ci-workflow / Python 3.14 on windows-latest (push) Has been cancelled
124 lines
4.2 KiB
Markdown
124 lines
4.2 KiB
Markdown
# Security Policy
|
|
|
|
## Reporting a Vulnerability
|
|
|
|
Please report security issues to `nltk.team@gmail.com`
|
|
|
|
## Security Hardening
|
|
|
|
NLTK includes a centralized I/O security module (`nltk.pathsec`) that
|
|
validates file paths, network URLs, and zip archives.
|
|
|
|
As of NLTK 3.10.0, strict enforcement is enabled by default
|
|
(`ENFORCE=True`). In normal operation, NLTK applies the stricter
|
|
`pathsec` policy unless a caller explicitly opts out.
|
|
|
|
Under enforcement, unauthorized file access, SSRF attempts, and zip-slip
|
|
style path escapes raise exceptions (typically `PermissionError`) instead of emitting warnings.
|
|
|
|
### Resource-loading security model
|
|
|
|
NLTK's resource-loading protections are designed to reduce common risks
|
|
when NLTK is used with untrusted input or in shared environments such as
|
|
web applications, services, notebooks, CI/CD systems, and multi-tenant
|
|
pipelines.
|
|
|
|
In particular, the current policy reduces the risk of:
|
|
|
|
- **Arbitrary local file access through NLTK resource loading** by
|
|
requiring filesystem access to remain within allowed NLTK data
|
|
directories.
|
|
- **SSRF to non-public destinations** by resolving network targets and
|
|
blocking loopback, private, link-local, and multicast addresses.
|
|
- **Redirect-based bypasses** by re-validating redirects at each hop.
|
|
- **Zip-slip attacks** by validating extraction targets before writing
|
|
files.
|
|
|
|
These protections apply to NLTK's own resource-loading paths and URL
|
|
handling. They are not a general operating-system sandbox, and they do
|
|
not prevent all unsafe behavior an application might perform outside
|
|
NLTK.
|
|
|
|
### Local file access
|
|
|
|
`file:` URLs are not a general-purpose mechanism for loading arbitrary
|
|
local files.
|
|
|
|
With strict enforcement enabled (`ENFORCE=True`), file-backed resources
|
|
must resolve inside allowed NLTK data directories. By default these
|
|
directories are derived from:
|
|
|
|
1. `nltk.data.path` (configurable at runtime)
|
|
2. `NLTK_DATA` environment variable
|
|
3. Standard locations (`~/nltk_data`, `/usr/share/nltk_data`, etc.)
|
|
4. The system temp directory
|
|
|
|
If you use a custom resource directory, explicitly add it to
|
|
`nltk.data.path`:
|
|
|
|
```python
|
|
import nltk
|
|
nltk.data.path.append('/my/custom/data')
|
|
```
|
|
|
|
Then load resources by NLTK resource path rather than relying on access
|
|
to arbitrary filesystem locations.
|
|
|
|
### Current Working Directory (CWD) access
|
|
|
|
Implicit access to the current working directory is not allowed under
|
|
strict enforcement (`ENFORCE=True`) unless that directory has been
|
|
explicitly added to `nltk.data.path`.
|
|
|
|
If you intentionally want to trust the current directory, authorize it
|
|
explicitly:
|
|
|
|
```python
|
|
import nltk
|
|
nltk.data.path.append('.')
|
|
```
|
|
|
|
This makes the trust decision explicit and avoids surprising behavior in
|
|
server-side or shared execution environments.
|
|
|
|
### Network URL validation
|
|
|
|
NLTK permits network resource loading only for `http:` and `https:`
|
|
URLs.
|
|
|
|
Before a request is made, NLTK validates the resolved destination and
|
|
blocks requests to:
|
|
|
|
- loopback addresses
|
|
- private RFC1918 ranges
|
|
- link-local addresses
|
|
- multicast addresses
|
|
|
|
Redirects are re-validated at each hop, so a public URL cannot bypass
|
|
the policy by redirecting to a blocked destination.
|
|
|
|
In practice, ordinary public URLs continue to work, while destinations
|
|
such as `127.0.0.1`, `10.0.0.0/8`, and `169.254.169.254` are rejected.
|
|
|
|
### What is protected
|
|
|
|
- **Path traversal**: file access is validated against allowed NLTK
|
|
data directories (`nltk.data.path`, `NLTK_DATA`, and standard system
|
|
locations).
|
|
- **SSRF prevention**: `urlopen` resolves hostnames via DNS and blocks
|
|
requests to loopback, private, link-local, and multicast IP ranges,
|
|
including obfuscated forms where applicable.
|
|
- **Zip-slip protection**: zip extraction validates that member paths
|
|
stay within the target directory.
|
|
- **Pickle safety**: `nltk.data.load()` uses `RestrictedUnpickler`
|
|
which blocks all class/function globals. Other pickle loading uses
|
|
`pickle_load()` which emits a security warning.
|
|
|
|
### Note on symlinks
|
|
|
|
NLTK's corpus readers perform lexical path containment checks when
|
|
joining file paths. These checks do not resolve symlinks. If your threat
|
|
model includes attackers who can place symlinks inside trusted NLTK data
|
|
directories, keep strict enforcement enabled so paths are fully resolved
|
|
and validated.
|