“웹 페이지 하나로 서버 쉘이 따인다고요?” — React2Shell 쉽게 풀어보기 🌐
안녕하세요 구독자님!! 오늘은 보안 업계가 발칵 뒤집힌 React2Shell (CVE-2025-55182) 소식을 들고 왔어요. 이름부터 무시무시한 이 취약점, CVSS 점수가 무려 10점 만점에 10점! 🔥 React나 Next.js를 쓰고 있다면 꼭 한번 훑어보셔야 해요.

🚨 핵심 요약 (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가지
- 검증 부재 : Flight Protocol 파싱 과정(getOutlinedModel)에서 참조 경로에 대한 검증이 없어 __proto__ 접근이 허용됨.
- 실행 흐름 조작 : Chunk 객체의 then 속성을 오염시켜, 서버가 의도치 않은 초기화 로직(initializeModelChunk)을 실행하게 만듦
- 함수 호출 악용 : 내부 Blob 처리 로직(reviveModel)에서 response._formData.get 함수를 Function 생성자로 치환하여 임의 코드 실행.
Step 1 : React Server Action
서버가 클라이언트에서 받은 데이터를 해석할 때, 금지된 구역인 __proto__에 접근하는 걸 막지 않았어요.

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

Flight Protocol의 취약점을 이용해 Chunk.prototype에 접근하고, Chunk.prototype.then을 오염시켜, 시스템이 공격자가 의도한 데이터로 초기화 함수인 initializeModelChunk를 실행하도록 유도합니다.
내부의 reviveModel 함수와 response._formData.get 호출 과정을 악용하여 Function.constructor에 접근해 악성 코드를 실행할 수 있는 취약점 입니다.

🛡️ 그럼, 본 취약점을 어떻게 막을 수 있을까요?
제조사에서 긴급 보안 패치를 공개했어요. 패치의 핵심 내용은 역직렬화 단계에서의 엄격한 화이트리스트 검증입니다.
JavaScript
이제 서버는 데이터를 객체로 바꾸기 전에, 공격에 사용될 수 있는 위험한 키워드나 모듈 참조가 있는지 SAX 파서처럼 미리 검사하고 차단합니다.
📚 보안 용어 정리
- RSC (React Server Components): 클라이언트 대신 서버에서 로직을 수행하고, 그 결과(UI)만 브라우저로 전송하는 서버 전용 컴포넌트 기술
- Flight Payload: 서버에서 처리된 RSC 결과물을 클라이언트로 전달하기 위해 사용하는 React 고유의 데이터 전송 포맷
- 역직렬화 (Deserialization): 전송받은 문자열 데이터(Payload)를 다시 실제 자바스크립트 객체로 복원하는 과정으로, 이때 변조된 코드가 유입되어 실행
오늘은 최신 모던 웹 취약점인 React2Shell을 함께 살펴봤습니다. 최신 프레임워크라고 해서 무조건 안전한 것은 아니라는 점, 역시 보안은 '검증'에서 시작된다는 걸 다시 느끼게 되네요! 🕵️♀️
끝까지 읽어주셔서 감사합니다. 다음 호에서 뵙겠습니다 :)
의견을 남겨주세요