Keras 价值 750$的目录穿越漏洞 漏洞描述 Keras 的 keras.utils.get_file() 函数在解压缩下载的 tar 归档文件时存在目录遍历漏洞。尽管该函数实现了 filter_safe_paths() 来过滤不安全的路径,但该过滤函数存在逻辑缺陷,允许创建指向父目录 (..) 的符号链接。攻击者可构造恶意归档文件,在解压后创建指向预期目录之外的符号链接,从而可能访问或修改外部文件。

Keras 是啥 https://github.com/keras-team/keras

Keras 3 是一个多后端深度学习框架,支持 JAX、TensorFlow、PyTorch 和 OpenVINO(仅用于推理)。轻松构建和训练计算机视觉、自然语言处理、音频处理、时间序列预测、推荐系统等模型。 加速模型开发 :借助 Kera 的高级用户体验和如 PyTorch 或 JAX 等易于调试的运行时,更快交付深度学习解决方案。
最先进的性能 :通过选择最适合你模型架构的后端(通常是 JAX!),相比其他框架,实现 20%到 350%的加速。这里是基准测试。
数据中心级培训 :自信地从笔记本电脑扩展到大型 GPU 或 TPU 集群。
加入近三百万开发者行列,从初创企业到全球企业,共同利用 Keras 3 的力量。
环境搭建 测试环境

组件
版本
操作系统
Linux (Docker 容器)
Python
3.11.14
Keras
3.11.2

Docker 运行环境

源码获取

漏洞复现 PoC 代码

复现结果

然后我们来验证 两种方法,我们验证和执行一起

结果

验证成功 或者我们直接通过符号链接访问外部文件

漏洞分析 数据流分析

代码分析 文件位置: keras/src/utils/file_utils.py

关键函数

代码结构分析

函数
作用
resolve_path()
规范化路径,对已存在的符号链接会解析
is_path_in_dir()
检查路径是否在 base_dir 内
is_link_in_dir()
检查符号链接目标是否在安全范围内
filter_safe_paths()
过滤不安全的文件,yield 安全的 TarInfo

2. filter_safe_paths() 的执行流程

我们看这个流程

filter_safe_paths() 先检查路径名,后检查符号链接 符号链接的路径名 subdir/link_to_parent 是安全的 符号链接的指向目标 .. 应该被 is_link_in_dir() 检查 elif 分支永远不会执行,目标未被检查

3. resolve_path() 的关键行为 关键问题就是 os.path.realpath() 对不存在的路径不会解析符号链接

打了个解压差异 检查时路径不存在,resolve_path() 返回路径本身 "/app/subdir/link_to_parent".startswith("/app") = True 检查通过,符号链接被创建

4. extractall() 执行解压 代码

分析 符号链接 link_to_parent 被成功创建 指向父目录 ..,可以访问解压目录外的文件

目录穿越原理 梳理后就是这样

所以 POC 是这样的

符号链接的路径名 subdir/link_to_parent 在解压目录 /app/cache_123/ 内 ✓ 符号链接的指向目标 .. 解析后是 /app/ 任何遍历解压目录的代码都可能通过 link_to_parent 访问 /app/ 下的文件

漏洞修复 官方修复方案 Keras 3.13.0 修复内容: 1 调整检查顺序: 符号链接检查优先于普通文件检查 2 添加 filter 参数: 在 Python 3.12-3.13 版本中使用 filter="data" 3 重命名函数: filter_safe_pathsfilter_safe_tarinfos,逻辑改进 **Keras 3.11.2 - `keras/src/utils/file_utils.py:

**Keras 3.13.0 - keras/src/utils/file_utils.py:

如果理解了漏洞原理,就能明白为什么这样就能够修复我们的漏洞呢? 我们再次来看看这个流程

看完这个流程,就很清楚了 添加 filter="data" 支持 - `keras/src/utils/file_utils.py:

参考资料 1Python tarfile 安全警告 2CWE-22: Improper Limitation of a Pathname to a Restricted Directory 3Keras GitHub Repository 4Keras Release Notes 5Google Security Research: Tarfile Exploitation 6报告

免责声明 本报告仅供安全研究和教育目的使用。所有测试均在授权环境中进行。 请勿将本文提供的信息用于任何非法目的 本文所述漏洞利用方法仅用于帮助理解和修复安全漏洞 使用本文信息造成的任何后果,由使用者自行承担

标签: 漏洞复现, 安全漏洞, 漏洞修复, 目录穿越漏洞, Keras, get_file()函数, 符号链接

添加新评论