漏洞概述:LangChain 的 "序列化注入" 危机
2025 年 12 月 23 日,LangChain 框架爆出编号为 CVE-2025-68664 的严重安全漏洞,CVSS 评分高达 9.3 分(CRITICAL 级别)。这是一个典型的序列化注入漏洞,影响 LangChain Core 的dumps()和dumpd()函数,可能导致敏感信息泄露甚至远程代码执行。
LangChain 作为构建 LLM 应用的主流框架,其序列化机制是支撑 AI 代理、工具链、缓存等核心功能的基础设施。当这个基础设施存在安全缺陷时,所有基于 LangChain 构建的 AI 应用都可能面临系统性风险。
技术原理:lc键的未转义问题
LangChain 的序列化机制
LangChain 使用特殊的序列化格式来持久化和传输对象。在内部,框架使用'lc'(LangChain 的缩写)作为保留键来标记序列化对象。例如,一个序列化的 LangChain 对象可能具有如下结构:
{
'lc': 1,
'type': 'constructor',
'id': ['langchain', 'prompts', 'PromptTemplate'],
'kwargs': {'template': 'Hello {name}!'}
}
漏洞根因:用户数据与内部标记的混淆
问题的核心在于dumps()和dumpd()函数在处理自由格式字典时,没有对包含'lc'键的用户数据进行转义。当攻击者能够控制输入数据时,可以构造如下恶意字典:
malicious_data = {
'lc': 1,
'type': 'secret',
'id': ['OPENAI_API_KEY']
}
由于'lc'键未被转义,这个用户数据在序列化时会被当作合法的 LangChain 对象。更危险的是,在反序列化时,默认设置secrets_from_env=True会尝试从环境变量中读取OPENAI_API_KEY的值并返回给攻击者。
攻击向量分析
根据 Upwind Security 的技术分析,攻击者可以通过以下途径利用此漏洞:
- 直接用户输入:如果应用接受用户输入并通过 LangChain 的序列化函数处理
- LLM 生成内容:当 LLM 生成的内容包含恶意结构时
- 外部数据源:从数据库、API 响应或文件读取的数据
- 链式处理:在复杂的 LangChain 工作流中,数据可能在多个组件间传递
影响范围与风险评估
受影响版本
-
易受攻击版本:
langchain-core >= 1.0.0且< 1.2.5langchain-core < 0.3.81
-
已修复版本:
langchain-core 1.2.5langchain-core 0.3.81
潜在风险场景
- 敏感信息泄露:攻击者可读取环境变量中的 API 密钥、数据库凭据等敏感信息
- 对象实例化攻击:通过构造特定的
'type'和'id'字段,可能实例化内部类 - 权限提升:在某些配置下,可能导致远程代码执行
- 数据完整性破坏:篡改序列化数据,影响 AI 应用的决策逻辑
CVSS 评分解读
GitHub 给出的 CVSS 3.1 评分为 9.3 分,向量为AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:N,这意味着:
- 攻击向量:网络(AV:N)
- 攻击复杂度:低(AC:L)
- 所需权限:无(PR:N)
- 用户交互:无(UI:N)
- 影响范围:已更改(S:C)
- 机密性影响:高(C:H)
- 完整性影响:低(I:L)
- 可用性影响:无(A:N)
这个评分反映了漏洞的严重性:攻击者无需特殊权限或用户交互,即可通过网络远程利用漏洞,造成高机密性影响。
修复方案与工程实践
立即修复措施
-
升级 LangChain Core:
# 对于1.x版本 pip install "langchain-core>=1.2.5" # 对于0.x版本 pip install "langchain-core>=0.3.81" -
验证修复:检查项目中所有依赖的 LangChain 相关包版本
-
重新部署:更新后重新部署所有受影响的应用
代码层面的防护措施
即使升级了版本,也应实施以下防御性编程实践:
# 1. 显式设置secrets_from_env=False(如果不需要环境变量读取)
from langchain_core.load import load, loads
# 安全配置
safe_load = lambda data: load(data, secrets_from_env=False)
safe_loads = lambda data: loads(data, secrets_from_env=False)
# 2. 输入验证和清理
def sanitize_user_input(user_data):
"""清理用户输入,防止lc键注入"""
if isinstance(user_data, dict) and 'lc' in user_data:
# 转义或拒绝包含lc键的字典
user_data = {'__lc_escaped': user_data}
return user_data
# 3. 使用安全的序列化替代方案
import json
import base64
def safe_serialize(data):
"""使用标准JSON序列化,避免LangChain特定格式"""
return base64.b64encode(json.dumps(data).encode()).decode()
def safe_deserialize(encoded_data):
"""安全的反序列化"""
decoded = json.loads(base64.b64decode(encoded_data).decode())
# 处理可能的转义数据
if '__lc_escaped' in decoded:
return decoded['__lc_escaped']
return decoded
监控与检测策略
- 日志监控:监控序列化 / 反序列化操作的异常模式
- 输入审计:记录所有用户输入和 LLM 生成内容的元数据
- 异常检测:设置警报,当检测到异常的
'lc'键使用模式时触发 - 环境变量访问监控:监控应用对敏感环境变量的访问
安全开发生命周期集成
- 依赖扫描:在 CI/CD 流水线中集成安全依赖扫描
- SAST 工具:使用静态应用安全测试工具检测序列化安全问题
- 安全代码审查:将序列化安全纳入代码审查清单
- 威胁建模:在 AI 应用设计阶段考虑序列化攻击面
漏洞修复的技术细节
GitHub 修复提交分析
根据 NVD 提供的参考链接,主要修复集中在以下提交:
- 提交 5ec0fa69de31bbe3d76e4cf9cd65a6accb8466c8:修复了
dumps()函数中'lc'键的转义逻辑 - 提交 d9ec4c5cc78960abd37da79b0250f5642e6f0ce6:更新了相关测试用例
- PR #34455 和 #34458:完整的修复和测试更新
修复的核心逻辑是在序列化时对包含'lc'键的字典进行适当转义,确保用户数据不会被误认为 LangChain 内部对象。
向后兼容性考虑
修复版本保持了向后兼容性,但开发人员需要注意:
- 现有序列化数据:已序列化的数据在反序列化时可能受到影响
- 自定义序列化器:如果项目中有自定义的序列化逻辑,需要相应更新
- 第三方集成:检查与 LangChain 集成的第三方库是否兼容新版本
AI 应用安全的最佳实践
防御深度策略
- 输入验证层:在所有数据入口点实施严格的输入验证
- 输出编码层:确保所有输出都经过适当的编码
- 最小权限原则:限制 AI 应用的权限,避免过度访问敏感资源
- 隔离执行环境:在沙箱或容器中运行不可信的 AI 组件
序列化安全清单
- 验证所有序列化输入来源
- 实施输入清理和转义
- 使用安全的序列化配置
- 监控序列化操作的异常模式
- 定期更新序列化库和框架
- 实施数据完整性检查
- 记录序列化操作的审计日志
应急响应计划
- 漏洞发现:建立漏洞报告和响应流程
- 影响评估:快速评估漏洞对业务的影响
- 修复部署:制定快速修复和部署计划
- 事后分析:进行根本原因分析和改进
总结与展望
CVE-2025-68664 暴露了 AI 框架安全性的一个重要方面:序列化机制的安全性。随着 AI 应用的普及,框架级的安全漏洞可能产生广泛影响。
对于 AI 开发者而言,这次漏洞提醒我们:
- 框架不是银弹:即使使用成熟框架,仍需关注其安全实现
- 安全需要主动:不能依赖框架的默认安全性,需要主动实施防护措施
- 持续监控更新:保持依赖项的及时更新,关注安全公告
- 安全文化重要:将安全思维融入 AI 开发的每个阶段
未来,随着 AI 代理和自主系统的复杂度增加,序列化安全将变得更加重要。开发者和安全团队需要:
- 深入理解 AI 框架的内部工作机制
- 实施全面的安全测试和监控
- 建立快速响应和修复能力
- 推动 AI 安全标准和最佳实践的发展
通过这次漏洞事件,我们看到了 AI 安全生态系统的成熟过程。每一次安全挑战都是改进的机会,推动着整个行业向更安全、更可靠的 AI 应用发展。
资料来源
- NVD CVE-2025-68664 详情页 - 官方漏洞数据库记录
- Upwind Security 技术分析 - 详细的漏洞原理和影响分析
- GitHub 修复提交记录 - 具体的代码修复细节
- LangChain 官方发布说明 - 版本更新和安全修复信息