CVE

CVE-2025-55182 (React2Shell)

조작된 Flight Payload를 취약한 Next.js 서버에 전송하여 발생하는 RCE 취약점

2026.01.20 | 조회 198 |
0
|

“웹 페이지 하나로 서버 쉘이 따인다고요?” — React2Shell 쉽게 풀어보기 🌐

  안녕하세요 구독자님!! 오늘은 보안 업계가 발칵 뒤집힌 React2Shell (CVE-2025-55182) 소식을 들고 왔어요. 이름부터 무시무시한 이 취약점, CVSS 점수가 무려 10점 만점에 10점! 🔥 React나 Next.js를 쓰고 있다면 꼭 한번 훑어보셔야 해요.  

출처 : https://nvd.nist.gov/vuln/detail/CVE-2025-55182
출처 : https://nvd.nist.gov/vuln/detail/CVE-2025-55182

🚨 핵심 요약 (Key Takeaways)

  • 취약점 명: React2Shell (CVE-2025-55182)
  • 위협 등급: CVSS 10.0 (Critical)
  • 영향 범위: React 및 Next.js 기반 서비스 (특히 React Server Component 사용 환경)
  • 위협 내용: 인증 없이 원격 코드 실행(RCE) 가능, 시스템 완전 장악 위험

 


🔍 CVE-2025-55182 취약점 상세 분석

이 취약점의 핵심은 자바스크립트의 '프로토타입 오염(Prototype Pollution)'을 이용하는 것입니다. React 서버 컴포넌트(RSC)가 데이터를 주고받는 Flight Protocol의 구조적 허점을 파고듭니다.

본 취약점 공격이 성립할 수 있는 3가지 기술적 원인을 정리해보았습니다.

 

💡 취약점 핵심 원인 3가지

  1. 검증 부재 : Flight Protocol 파싱 과정(getOutlinedModel)에서 참조 경로에 대한 검증이 없어 __proto__ 접근이 허용됨.
  2. 실행 흐름 조작 : Chunk 객체의 then 속성을 오염시켜, 서버가 의도치 않은 초기화 로직(initializeModelChunk)을 실행하게 만듦
  3. 함수 호출 악용 : 내부 Blob 처리 로직(reviveModel)에서 response._formData.get 함수를 Function 생성자로 치환하여 임의 코드 실행.

Step 1 : React Server Action 

서버가 클라이언트에서 받은 데이터를 해석할 때, 금지된 구역인 __proto__에 접근하는 걸 막지 않았어요.

출처 : https://ko.react.dev/reference/rsc/server-functions
출처 : https://ko.react.dev/reference/rsc/server-functions

React에서는 Server Action을 사용하고 있었습니다. 이 Server Action은 클라이언트가 서버 함수를 직접 호출하는 편리한 기능이지만, 입력값을 검증하지 않으면 서버가 해커가 보낸 악성 코드를 그대로 실행해버리는 치명적인 통로가 될 수 있습니다.  

 

Step 2 : Flight Protocol

React는 클라이언트 부담을 줄이기 위해 서버에서 컴포넌트를 렌더링하는 RSC(React Server Components)를 도입했습니다. 이때 서버와 클라이언트 간 복잡한 데이터를 직렬화하여 주고받기 위해 Flight Protocol이라는 독자적인 프로토콜을 사용했어요.

 

🚨이번 취약점은 React가 Flight Protocol을 처리하는 과정에서 발생합니다.🚨

본 프로토콜의 유효성 검사가 일부 누락되어 있어, 공격자는 이를 악용하여 ReactFlightReplyServer.js 내의 getOutlinedModel 함수가 참조 경로를 처리할 때, __proto__와 같은 위험 속성의 검증이 미흡하였습니다.

그래서 공격자는 $1:__proto__:aaa와 같은 표현식을 통해 객체의 프로토타입에 접근하고 조작하며 본 취약점을 발생시킬 수 있었던 것이죠.

 

Step 3 : Javascript proto

  Javascript의 proto는 객체들이 공통으로 참조하는 속성입니다. 공격자가 이 속성을 변조하여 악성 명령어를 심어두면, 이를 참조하는 모든 일반 객체에서도 해당 명령어가 유효한 것으로 인식되어 서버 전체에서 공격자의 코드가 실행되는 취약점입니다.  

출처 : https://malwareanalysis.tistory.com/884
출처 : https://malwareanalysis.tistory.com/884

Flight Protocol의 취약점을 이용해 Chunk.prototype에 접근하고, Chunk.prototype.then을 오염시켜, 시스템이 공격자가 의도한 데이터로 초기화 함수인 initializeModelChunk를 실행하도록 유도합니다.

내부의 reviveModel 함수 response._formData.get 호출 과정을 악용하여 Function.constructor에 접근해 악성 코드를 실행할 수 있는 취약점 입니다. 

출처 : https://github.com/msanft/CVE-2025-55182/blob/main/poc.py
출처 : https://github.com/msanft/CVE-2025-55182/blob/main/poc.py

🛡️ 그럼, 본 취약점을 어떻게 막을 수 있을까요?

제조사에서 긴급 보안 패치를 공개했어요. 패치의 핵심 내용은 역직렬화 단계에서의 엄격한 화이트리스트 검증입니다.

JavaScript

// 패치 로직 예시 (가상 코드)
function safeDeserialize(payload) {
if (payload.includes("__proto__") || payload.includes("child_process")) {
throw new Error("Invalid Metadata: Malicious payload detected");
}
// 허용된 객체 타입(String, Number, Safe Object)만 복원 허용
return parseRSC(payload, SAFE_SCHEMA);
}

이제 서버는 데이터를 객체로 바꾸기 전에, 공격에 사용될 수 있는 위험한 키워드나 모듈 참조가 있는지 SAX 파서처럼 미리 검사하고 차단합니다.

 


📚 보안 용어 정리

  1. RSC (React Server Components): 클라이언트 대신 서버에서 로직을 수행하고, 그 결과(UI)만 브라우저로 전송하는 서버 전용 컴포넌트 기술
  2. Flight Payload: 서버에서 처리된 RSC 결과물을 클라이언트로 전달하기 위해 사용하는 React 고유의 데이터 전송 포맷
  3. 역직렬화 (Deserialization): 전송받은 문자열 데이터(Payload)를 다시 실제 자바스크립트 객체로 복원하는 과정으로, 이때 변조된 코드가 유입되어 실행

오늘은 최신 모던 웹 취약점인 React2Shell을 함께 살펴봤습니다. 최신 프레임워크라고 해서 무조건 안전한 것은 아니라는 점, 역시 보안은 '검증'에서 시작된다는 걸 다시 느끼게 되네요! 🕵️‍♀️

끝까지 읽어주셔서 감사합니다. 다음 호에서 뵙겠습니다 :)

다가올 뉴스레터가 궁금하신가요?

지금 구독해서 새로운 레터를 받아보세요

✉️

이번 뉴스레터 어떠셨나요?

tori 해킹 일지 님에게 ☕️ 커피와 ✉️ 쪽지를 보내보세요!

댓글

의견을 남겨주세요

확인
의견이 있으신가요? 제일 먼저 댓글을 달아보세요 !

다른 뉴스레터

© 2026 tori 해킹 일지

"tori 해킹 일지"는 해킹 기법과 취약점 분석을 매주 쉽게 풀어내는 보안 뉴스레터입니다.

메일리 로고

도움말 오류 및 기능 관련 제보

서비스 이용 문의admin@team.maily.so 채팅으로 문의하기

메일리 사업자 정보

메일리 (대표자: 이한결) | 사업자번호: 717-47-00705 | 서울특별시 송파구 위례광장로 199, 5층 501-8호

이용약관 | 개인정보처리방침 | 정기결제 이용약관 | 라이선스