2025년 12월, 프론트엔드 생태계의 위기
현대 웹 개발의 표준으로 자리 잡은 React 생태계가 전례 없는 보안 위협에 직면했습니다. React2Shell(CVE-2025-55182)이라 명명된 이 취약점은 보안 등급 평가(CVSS)에서 10.0 만점을 기록할 정도로 치명적입니다. 이는 2021년 전 세계를 강타했던 Log4Shell 사태를 연상시키며, 인증되지 않은 공격자가 단 하나의 HTTP 요청만으로 서버의 제어권을 완전히 탈취할 수 있게 합니다.
단순한 코딩 실수가 아닙니다. 이는 서버와 클라이언트의 경계를 허무는 React Server Components(RSC) 아키텍처의 핵심 통신 프로토콜인 ‘Flight’의 구조적 결함에서 비롯되었습니다. 현재 Next.js를 포함한 수많은 프레임워크가 이 위험에 노출되어 있으며, 중국 및 북한 연계 해킹 그룹의 활발한 공격이 관측되고 있습니다.
1. React2Shell이란 무엇인가?
React2Shell은 React 19의 핵심 기능인 React Server Components(RSC)를 구현하는 패키지(`react-server-dom-*`)에서 발견된 원격 코드 실행(RCE) 취약점입니다. 공격자는 특수하게 조작된 데이터를 서버로 전송하여, 서버가 이를 처리하는 과정에서 임의의 자바스크립트 코드를 실행하게 만듭니다.
🔑 핵심 요약 (Key Facts)
- CVE ID: CVE-2025-55182 (React), CVE-2025-66478 (Next.js)
- CVSS 점수: 10.0 (Critical) – 인증 불필요, 복잡도 낮음, 시스템 장악 가능
- 영향 범위: React 19.x, Next.js 15.x/16.x (App Router 사용 시), Waku, RedwoodJS 등
- 공격 난이도: 매우 낮음 (공개된 PoC 존재)
2. 기술적 심층 분석: Flight 프로토콜의 맹점
이 취약점의 핵심은 RSC가 데이터를 직렬화(Serialization)하여 주고받는 Flight 프로토콜에 있습니다. Flight 프로토콜은 데이터 스트림을 전송할 때, 데이터 타입을 식별하기 위해 `$`(참조), `$@`(모델 참조), `$F`(서버 함수)와 같은 접두사를 사용합니다.
2-1. 안전하지 않은 역직렬화 (Insecure Deserialization)
서버는 클라이언트로부터 받은 데이터를 역직렬화하여 객체로 복원합니다. 이 과정에서 React 서버 로직은 입력된 객체의 속성을 검증할 때 hasOwnProperty 체크를 느슨하게 수행했습니다. 공격자는 이 점을 악용하여 객체의 프로토타입 체인을 조작하고, Function 생성자에 접근할 수 있게 됩니다.
sequenceDiagram
participant Attacker as 공격자
participant Server as 취약한 React 서버 (RSC)
participant Execution as RCE 발생
Attacker->>Server: 조작된 Flight 페이로드 전송 (POST)
Note right of Attacker: JSON 내에 '.then' 속성과
'$3:constructor' 포함
Server->>Server: 페이로드 역직렬화 시작
Server->>Server: 악성 객체를 Promise(Thenable)로 오인
Server->>Server: '.then' 함수 자동 실행 시도
Server->>Execution: Function 생성자로 임의 코드 실행 (RCE)
Execution-->>Attacker: 서버 제어권 탈취 완료
2-2. 공격 페이로드의 구조 (Gadget Chain)
공격자는 다음과 같은 형태의 복잡한 페이로드를 구성하여 서버를 속입니다. 이는 전형적인 가젯 체인(Gadget Chain) 공격입니다.
/* 공격자가 전송하는 악성 페이로드 예시 (개념 증명) */
const payload = {
'0': '$1', // 청크 1번 참조
'1': {
'status': 'resolved_model', // 서버가 이미 완료된 작업으로 착각하게 만듦
'value': {
'then': '$3:map', //.then 속성을 통해 Promise 처럼 동작 유도
'0': { 'then': '$B3' } // 내부 가젯 체인 트리거
}
},
'3':, // 빈 배열
'4': {
'_formData': {
'get': '$3:constructor:constructor' // 배열 -> 생성자(Array) -> 생성자(Function) 접근
},
'_prefix': 'console.log("HACKED")//' // 실행될 악성 코드
}
}
이 페이로드는 서버가 Function("console.log('HACKED')")를 실행하도록 만듭니다. 이는 사실상 eval()과 동일한 효과를 내며, 공격자는 이를 통해 쉘 명령어를 실행하거나 민감한 데이터를 탈취할 수 있습니다.
3. 영향받는 버전 및 프레임워크 (Next.js 필수 확인)
본인의 프로젝트가 아래 버전에 해당한다면, 즉시 업데이트가 필요합니다. 특히 Next.js의 App Router를 사용하는 경우 기본 설정만으로도 취약합니다.
| 패키지 / 프레임워크 | 취약한 버전 (업데이트 필수) | 안전한 패치 버전 |
|---|---|---|
| Next.js (App Router) | 15.0.0 ~ 15.0.4 15.1.0 ~ 15.1.8 16.0.0 ~ 16.0.6 14.x Canary (14.3.0-canary.77+) |
15.0.5+ 15.1.9+ 16.0.7+ 14.x Stable로 다운그레이드 권장 |
| React Core (Server DOM) | 19.0.0 ~ 19.2.0 (react-server-dom-webpack 등) |
19.0.1, 19.1.2, 19.2.1 이상 |
| Expo (React Native) | SDK 53, 54 (RSC 사용 시) | react-server-dom-webpack 19.1.4+ |
| Waku / RedwoodJS | RSC 기능을 사용하는 모든 구버전 | 최신 의존성 업데이트 필수 |
4. 실제 공격 동향 (Threat Intelligence)
보안 연구소의 리포트에 따르면, 취약점 공개 직후부터 다음과 같은 공격들이 활발히 진행되고 있습니다.
⚠️ 주요 위협 그룹 및 공격 방식
- 중국 연계 그룹 (Earth Lamia 등): 대규모 자동화 스캐닝을 통해 노출된 Next.js 서버를 식별하고, 웹쉘(Webshell)을 설치하여 지속적인 접근 권한을 확보하려 시도하고 있습니다.
- 북한 연계 그룹 (UNC5342): ‘EtherHiding’ 기법을 사용하여 블록체인 트랜잭션에 악성 코드를 숨겨 전달하거나, 암호화폐 탈취를 목적으로 서버를 장악하고 있습니다.
- 사이버 범죄 조직: 서버 자원을 탈취하여 모네로(Monero) 채굴기(XMRig)를 실행하거나,
.env파일을 스캔하여 AWS Access Key 및 DB 비밀번호를 탈취하고 있습니다.
5. 긴급 대응 및 패치 가이드
가장 확실하고 유일한 해결책은 의존성 패키지를 업데이트하는 것입니다. 아래 명령어를 사용하여 즉시 패치를 적용하세요.
5-1. 패키지 업데이트 명령어
Next.js 및 React 관련 패키지를 최신 버전으로 업데이트합니다.
# npm을 사용하는 경우
npm install next@latest react@latest react-dom@latest
# yarn을 사용하는 경우
yarn upgrade next react react-dom
# 업데이트 후 버전 확인 (필수)
npm list next react-server-dom-webpack
5-2. 시크릿 키 회전 (Secret Rotation)
만약 서버가 이미 인터넷에 노출되어 있었다면, 공격자가 환경 변수를 탈취했을 가능성을 배제할 수 없습니다. 패치 후 반드시 다음 정보를 재발급받으세요.
- ✅ AWS / GCP / Azure 클라우드 액세스 키
- ✅ 데이터베이스 접속 비밀번호
- ✅ 서드파티 API 키 (Stripe, SendGrid 등)
- ✅ JWT 서명에 사용되는 Secret Key
6. 침해 탐지 및 모니터링 전략
이미 침해당했는지 확인하거나, 공격 시도를 실시간으로 탐지하기 위해 다음 방법을 사용하세요.
6-1. 네트워크 로그 분석
HTTP POST 요청 중 Next-Action 헤더가 포함되어 있고, 요청 본문에 $, $@, $F와 같은 Flight 프로토콜 특수 문자가 과도하게 포함된 경우를 모니터링하세요. 특히 페이로드 내에 constructor, prototype 문자열이 있다면 공격일 확률이 높습니다.
6-2. 런타임 보안 (Falco Rule)
서버 프로세스에서 의심스러운 쉘 명령어가 실행되는지 감시하는 Falco 규칙 예시입니다.
# Sysdig/Falco 탐지 규칙 예시
- rule: Detecting React2Shell RCE
desc: Detects suspicious shell execution from Node.js/Next.js processes
condition: >
spawned_process and
proc.name in (bash, sh, curl, wget, python) and
proc.pname in (node, next-server)
output: "Possible React2Shell exploitation: %proc.cmdline spawned by %proc.pname"
priority: CRITICAL