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-mo
This commit is contained in:
parent
d9f4a0a43c
commit
96bea84864
@ -1,19 +1,19 @@
|
|||||||
# Keras Model Deserialization RCE en Gadget Jag
|
# Keras Model Deserialisering RCE en Gadget Hunting
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
Hierdie bladsy somariseer praktiese eksploitasiemetodes teen die Keras model deserialisering pyplyn, verduidelik die inwendige werking van die .keras formaat en aanvaloppervlak, en bied 'n navorsersgereedskapstel vir die vind van Model File Vulnerabilities (MFVs) en post-fix gadgets.
|
Hierdie bladsy som praktiese exploiteringstegnieke teen die Keras model deserialisering-pipeline op, verduidelik die native .keras-formaat se interne struktuur en attack surface, en verskaf 'n navorsings-toolkit om Model File Vulnerabilities (MFVs) en post-fix gadgets te vind.
|
||||||
|
|
||||||
## .keras model formaat inwendige werking
|
## .keras model formaat interne struktuur
|
||||||
|
|
||||||
'n .keras lêer is 'n ZIP-argief wat ten minste bevat:
|
'n .keras-lêer is 'n ZIP-argief wat minstens die volgende bevat:
|
||||||
- metadata.json – generiese inligting (bv. Keras weergawe)
|
- metadata.json – generiese inligting (bv., Keras-weergawe)
|
||||||
- config.json – model argitektuur (primêre aanvaloppervlak)
|
- config.json – model-argitektuur (primêre attack surface)
|
||||||
- model.weights.h5 – gewigte in HDF5
|
- model.weights.h5 – gewigte in HDF5
|
||||||
|
|
||||||
Die config.json dryf rekursiewe deserialisering: Keras importeer modules, los klasse/funksies op en herbou lae/objekte uit aanvaller-beheerde woordeboeke.
|
Die config.json bestuur recursive deserialisering: Keras importeer modules, los klasse/funksies op en rekonstrueer lae/objekte vanaf attacker-controlled dictionaries.
|
||||||
|
|
||||||
Voorbeeld snit vir 'n Dense lae objek:
|
Example snippet for a Dense layer object:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"module": "keras.layers",
|
"module": "keras.layers",
|
||||||
@ -31,22 +31,22 @@ Voorbeeld snit vir 'n Dense lae objek:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Deserialisering voer uit:
|
Deserialization performs:
|
||||||
- Modulêre invoer en simboolresolusie vanaf module/class_name sleutels
|
- Module-import en simboolresolusie van module/class_name-sleutels
|
||||||
- from_config(...) of konstruktorkalling met aanvaller-beheerde kwargs
|
- from_config(...) of constructor-aanroep met attacker-controlled kwargs
|
||||||
- Rekursie in geneste objekte (aktiverings, inisialisators, beperkings, ens.)
|
- Rekursie in geneste objekte (activations, initializers, constraints, etc.)
|
||||||
|
|
||||||
Histories het dit drie primitiewe aan 'n aanvaller blootgestel wat config.json saamstel:
|
In die verlede het dit drie primitiewe aan 'n attacker wat config.json opstel, blootgestel:
|
||||||
- Beheer oor watter modules ingevoer word
|
- Beheer oor watter modules geïmporteer word
|
||||||
- Beheer oor watter klasse/funksies opgelos word
|
- Beheer oor watter classes/funksies opgelos word
|
||||||
- Beheer oor kwargs wat in konstruktors/from_config oorgedra word
|
- Beheer van kwargs wat aan constructors/from_config deurgegee word
|
||||||
|
|
||||||
## CVE-2024-3660 – Lambda-laag bytecode RCE
|
## CVE-2024-3660 – Lambda-layer bytecode RCE
|
||||||
|
|
||||||
Wortel oorsaak:
|
Wortelsaak:
|
||||||
- Lambda.from_config() het python_utils.func_load(...) gebruik wat base64-decode en marshal.loads() op aanvaller bytes aanroep; Python unmarshalling kan kode uitvoer.
|
- Lambda.from_config() het python_utils.func_load(...) gebruik wat base64-dekodeer en marshal.loads() op attacker-bytes aanroep; Python se unmarshalling kan kode uitvoer.
|
||||||
|
|
||||||
Eksploitasie idee (vereenvoudigde payload in config.json):
|
Exploit idea (simplified payload in config.json):
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"module": "keras.layers",
|
"module": "keras.layers",
|
||||||
@ -60,19 +60,19 @@ Eksploitasie idee (vereenvoudigde payload in config.json):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Mitigering:
|
Mitigasie:
|
||||||
- Keras afdwing safe_mode=True standaard. Gekodeerde Python funksies in Lambda word geblokkeer tensy 'n gebruiker eksplisiet opt-out met safe_mode=False.
|
- Keras dwing safe_mode=True af as standaard. Geserialiseerde Python-funksies in Lambda word geblokkeer, tensy ’n gebruiker uitdruklik uitskakel met safe_mode=False.
|
||||||
|
|
||||||
Notas:
|
Aantekeninge:
|
||||||
- Erflike formate (ou HDF5 stoor) of ou kodebasisse mag nie moderne kontroles afdwing nie, so “downgrade” styl aanvalle kan steeds van toepassing wees wanneer slagoffers ou laders gebruik.
|
- Legacy-formate (ouer HDF5-saves) of ouer codebases mag dalk nie moderne kontroles afdwing nie, dus kan “downgrade”-styl-aanvalle steeds van toepassing wees wanneer slagoffers ouer loaders gebruik.
|
||||||
|
|
||||||
## CVE-2025-1550 – Arbitraire module invoer in Keras ≤ 3.8
|
## CVE-2025-1550 – Arbitrêre module-import in Keras ≤ 3.8
|
||||||
|
|
||||||
Oorsaak:
|
Worteloorsaak:
|
||||||
- _retrieve_class_or_fn het onbeperkte importlib.import_module() gebruik met aanvaller-beheerde module stringe van config.json.
|
- _retrieve_class_or_fn het onbeperkte importlib.import_module() gebruik met deur-aanvaller-beheerde module-stringe uit config.json.
|
||||||
- Impak: Arbitraire invoer van enige geïnstalleerde module (of aanvaller-geplante module op sys.path). Invoer-tyd kode loop, dan vind objekkonstruksie plaas met aanvaller kwargs.
|
- Impak: Arbitrêre import van enige geïnstalleerde module (of deur-aanvaller-geplante module op sys.path). Kode wat tydens import loop word uitgevoer, daarna vind objekkonstruksie plaas met aanvaller-kwargs.
|
||||||
|
|
||||||
Eksploit idee:
|
Eksploit-idee:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"module": "maliciouspkg",
|
"module": "maliciouspkg",
|
||||||
@ -80,16 +80,16 @@ Eksploit idee:
|
|||||||
"config": {"arg": "val"}
|
"config": {"arg": "val"}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Security improvements (Keras ≥ 3.9):
|
Sekuriteitsverbeterings (Keras ≥ 3.9):
|
||||||
- Module allowlist: imports beperk tot amptelike ekosisteem modules: keras, keras_hub, keras_cv, keras_nlp
|
- Module allowlist: invoere beperk tot amptelike ekosisteem-modules: keras, keras_hub, keras_cv, keras_nlp
|
||||||
- Safe mode default: safe_mode=True blokkeer onveilige Lambda geserialiseerde-funksie laai
|
- Standaard safe mode: safe_mode=True blokkeer die laai van onveilige geserialiseerde Lambda-funksies
|
||||||
- Basic type checking: gedeserialiseerde objekte moet ooreenstem met verwagte tipes
|
- Basiese tipekontrole: gedeserialiseerde objekte moet by die verwagte tipes pas
|
||||||
|
|
||||||
## Post-fix gadget oppervlak binne allowlist
|
## Post-fix gadget-oppervlak binne allowlist
|
||||||
|
|
||||||
Selfs met allowlisting en safe mode, bly 'n breë oppervlak oor onder toegelate Keras aanroepbare. Byvoorbeeld, keras.utils.get_file kan arbitrêre URL's na gebruiker-keur plekke aflaai.
|
Selfs met allowlisting en safe mode bly daar 'n wye oppervlak oor tussen die toegelate Keras callables. Byvoorbeeld, keras.utils.get_file kan arbitrêre URLs na gebruikers-gekose plekke aflaai.
|
||||||
|
|
||||||
Gadget via Lambda wat 'n toegelate funksie verwys (nie geserialiseerde Python bytecode):
|
Gadget via Lambda wat na 'n toegelate funksie verwys (nie geserialiseerde Python bytecode nie):
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"module": "keras.layers",
|
"module": "keras.layers",
|
||||||
@ -106,18 +106,18 @@ Gadget via Lambda wat 'n toegelate funksie verwys (nie geserialiseerde Python by
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
Belangrike beperking:
|
Belangrike beperking:
|
||||||
- Lambda.call() voeg die invoertensor as die eerste posisionele argument by wanneer die teiken aanroepbare aangeroep word. Gekoze gadgets moet 'n ekstra posisionele arg (of *args/**kwargs) kan hanteer. Dit beperk watter funksies lewensvatbaar is.
|
- Lambda.call() voeg die invoer-tensor vooraan as die eerste posisionele argument wanneer die teiken callable aangeroep word. Geselekteerde gadgets moet 'n ekstra posisionele arg kan verdra (of *args/**kwargs aanvaar). Dit beperk watter funksies bruikbaar is.
|
||||||
|
|
||||||
Potensiële impakte van toegelate gadgets:
|
Potensiële impakte van allowlisted gadgets:
|
||||||
- Arbitraire aflaai/skryf (padplanting, konfigurasie vergiftiging)
|
- Arbitrêre download/write (path planting, config poisoning)
|
||||||
- Netwerk terugroepe/SSRF-agtige effekte afhangende van die omgewing
|
- Netwerk callbacks/SSRF-agtige effekte afhangende van die omgewing
|
||||||
- Ketting na kode-uitvoering as geskryfde pades later ingevoer/uitgevoer word of by PYTHONPATH gevoeg word, of as 'n skryfbare uitvoering-op-skryf ligging bestaan
|
- Ketting na code execution indien geskryfde paaie later geïmporteer/uitgevoer word of bygevoeg word tot PYTHONPATH, of as 'n skryfbare execution-on-write ligging bestaan
|
||||||
|
|
||||||
## Navorsers gereedskap
|
## Researcher toolkit
|
||||||
|
|
||||||
1) Sistematiese gadget ontdekking in toegelate modules
|
1) Sistematiese gadget-ontdekking in toegelate modules
|
||||||
|
|
||||||
Tel kandidaat aanroepbares op oor keras, keras_nlp, keras_cv, keras_hub en prioritiseer dié met lêer/netwerk/proses/omgewing newe-effekte.
|
Lys kandidaat-callables in keras, keras_nlp, keras_cv, keras_hub en prioritiseer dié met lêer/netwerk/proses/env newe-effekte.
|
||||||
```python
|
```python
|
||||||
import importlib, inspect, pkgutil
|
import importlib, inspect, pkgutil
|
||||||
|
|
||||||
@ -160,9 +160,9 @@ candidates.append(text)
|
|||||||
|
|
||||||
print("\n".join(sorted(candidates)[:200]))
|
print("\n".join(sorted(candidates)[:200]))
|
||||||
```
|
```
|
||||||
2) Direkte deserialiseringstoetsing (geen .keras-argief benodig nie)
|
2) Direkte deserialiseringstoetsing (geen .keras-argief nodig nie)
|
||||||
|
|
||||||
Voer vervaardigde dikte direk in Keras-deserialiseerders in om aanvaarbare parameters te leer en om effekte te observeer.
|
Voer vervaardigde dicts direk in Keras deserializers in om aanvaarde params te leer en newe-effekte waar te neem.
|
||||||
```python
|
```python
|
||||||
from keras import layers
|
from keras import layers
|
||||||
|
|
||||||
@ -178,24 +178,65 @@ cfg = {
|
|||||||
|
|
||||||
layer = layers.deserialize(cfg, safe_mode=True) # Observe behavior
|
layer = layers.deserialize(cfg, safe_mode=True) # Observe behavior
|
||||||
```
|
```
|
||||||
3) Cross-version probing en formate
|
3) Kruisweergawe-toetsing en formate
|
||||||
|
|
||||||
Keras bestaan in verskeie kodebasisse/era met verskillende veiligheidsmaatreëls en formate:
|
Keras bestaan in meerdere codebases/eras met verskillende beskermingsmeganismes en formate:
|
||||||
- TensorFlow ingeboude Keras: tensorflow/python/keras (erfgoed, beplan vir verwydering)
|
- TensorFlow built-in Keras: tensorflow/python/keras (legacy, beplande verwydering)
|
||||||
- tf-keras: apart onderhou
|
- tf-keras: afsonderlik onderhou
|
||||||
- Multi-backend Keras 3 (amptelik): het inheemse .keras bekendgestel
|
- Multi-backend Keras 3 (official): het die inheemse .keras bekendgestel
|
||||||
|
|
||||||
Herhaal toetse oor kodebasisse en formate (.keras vs erfgoed HDF5) om regressies of ontbrekende veiligheidsmaatreëls te ontdek.
|
Herhaal toetse oor codebases en formate (.keras vs legacy HDF5) om regressies of ontbrekende beskerming te ontdek.
|
||||||
|
|
||||||
## Verdedigende aanbevelings
|
## Defensive recommendations
|
||||||
|
|
||||||
- Behandel model lêers as onbetroubare invoer. Laai slegs modelle van betroubare bronne.
|
- Behandel modellêers as onbetroubare invoer. Laai slegs modelle vanaf betroubare bronne.
|
||||||
- Hou Keras op datum; gebruik Keras ≥ 3.9 om voordeel te trek uit toelaatlys en tipe kontroles.
|
- Hou Keras op datum; gebruik Keras ≥ 3.9 om voordeel te trek uit allowlisting en tipekontroles.
|
||||||
- Moet nie safe_mode=False stel wanneer jy modelle laai nie, tensy jy die lêer ten volle vertrou.
|
- Stel nie safe_mode=False in wanneer modelle gelaai word tensy jy die lêer ten volle vertrou nie.
|
||||||
- Oorweeg om deserialisering in 'n sandboxed, minste-bevoorregte omgewing sonder netwerkuitgang en met beperkte lêerstelsels toegang te laat plaasvind.
|
- Oorweeg om deserialisasie in 'n sandboxed, minste-bevoegdheidsomgewing te laat loop sonder netwerk-uitgaande verkeer en met beperkte lêerstelseltoegang.
|
||||||
- Handhaaf toelaatlyste/handtekeninge vir modelbronne en integriteitskontrole waar moontlik.
|
- Handhaaf allowlists/signatures vir modelbronne en integriteitskontrole waar moontlik.
|
||||||
|
|
||||||
## Verwysings
|
## ML pickle import allowlisting for AI/ML models (Fickling)
|
||||||
|
|
||||||
|
Baie AI/ML-modelformate (PyTorch .pt/.pth/.ckpt, joblib/scikit-learn, ouer TensorFlow-artikels, ens.) sluit Python pickle-data in. Aanvallers misbruik gereeld pickle GLOBAL imports en objekkonstruktore om RCE of modelwissel tydens laai te bewerkstellig. Swartlys-gebaseerde skandeerders mis dikwels nuwe of nie-gelysde gevaarlike imports.
|
||||||
|
|
||||||
|
'n Praktiese fail-closed verdedigingsmetode is om Python se pickle-deserialiseerder te hook en slegs 'n hersiene stel onskadelike, ML-verwante imports tydens unpickling toe te laat. Trail of Bits’ Fickling implementeer hierdie beleid en lewer 'n gekeurde ML-import allowlist gebou uit duisende publieke Hugging Face-pickles.
|
||||||
|
|
||||||
|
Sekuriteitsmodel vir “safe” imports (intuïsies gedistilleer uit navorsing en praktyk): ingevoerde simbole wat deur 'n pickle gebruik word, moet terselfdertyd:
|
||||||
|
- Nie kode uitvoer of uitvoering veroorsaak nie (geen compiled/source code objects, shelling out, hooks, ens.)
|
||||||
|
- Nie arbitrêre attribuut- of item kry/stel nie
|
||||||
|
- Nie ander Python-objekte vanaf die pickle VM invoer of verwysings daartoe bekom nie
|
||||||
|
- Geen sekondêre deserialiseerders aktiveer nie (bv. marshal, nested pickle), selfs nie indirek nie
|
||||||
|
|
||||||
|
Skakel Fickling se beskerming so vroeg as moontlik in tydens proses-opstart in sodat enige pickle-laaie wat deur frameworks (torch.load, joblib.load, ens.) uitgevoer word, gekontroleer word:
|
||||||
|
```python
|
||||||
|
import fickling
|
||||||
|
# Sets global hooks on the stdlib pickle module
|
||||||
|
fickling.hook.activate_safe_ml_environment()
|
||||||
|
```
|
||||||
|
Operasionele wenke:
|
||||||
|
- Jy kan die hooks tydelik deaktiveer/heraktiveer waar nodig:
|
||||||
|
```python
|
||||||
|
fickling.hook.deactivate_safe_ml_environment()
|
||||||
|
# ... load fully trusted files only ...
|
||||||
|
fickling.hook.activate_safe_ml_environment()
|
||||||
|
```
|
||||||
|
- As 'n model wat as veilig bekend staan geblokkeer word, brei die allowlist vir jou omgewing uit nadat jy die simbole nagegaan het:
|
||||||
|
```python
|
||||||
|
fickling.hook.activate_safe_ml_environment(also_allow=[
|
||||||
|
"package.subpackage.safe_symbol",
|
||||||
|
"another.safe.import",
|
||||||
|
])
|
||||||
|
```
|
||||||
|
- Fickling ontbloot ook generiese runtime-beskermers as jy meer fyn beheer verkies:
|
||||||
|
- fickling.always_check_safety() to enforce checks for all pickle.load()
|
||||||
|
- with fickling.check_safety(): for scoped enforcement
|
||||||
|
- fickling.load(path) / fickling.is_likely_safe(path) for one-off checks
|
||||||
|
|
||||||
|
- Gee voorkeur aan nie-pickle model formate waar moontlik (bv., SafeTensors). As jy pickle moet aanvaar, laat loaders loop onder minste voorregte sonder netwerk-uitset en dwing die allowlist af.
|
||||||
|
|
||||||
|
Hierdie allowlist-eerstestrategie blokkeer aantoonbaar algemene ML pickle-uitbuitingpaaie terwyl dit hoë versoenbaarheid behou. In ToB’s benchmark het Fickling 100% van sintetiese kwaadwillige lêers gemerk en ~99% van skoon lêers van top Hugging Face repos toegelaat.
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
- [Hunting Vulnerabilities in Keras Model Deserialization (huntr blog)](https://blog.huntr.com/hunting-vulnerabilities-in-keras-model-deserialization)
|
- [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)
|
- [Keras PR #20751 – Added checks to serialization](https://github.com/keras-team/keras/pull/20751)
|
||||||
@ -203,5 +244,11 @@ Herhaal toetse oor kodebasisse en formate (.keras vs erfgoed HDF5) om regressies
|
|||||||
- [CVE-2025-1550 – Keras arbitrary module import (≤ 3.8)](https://nvd.nist.gov/vuln/detail/CVE-2025-1550)
|
- [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 #1](https://huntr.com/bounties/135d5dcd-f05f-439f-8d8f-b21fdf171f3e)
|
||||||
- [huntr report – arbitrary import #2](https://huntr.com/bounties/6fcca09c-8c98-4bc5-b32c-e883ab3e4ae3)
|
- [huntr report – arbitrary import #2](https://huntr.com/bounties/6fcca09c-8c98-4bc5-b32c-e883ab3e4ae3)
|
||||||
|
- [Trail of Bits blog – Fickling’s new AI/ML pickle file scanner](https://blog.trailofbits.com/2025/09/16/ficklings-new-ai/ml-pickle-file-scanner/)
|
||||||
|
- [Fickling – Securing AI/ML environments (README)](https://github.com/trailofbits/fickling#securing-aiml-environments)
|
||||||
|
- [Fickling pickle scanning benchmark corpus](https://github.com/trailofbits/fickling/tree/master/pickle_scanning_benchmark)
|
||||||
|
- [Picklescan](https://github.com/mmaitre314/picklescan), [ModelScan](https://github.com/protectai/modelscan), [model-unpickler](https://github.com/goeckslab/model-unpickler)
|
||||||
|
- [Sleepy Pickle attacks background](https://blog.trailofbits.com/2024/06/11/exploiting-ml-models-with-pickle-file-attacks-part-1/)
|
||||||
|
- [SafeTensors project](https://github.com/safetensors/safetensors)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user