
Kit de ferramentas de PoC e deteção para Danfoss AK-SM 8xxA CVE-2025-41450/-41451/-41452: contorno de autenticação code-of-the-day, RCE de alarme para e-mail e injeção de configuração do nginx, com regras Suricata/Sigma.
PoCs de pesquisa/engenharia de detecção para as três vulnerabilidades da interface web do AK-SM 8xxA divulgadas pela Claroty Team82 e corrigidas pela Danfoss nas versões R4.2 / R4.3.1 (DSA-2025-03-01, DSA-2025-08-01, CISA ICSA-25-140-03):
| CVE | Fraqueza | Afetado | Corrigido |
|---|---|---|---|
| CVE-2025-41450 | Bypass de autenticação oculto por "código do dia" (senha derivada de data/hora) em xml.cgi?action=getauth | < R4.2 | R4.2 |
| CVE-2025-41451 | Injeção de comando do SO pós-autenticação na configuração de alarme-para-e-mail / SMTP (item 0x1be1) | < 4.3.1 | 4.3.1 |
| CVE-2025-41452 | Substituição do headers.conf do nginx pós-autenticação via action=load_nginx_headers → injeção de diretivas + DoS por travamento do 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
Apenas a biblioteca padrão do Python 3; sem dependências.
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
Os PoCs 41451 e 41452 encadeiam através do bypass 41450 por padrão (um atacante real não tem credenciais configuradas); ambos aceitam --user/--password (41451) para começar a partir de uma sessão legítima. Todos os PoCs aceitam --target HOST:PORT, portanto também funcionam contra firmware real vulnerável — mas o algoritmo de código do dia e os nomes dos atributos de bypass devem ser substituídos pelos valores recuperados do firmware (ver ressalvas abaixo).
Cada requisição ao emulador é registrada em captures/http-requests.jsonl com tags. Os artefatos de rede estáveis e dignos de assinatura são:
CVE-2025-41450 (bypass de autenticação)
POST /xml.cgi?action=getauth carregando atributos inesperados além de username/password (aqui: codeofday=1 / support=1; os nomes reais estão censurados em fontes públicas — recupere do firmware para as regras finais).Server: nginx na porta de gerenciamento) em firmware < R4.2 é inerentemente vulnerável — detecção de banner/versão é o sinal de maior fidelidade.CVE-2025-41451 (injeção de comando → RCE)
POST /xml.cgi?action=set_email_config autenticado com metacaracteres de shell (; | & $() `) no campo de senha de e-mail (item de configuração 0x1be1). Senhas SMTP legítimas raramente contêm ;+comando.x'; <cmd> # / $(<cmd>) etc. — veja as linhas de log marcadas constructed_cmd: para saber exatamente como o valor chega a um shell.id, curl, ...).CVE-2025-41452 (injeção de configuração do nginx → manipulação de tráfego / DoS)
xml.cgi?action=load_nginx_headers (nome de arquivo headers.conf). Este endpoint não tem motivo benigno para ser chamado fora de raras manutenções administrativas — alertas baseados em volume funcionam.location, proxy_pass, rewrite, add_header.emulator/aksm800a_emulator.py:generate_code) que preserva a propriedade documentada (código derivado unicamente da data do dispositivo). Os PoCs e o emulador o compartilham, portanto a cadeia é funcional de ponta a ponta. Para hardware real, extraia check_code_of_day do firmware e insira-o.id → arquivo de prova). Vincule/execute apenas em 127.0.0.1.