
PoC и инструментарий для обнаружения CVE-2025-41450/-41451/-41452 в Danfoss AK-SM 8xxA: обход аутентификации по «коду дня», RCE через отправку тревожных уведомлений на почту и инъекция конфигурации nginx, с правилами Suricata/Sigma.
PoC для исследования и проектирования средств обнаружения трёх уязвимостей веб-интерфейса AK-SM 8xxA, раскрытых Claroty Team82 и исправленных Danfoss в R4.2 / R4.3.1 (DSA-2025-03-01, DSA-2025-08-01, CISA ICSA-25-140-03):
| CVE | Слабость | Затронуто | Исправлено |
|---|---|---|---|
| CVE-2025-41450 | Скрытый обход аутентификации «code-of-the-day» (пароль, производный от даты и времени) в xml.cgi?action=getauth | < R4.2 | R4.2 |
| CVE-2025-41451 | Внедрение команд ОС после аутентификации в конфигурации alarm-to-mail / SMTP (элемент 0x1be1) | < 4.3.1 | 4.3.1 |
| CVE-2025-41452 | Замена headers.conf в nginx после аутентификации через action=load_nginx_headers → внедрение директив + DoS из-за падения 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
Только стандартная библиотека Python 3; без зависимостей.
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
PoC 41451 и 41452 по умолчанию используют цепочку через обход 41450 (у реального
атакующего нет настроенных учётных данных); оба принимают --user/--password
(41451), чтобы вместо этого начать с легитимной сессии. Все PoC принимают --target HOST:PORT, поэтому они также работают против реальной уязвимой прошивки — но
алгоритм code-of-the-day и имена атрибутов обхода должны быть заменены на
значения, восстановленные из прошивки (см. оговорки ниже).
Каждый запрос к эмулятору логируется в captures/http-requests.jsonl с
тегами. Стабильные, пригодные для сигнатур сетевые артефакты:
CVE-2025-41450 (обход аутентификации)
POST /xml.cgi?action=getauth, содержащий неожиданные атрибуты помимо
username/password (здесь: codeofday=1 / support=1; реальные имена
скрыты в публичных источниках — восстановите их из прошивки для финальных правил).Server: nginx на порту управления) на прошивке < R4.2 изначально
уязвим — обнаружение по баннеру/версии является сигналом с наибольшей точностью.CVE-2025-41451 (инъекция команд → RCE)
POST /xml.cgi?action=set_email_config с метасимволами
оболочки (; | & $() `) в поле пароля электронной почты
(элемент конфигурации 0x1be1). Легитимные пароли SMTP редко содержат ;+команду.x'; <cmd> # / $(<cmd>) и т. п. — см. помеченные
строки лога constructed_cmd:, чтобы увидеть, как именно значение попадает в оболочку.id, curl, ...).CVE-2025-41452 (инъекция конфигурации nginx → манипуляция трафиком / DoS)
xml.cgi?action=load_nginx_headers
(имя файла headers.conf). У этой конечной точки нет легитимной причины
вызываться вне редкого административного обслуживания — оповещение по объёму работает.location, proxy_pass, rewrite,
add_header.emulator/aksm800a_emulator.py:generate_code), который сохраняет
задокументированное свойство (код выводится исключительно из даты устройства). PoC и
эмулятор используют его совместно, поэтому цепочка работает сквозным образом. Для реального
оборудования извлеките check_code_of_day из прошивки и подставьте его.id → файл-доказательство).
Привязывайте/запускайте только на 127.0.0.1.