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 函数动态加载模块中的类或函数,但未对可加载的模块进行充分限制,导致攻击者可以加载任意模块中的类并执行其方法。

漏洞触发路径

  1. keras.models.load_model()
  2. saving_lib.load_model()
  3. _load_model_from_fileobj()
  4. model_from_config() - 从 config.json 加载模型配置
  5. deserialize_keras_object() - 反序列化 Keras 对象
  6. _retrieve_class_or_fn() - 动态加载模块中的类或函数

关键函数分析

_retrieve_class_or_fn

这是漏洞的核心函数,负责动态加载模块中的类或函数。新版本中限制了可加载模块的名称,而旧版本未做此限制。

deserialize_keras_object

该函数会调用 _retrieve_class_or_fn 动态加载对象,有三个关键调用点:

  1. 直接调用返回对象的 from_config 方法
  2. 调用返回对象的 __call__ 方法
  3. 调用返回对象的 from_config 方法(与第一个不同路径)

虽然这些调用点限制了调用的方法名(from_config__call__),但如果能找到某个类的这些方法存在危险操作且参数可控,仍可实现 RCE。

利用链构造

通过分析 functional_from_config 函数,发现可以利用 layer 配置的嵌套解析:

  1. 第一层使用 keras.models.Model.from_config
  2. 第二层在 layers 中嵌入第三层真正要动态加载的恶意对象
  3. 第三层利用提供的参数调用危险方法

漏洞利用

构造恶意模型文件

  1. 创建一个包含恶意配置的 config.json 文件
  2. 将 config.json 打包为 .keras 文件
  3. 诱使受害者加载该模型文件

PoC 示例

{
    "class_name": "keras.models.Model",
    "config": {
        "layers": [
            {
                "class_name": "malicious.module.DangerousClass",
                "config": {
                    "evil_param": "恶意代码或命令"
                }
            }
        ]
    }
}

修复方案

  1. 限制可动态加载的模块名称(白名单机制)
  2. 对反序列化的对象进行严格类型检查
  3. 对模型文件进行签名验证

参考链接

总结

该漏洞展示了深度学习框架在模型序列化/反序列化过程中的安全隐患,提醒开发者在实现动态加载功能时需要严格限制可加载的模块范围,并对反序列化过程进行充分的安全检查。

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 示例 修复方案 限制可动态加载的模块名称(白名单机制) 对反序列化的对象进行严格类型检查 对模型文件进行签名验证 参考链接 原始漏洞分析 Keras 官方安全公告 总结 该漏洞展示了深度学习框架在模型序列化/反序列化过程中的安全隐患,提醒开发者在实现动态加载功能时需要严格限制可加载的模块范围,并对反序列化过程进行充分的安全检查。