Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:46:15 +08:00

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.