
CVE-2025-55182(React2Shell)에 대한 상세 기술 분석으로, React의 Flight 프로토콜 내부를 추적하여 익스플로잇 체인, 페이로드 제작, 수정 분석을 설명합니다.
저자: Kavienan J
취약점 발견자: lachlan2k, React 팀에 책임감 있게 공개했습니다.
이 취약점에 대한 업데이트는 다음에서 확인하세요: react2shell.com
CVE-2025-55182는 심각도 10.0/10.0으로 평가되었습니다. 공개된 PoC를 살펴보셨다면, 익스플로잇이 작동하는 모습은 보여주지만 왜 페이로드가 그렇게 생겼는지에 대한 설명이 부족하다고 느끼셨을 수 있습니다. React Flight 프로토콜이 매우 복잡하기 때문에 당연한 일입니다.
Flight는 React Server Components와 Server Actions 뒤에 있는 직렬화 계층으로, 1,100줄 이상의 복잡한 상태 머신이며, 직접 코드를 추적하지 않으면 그 동작이 직관적이지 않습니다.
커뮤니티 PoC는 이 취약점을 명확히 보여줍니다:
…하지만 '왜 이게 작동하지?'라는 질문에 답하려고 하면, 한 줄 한 줄 읽히도록 설계되지 않은 React 내부를 깊이 탐험하게 됩니다.
참고: 많은 PoC가 수정 사항을
requireModule의 변경 사항으로 잘못 돌립니다. 수정 사항에서 살펴보겠지만, 익스플로잇 페이로드는 해당 함수에 도달하지 않습니다. 실제 취약 코드는 전적으로ReactFlightReplyServer.js에 있습니다.
이 글은 React의 디코딩 및 청크 초기화 로직을 단계별로 추적하여 익스플로잇 체인을 역공학하려는 시도입니다. 여기서 논의되는 모든 동작은 수정 전 ReactFlightReplyServer.js가 작동하던 방식(참조: https://github.com/facebook/react/blob/v19.2.0/packages/react-server/src/ReactFlightReplyServer.js)에서 직접 가져온 것으로, 충분한 인내심을 가진 React/JS 개발자가 따라갈 수 있도록 간결하게 단순화되었습니다.
다음 섹션: 배경