
Моё исследование CVE-2025-55182
Этот репозиторий — моё исследование CVE-2025-55182, также известной как уязвимость React2Shell. Репозиторий состоит из двух основных частей: стенда и эксплоита.
Немного информации об этой уязвимости:
Уязвимость по сути представляет собой отсутствие проверки пользовательского ввода. Но не всё так просто =)
Клиентская часть React и серверная часть React используют протокол React Flight для обмена данными. Вот хороший доклад, чтобы быстро с ним ознакомиться.
Пример чанков сообщений протокола React Flight:
{
"0": (None, '["$1"]'),
"1": (None, '{"object":"fruit","name":"$2:fruitName"}'),
"2": (None, '{"fruitName":"cherry"}'),
}
Чанки RFP могут ссылаться друг на друга с помощью оператора $. Когда чанки впоследствии десериализуются на сервере, эти ссылки разрешаются. Ключевой момент здесь в том, что мы можем получить доступ к прототипу объекта.
Манипулируя прототипом, мы можем заставить V8 ожидать (await) наш .then(). Результирующая полезная нагрузка может выглядеть так:
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}',
"_response": {
"_prefix": f"return foo; ",
"_formData": {
"get": "$1:constructor:constructor",
},
},
}
Я не буду углубляться в детали того, как именно работает эта цепочка гаджетов; если хотите узнать больше, прочитайте отличный разбор здесь от Moritz Sanft.
Вы также можете посмотреть сравнение версий на GitHub, до и после патча, если хотите глубже разобраться в этой ошибке.
Я создал простое react/next.js приложение, которое использует (см. stand/package.json):
"dependencies": {
"next": "16.0.6",
"react": "19.2.0",
"react-dom": "19.2.0"
},
Просто страница с текстовым содержимым, созданная с помощью create-next-app:
Чтобы запустить, выполните это в каталоге stand:
docker compose up --build -d
Затем перейдите по адресу http://localhost:3000 в вашем браузере.
Эксплуатация довольно проста. Нам просто нужно отправить на сервер специально сконструированные чанки RFP с нашей полезной нагрузкой с помощью POST-запроса. См. exploit/src/main.py. Он также включает простую проверку, уязвим ли сервер: скрипт пытается выполнить команду whoami; если таймаут превышен, скорее всего, на сервере установлена пропатченная версия.
Вы можете увидеть полезную нагрузку RFP в exploit/resource/chunk.json.
Перед запуском эксплоита не забудьте настроить netcat-слушатель и обновить exploit/resource/config.toml, указав свой хост и порт, чтобы получить reverse shell.
Удачного pwn'инга!
Огромное уважение Lachlan Davidson, который обнаружил уязвимость, maple, который нашёл хороший гаджет, а также Moritz Sanft, который поделился своим PoC и написал отличный разбор.
создано I3r1h0n.