
PoC e toolkit di rilevamento per Danfoss AK-SM 8xxA CVE-2025-41450/-41451/-41452: bypass dell'autenticazione code-of-the-day, RCE da alarm-to-mail e injection della configurazione nginx, con regole Suricata/Sigma.
PoC di ricerca/ingegneria del rilevamento per le tre vulnerabilità dell'interfaccia web AK-SM 8xxA divulgate da Claroty Team82 e corrette da Danfoss in R4.2 / R4.3.1 (DSA-2025-03-01, DSA-2025-08-01, CISA ICSA-25-140-03):
| CVE | Debolezza | Affected | Fixed |
|---|---|---|---|
| CVE-2025-41450 | Bypass nascosto dell'autenticazione tramite "code-of-the-day" (password derivata da datetime) su xml.cgi?action=getauth | < R4.2 | R4.2 |
| CVE-2025-41451 | Command injection del sistema operativo post-autenticazione nella configurazione alarm-to-mail / SMTP (elemento 0x1be1) | < 4.3.1 | 4.3.1 |
| CVE-2025-41452 | Sostituzione di headers.conf di nginx post-autenticazione tramite action=load_nginx_headers → injection di direttive + DoS da crash di sm_app | < 4.3.1 | 4.3.1 |
emulator/aksm800a_emulator.py vulnerable-behavior emulator (127.0.0.1 only)
poc/cve_2025_41450_code_of_the_day.py
poc/cve_2025_41451_alarm_mail_cmd_injection.py
poc/cve_2025_41452_nginx_conf_injection.py
detection/suricata/danfoss-aksm-cves.rules Suricata rules (see in-file caveats)
detection/sigma/*.yml Sigma host/log rules
detection/test_rules_against_captures.py replay captures against the ruleset
captures/http-requests.jsonl full request log, tagged per CVE
WRITEUP.md FROMAGEGATE incident context + full research summary
Solo stdlib di Python 3; nessuna dipendenza.
python3 emulator/aksm800a_emulator.py 8080 & # start the target
python3 poc/cve_2025_41450_code_of_the_day.py # exit 0 = bypass works
python3 poc/cve_2025_41451_alarm_mail_cmd_injection.py
python3 poc/cve_2025_41452_nginx_conf_injection.py # add --no-dos to skip DoS
python3 detection/test_rules_against_captures.py # replay captures vs Suricata rules
I PoC 41451 e 41452 concatenano per impostazione predefinita il bypass 41450 (un vero
attaccante non ha credenziali configurate); entrambi accettano --user/--password
(41451) per partire invece da una sessione legittima. Tutti i PoC accettano --target HOST:PORT, quindi funzionano anche contro firmware realmente vulnerabile — ma
l'algoritmo del codice del giorno e i nomi degli attributi di bypass devono essere sostituiti
con i valori recuperati dal firmware (vedere le avvertenze di seguito).
Ogni richiesta all'emulatore viene registrata in captures/http-requests.jsonl con
tag. Gli artefatti di rete stabili e meritevoli di firma sono:
CVE-2025-41450 (bypass dell'autenticazione)
POST /xml.cgi?action=getauth con attributi inattesi oltre a
username/password (qui: codeofday=1 / support=1; i nomi reali sono
oscurati nelle fonti pubbliche — recuperarli dal firmware per le regole definitive).Server: nginx sulla porta di gestione) su firmware < R4.2 è intrinsecamente
vulnerabile — il rilevamento di banner/versione è il segnale a più alta fedeltà.CVE-2025-41451 (command injection → RCE)
POST /xml.cgi?action=set_email_config autenticato con metacaratteri di shell
(; | & $() `) nel campo password dell'email
(voce di configurazione 0x1be1). Le password SMTP legittime raramente contengono ;+comando.x'; <cmd> # / $(<cmd>) ecc. — vedere le righe di log
constructed_cmd: taggate per capire esattamente come il valore finisce in una shell.id, curl, ...).CVE-2025-41452 (injection della configurazione nginx → manipolazione del traffico / DoS)
xml.cgi?action=load_nginx_headers
(nome file headers.conf). Questo endpoint non ha alcun motivo legittimo di essere
chiamato al di fuori di rare operazioni di manutenzione amministrativa — l'alerting basato sul volume funziona.location, proxy_pass, rewrite,
add_header.emulator/aksm800a_emulator.py:generate_code) che preserva la
proprietà documentata (codice derivato unicamente dalla data del dispositivo). I PoC e
l'emulatore lo condividono, quindi la catena è funzionale end-to-end. Per l'hardware reale, estrarre check_code_of_day dal firmware e inserirlo.id → file di prova).
Associare/eseguire solo su 127.0.0.1.