
Kit de herramientas de PoC y detección para Danfoss AK-SM 8xxA CVE-2025-41450/-41451/-41452: omisión de autenticación mediante código del día, RCE de alarma a correo e inyección de configuración de nginx, con reglas de Suricata/Sigma.
PoC de investigación/ingeniería de detección para las tres vulnerabilidades de la interfaz web de AK-SM 8xxA divulgadas por Claroty Team82 y corregidas por Danfoss en R4.2 / R4.3.1 (DSA-2025-03-01, DSA-2025-08-01, CISA ICSA-25-140-03):
| CVE | Debilidad | Afectado | Corregido |
|---|---|---|---|
| CVE-2025-41450 | Omisión de autenticación oculta mediante "código del día" (contraseña derivada de la fecha y hora) en xml.cgi?action=getauth | < R4.2 | R4.2 |
| CVE-2025-41451 | Inyección de comandos del SO posterior a la autenticación en la configuración de alarma-a-correo / SMTP (elemento 0x1be1) | < 4.3.1 | 4.3.1 |
| CVE-2025-41452 | Reemplazo de headers.conf de nginx posterior a la autenticación mediante action=load_nginx_headers → inyección de directivas + DoS por caída de 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 biblioteca estándar de Python 3; sin dependencias.
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
Los PoC 41451 y 41452 encadenan a través del bypass 41450 por defecto (un atacante real no tiene credenciales configuradas); ambos aceptan --user/--password (41451) para comenzar desde una sesión legítima en su lugar. Todos los PoC aceptan --target HOST:PORT, por lo que también funcionan contra firmware real vulnerable — pero el algoritmo del código del día y los nombres de los atributos del bypass deben reemplazarse con los valores recuperados del firmware (véanse las advertencias a continuación).
Cada solicitud al emulador se registra en captures/http-requests.jsonl con etiquetas. Los artefactos de red estables y dignos de firma son:
CVE-2025-41450 (bypass de autenticación)
POST /xml.cgi?action=getauth que transporta atributos inesperados más allá de
usuario/contraseña (aquí: codeofday=1 / support=1; los nombres reales están
censurados en las fuentes públicas — recupérelos del firmware para las reglas finales).Server: nginx en el puerto de gestión) en firmware < R4.2 es inherentemente
vulnerable — la detección de banner/versión es la señal de mayor fidelidad.CVE-2025-41451 (inyección de comandos → RCE)
POST /xml.cgi?action=set_email_config autenticado con metacaracteres de shell
(; | & $() `) en el campo de contraseña de correo electrónico
(elemento de configuración 0x1be1). Las contraseñas SMTP legítimas rara vez contienen ;+comando.x'; <cmd> # / $(<cmd>) etc. — véanse las líneas de registro
etiquetadas constructed_cmd: para ver exactamente cómo el valor llega a un shell.id, curl, ...).CVE-2025-41452 (inyección de configuración de nginx → manipulación de tráfico / DoS)
xml.cgi?action=load_nginx_headers
(nombre de archivo headers.conf). Este endpoint no tiene ninguna razón benigna para ser
invocado fuera de un raro mantenimiento administrativo — la alerta basada en volumen funciona.location, proxy_pass, rewrite,
add_header.emulator/aksm800a_emulator.py:generate_code) que conserva la propiedad
documentada (código derivado únicamente de la fecha del dispositivo). Los PoC y el
emulador lo comparten, por lo que la cadena es funcional de extremo a extremo. Para hardware
real, extraiga check_code_of_day del firmware e insértelo.id → archivo de prueba).
Enlace/ejecución solo en 127.0.0.1.