- SSH-пользователь -2 → полный root
Самая критичная и уже активно эксплуатируемая. В RouterOS SSH-демон передает имя пользователя и маску прав в /nova/bin/login как позиционные аргументы.
Если имя начинается с -, login воспринимает это как номер файлового дескриптора и читает из него доверенные данные. PTY (псевдотерминал) в SSH использует fd 0, 1, 2. Поэтому:
• Пользователь логинится по SSH с именем -2
• Login читает данные из stderr/PTY (fd 2)
• Атакующий отправляет два NUL-разделенных поля: имя и маску политики
• Маска 654958 = 0x9fe6e = полные права RouterOS
- RSA-подпись без приватного ключа (forgery с e=3)
В libucrypto.so функция parseHashFromDerEncoded при проверке PKCS#1 v1.5 подписи не проверяла, что после извлеченного дайджеста в буфере ничего нет. Кроме того, проверка паддинга FF FF FF... не требовала минимального количества байт — достаточно было 00 01 00.
Если для аккаунта авторизован RSA-ключ с экспонентой e=3, атакующий может:
1. Взять публичный ключ.
2. Сформировать префикс: 00 01 00 || DER(SHA-256 DigestInfo) || хэш || мусор.
3. Взять кубический корень от этого числа.
Кубирование при проверке восстанавливает корректный префикс, мусор в хвосте 7.23.3 игнорировал. Автор подтвердил: SSH-аутентификация без приватного ключа работала на 7.23.3, на 7.23.4 — отказ.
Затронуты все потребители этой функции: SSH, IPsec/IKEv2, TLS (ssld), ACME (cloud).
RSA-подпись без приватного ключа (forgery с e=3)
- Переполнение стека в mtget через TFTP
В nova/bin/mtget при формировании TFTP-запроса имя удаленного файла копировалось в стековый буфер фиксированного размера через rep movsb без проверки длины. Команда:
/tool fetch url="tftp://10.0.2.2/<длинный путь>" keep-result=no
Это аутентифицированная атака, но право test входит в стандартную группу read. То есть read-only оператор может ее выполнить. Автор подтвердил контролируемое перезаписывание EIP и выполнение произвольного ROP-вызова.