LangChain Core 路径遍历:遗留 load_prompt 读取任意文件
CVE-2026-34070 让伪造的 prompt 配置经由 load_prompt 遍历文件系统,泄露 .txt/.json/.yaml 中的机密。2026 年 3 月 27 日披露,已在 langchain-core 1.2.22 修复。
这是什么?
CVE-2026-34070 是 langchain-core 中的一个路径遍历漏洞。langchain-core 是广泛使用的 LLM 编排框架 LangChain 的基础包。该漏洞由 Cyera 的研究人员在其「LangDrained」分析中于 2026 年 3 月 27 日 披露,分配的通告编号为 GHSA-qh6h-p6c9-ff54。缺陷位于一组未公开的遗留 prompt 加载 API 中:load_prompt()、load_prompt_from_config() 以及 prompt 类的 .save() 方法,全部位于 langchain_core.prompts.loading。
其分类十分平常——CWE-22,即「对受限目录的路径名限制不当」——而这正是关键所在。这并非某种奇异的 AI 攻击,而是一个有数十年历史的经典 Web 漏洞,重新出现在 AI 框架的底层管道中,且经由 prompt 配置数据而非 URL 被触达。NVD 将其评为 CVSS 3.1 的 7.5(高危);Snyk 的 CVSS 4.0 评估则给出 8.7。
工作原理
存在漏洞的函数会根据反序列化配置字典中嵌入的路径来读取文件。当应用程序从配置对象加载 prompt 时,这些函数会解析文件路径并读取其内容——而不会校验该路径是否包含遍历序列或绝对路径注入。
如果应用程序将受用户影响的 prompt 配置传给 load_prompt() 或 load_prompt_from_config(),控制该配置的攻击者就可以提供包含 ../ 序列(或绝对路径)的路径,从而读取宿主系统上的任意文件。唯一的约束是扩展名检查:模板按 .txt 读取,示例文件按 .json 或 .yaml 读取。在这些扩展名范围内,没有任何机制阻止请求走出预期的 prompt 目录,去访问采用了被允许扩展名的配置文件、环境变量导出文件或机密存储。
# 危险模式的示意写法——绝不要加载不可信的 prompt 配置
from langchain_core.prompts import load_prompt
# 'config' 受攻击者影响(可能被上传、抓取或经模板生成)
config = {
"_type": "prompt",
"template_path": "../../../../[已隐去的敏感路径].yaml",
}
prompt = load_prompt(config) # 读取被遍历到的文件,仅受扩展名限制
利用前提是关键的细微之处:只有当应用程序将 不可信 配置喂给这些遗留加载器时,危险才会成真。其影响是信息泄露(机密性),而非写入访问或代码执行——CVSS 向量记录为机密性高影响,完整性与可用性均无影响。
为何重要
这是 Cyera 在 LangChain 与 LangGraph 中所揭示的同一模式中的第三项:连接模型与业务工作流的「无形的基础管道」中的输入校验缺陷。Cyera 将 CVE-2026-34070 与早先 langchain-core 的一个不安全反序列化缺陷(CVE-2025-68664,评分 9.3,2025 年 12 月)以及 LangGraph checkpointer 中的 SQL 注入(CVE-2025-67644,7.3)一并分析。每一个都对应不同的层级和不同类别的数据——本地文件、运行时机密、智能体的持久状态。
更广的教训是:AI 编排框架继承了普通软件的全部攻击面,外加新的入口点。曾经需要恶意 HTTP 参数的路径遍历,如今可以经由从仓库抓取的 prompt 模板、用户提供的智能体配置,或从数据库取出的序列化对象进入系统。同一主题贯穿于 LiteLLM 的免认证 SQLi、LangFlow 的路径遍历 以及 pgAdmin 的 LLM-API 缺陷:这些传统漏洞异常地紧贴着凭据与模型流量,藏身于三年前还不存在的代码中。
防御
第一项具体措施是 升级:langchain-core 1.2.22 修复了该问题,并在 0.3.x 分支上以 0.3.86 提供了回移修复。所有更早的版本均受影响。
除打补丁之外,维护者自身的修复也指明了方向。遗留的 load_prompt 系列现已正式弃用并计划移除;它由 langchain_core.load 中的 dumpd / dumps / load / loads 序列化 API 取代,后者不执行任何文件读取,并采用基于允许列表的安全模型。迁出遗留加载器会彻底移除这个危险原语,而非试图围绕它做净化。
对于无法立即迁移的团队,应将 prompt 配置视为不可信输入。绝不要在未经校验的情况下,把来自用户、网络或仓库的配置字典传给 load_prompt() 或 load_prompt_from_config()。强制使用受允许 prompt 目录的允许列表,在使用前解析并规范化任何路径,并拒绝绝对路径和 .. 组件。正如 Cyera 所指出的,这里的指引不过是将成熟的安全编码实践应用于 AI 管道:校验路径、限制目录边界、避免不安全的反序列化,并优先采用参数化、由允许列表驱动的接口,而非解释攻击者可影响的原始字符串的接口。
状态
| 项目 | 取值 |
|---|---|
| CVE | CVE-2026-34070 (GHSA-qh6h-p6c9-ff54) |
| 受影响 | langchain-core,所有早于 1.2.22 的版本(0.3.x 早于 0.3.86) |
| 修复版本 | langchain-core 1.2.22(回移 0.3.86) |
| 弱点 | CWE-22 路径遍历 |
| 严重度 | CVSS 3.1 7.5 (NVD) / CVSS 4.0 8.7 (Snyk) |
| 影响 | 任意文件读取(.txt/.json/.yaml),仅机密性 |
| 披露 | 2026 年 3 月 27 日(Cyera「LangDrained」) |
| 状态 | 已修复;遗留 API 已弃用待移除 |
补丁已发布,且受影响的 API 是未公开的遗留接口,因此实际暴露面仅限于仍在对不可信配置调用它们的应用程序。请审计代码中的 load_prompt、load_prompt_from_config 与 prompt 的 .save() 调用,确认 langchain-core 版本,并规划向 langchain_core.load 的迁移。