Keras versions prior to 3.11.0 allow for arbitrary code execution when loading a crafted .keras
model archive, even when safe_mode=True
.
The issue arises because the archive’s config.json
is parsed before layer deserialization. This can invoke keras.config.enable_unsafe_deserialization()
, effectively disabling safe mode from within the loading process itself. An attacker can place this call first in the archive and then include a Lambda
layer whose function is deserialized from a pickle, leading to the execution of attacker-controlled Python code as soon as a victim loads the model file.
Exploitation requires a user to open an untrusted model; no additional privileges are needed. The fix in version 3.11.0 enforces safe-mode semantics before reading any user-controlled configuration and prevents the toggling of unsafe deserialization via the config file.
Affected versions: < 3.11.0 Patched version: 3.11.0
It is recommended to upgrade to version 3.11.0 or later and to avoid opening untrusted model files.
{ "github_reviewed_at": "2025-09-19T17:16:44Z", "severity": "HIGH", "cwe_ids": [ "CWE-502" ], "nvd_published_at": "2025-09-19T09:15:36Z", "github_reviewed": true }