Keras解析config时动态加载任意模块中的类造成rce分析(cve-2025-1550)
字数 1192 2025-08-29 22:41:24
Keras 动态加载模块 RCE 漏洞分析 (CVE-2025-1550)
漏洞概述
本漏洞存在于 Keras 框架中,由于在解析模型配置文件(config.json)时对动态加载模块的限制不足,攻击者可以构造恶意的 Keras 模型文件(.keras),在受害者加载该模型时实现远程代码执行(RCE)。
漏洞原理
关键问题
Keras 在反序列化模型配置时,通过 _retrieve_class_or_fn 函数动态加载模块中的类或函数,但未对可加载的模块进行充分限制,导致攻击者可以加载任意模块中的类并执行其方法。
漏洞触发路径
keras.models.load_model()saving_lib.load_model()_load_model_from_fileobj()model_from_config()- 从 config.json 加载模型配置deserialize_keras_object()- 反序列化 Keras 对象_retrieve_class_or_fn()- 动态加载模块中的类或函数
关键函数分析
_retrieve_class_or_fn
这是漏洞的核心函数,负责动态加载模块中的类或函数。新版本中限制了可加载模块的名称,而旧版本未做此限制。
deserialize_keras_object
该函数会调用 _retrieve_class_or_fn 动态加载对象,有三个关键调用点:
- 直接调用返回对象的
from_config方法 - 调用返回对象的
__call__方法 - 调用返回对象的
from_config方法(与第一个不同路径)
虽然这些调用点限制了调用的方法名(from_config 或 __call__),但如果能找到某个类的这些方法存在危险操作且参数可控,仍可实现 RCE。
利用链构造
通过分析 functional_from_config 函数,发现可以利用 layer 配置的嵌套解析:
- 第一层使用
keras.models.Model.from_config - 第二层在 layers 中嵌入第三层真正要动态加载的恶意对象
- 第三层利用提供的参数调用危险方法
漏洞利用
构造恶意模型文件
- 创建一个包含恶意配置的 config.json 文件
- 将 config.json 打包为 .keras 文件
- 诱使受害者加载该模型文件
PoC 示例
{
"class_name": "keras.models.Model",
"config": {
"layers": [
{
"class_name": "malicious.module.DangerousClass",
"config": {
"evil_param": "恶意代码或命令"
}
}
]
}
}
修复方案
- 限制可动态加载的模块名称(白名单机制)
- 对反序列化的对象进行严格类型检查
- 对模型文件进行签名验证
参考链接
- 原始漏洞分析
- Keras 官方安全公告
总结
该漏洞展示了深度学习框架在模型序列化/反序列化过程中的安全隐患,提醒开发者在实现动态加载功能时需要严格限制可加载的模块范围,并对反序列化过程进行充分的安全检查。