React RCE 취약점 CVE-2025-55182 및 CVE-2025-66478 분석

반응형

1. 취약점 개요

 

 

React 19 버전대에 심각한 원격 코드 실행(RCE) 취약점 두 가지가 발견되어 CVE-2025-55182 (React)와 CVE-2025-66478 (Next.js)로 공표되었습니다. 두 취약점 모두 React의 서버 컴포넌트(RSC) 기능에서 사용하는 “Flight” 프로토콜의 역직렬화 처리 로직의 결함이 원인이다. 공격자는 특수하게 조작된 HTTP 요청만으로 인증 없이도 서버 측에서 임의의 자바스크립트 코드를 실행할 수 있습니다. 특히 Next.js 프레임워크(앱 라우터 사용 시)는 React의 해당 취약점을 그대로 내포하고 있어 CVE-2025-66478로 식별되었으며, 기본 설정의 Next.js 애플리케이션도 별도 코드 수정 없이 공격에 노출될 수 있다고 합니다.

 

 

CVE-2025-55182는 React Server Components 구현체(react-server 패키지 및 react-server-dom-* 라이브러리)에서 발생하는 RCE 취약점이고, CVE-2025-66478은 이를 사용한 Next.js가 동일한 취약점으로 인해 영향을 받는 경우입니다. 근본적인 문제는 역직렬화(deserialization) 과정의 논리적 결함으로, 서버가 RSC Flight 페이로드를 해석할 때 입력 데이터 구조를 올바르게 검증하지 않고 신뢰하는 바람에 공격자 제공 값이 서버 측 로직 흐름을 제어하게 되는 것입니다. 그 결과 권한이 없는 원격 공격자가 단 한 번의 요청으로도 취약한 서버에서 임의의 코드를 실행할 수 있어 CVSS 10.0 만점의 치명적 위험도로 평가되었습니다. 해당 취약점은 2025년 11월 말 보고되었고 12월 초 패치와 함께 공개되었으며, 그 심각성과 exploitatation 용이성으로 인해 일각에서는 “React2Shell”이라는 별칭으로도 불리고 있습니다. (Log4Shell에 빗댄 명칭).

 

 

2. 코드 레벨 분석

 

 

이번 RCE 취약점의 Root Cause는 React 서버 런타임이 클라이언트로부터 전달받은 RSC 요청을 역직렬화하는 과정에서 모듈 export 프로퍼티에 대한 검증을 누락한 데 있습니다. 구체적으로, React의 ReactFlightDOMServerNode.jsrequireModule 함수가 클라이언트가 요청한 모듈의 export 이름을 신뢰하여 그대로 접근하는 로직이 문제가 되었습니다.

https://github.com/dwisiswant0/CVE-2025-55182/blob/master/exploit.js

 

CVE-2025-55182/exploit.js at master · dwisiswant0/CVE-2025-55182

Pre-auth RCE in React Server Components versions 19.0.0, 19.1.0, 19.1.1, and 19.2.0. - dwisiswant0/CVE-2025-55182

github.com

 

익스플로잇 코드는 github에 공개되어 있습니다. 아래는 간단한 예시입니다.

// (취약한 동작 예시) 클라이언트가 보낸 metadata.name으로 모듈 export에 접근
function requireModule(moduleExports, name) {
  return moduleExports[name];  // name에 대한 검증 없이 프로퍼티에 접근
}

// 예를 들어, moduleExports가 함수일 때:
module.exports = function updateProfile() { /* ... */ };
requireModule(module.exports, "constructor"); 
// -> module.exports.constructor를 반환 (검증 누락)

 

위 코드처럼 내부 구현에 hasOwnProperty 같은 검증이 없어 클라이언트가 요청한 name이 해당 모듈에 개발자가 의도적으로 내보낸(export) 프로퍼티가 아니더라도 프로토타입 체인에 존재하는 모든 속성을 가져올 수 있게 됩니다. 특히 모듈이 함수(Function) 형태로 export된 경우 심각한 문제가 발생합니다. 자바스크립트에서 함수는 객체이므로 constructor라는 속성을 가지는데, 보통 함수 객체의 constructor는 전역 Function 생성자를 가리킵니다. 따라서 공격자가 name 값으로 "constructor"를 지정하면, 해당 모듈이 export한 함수의 constructor 속성에 접근하여 전역 Function 생성자에 대한 참조를 얻을 수 있습니다. 그야말로 아무 함수나 문자열로 선언해서 사용할 수 있는 것입니다.

 

React 서버는 클라이언트가 보낸 액션 ID를 기준으로 어떤 서버 측 함수를 호출할지 결정하는데, 공격자는 해당 ID를 조작하여 자신이 만든 Function 객체(즉 전역 Function 생성자에 악성 코드를 바인딩한 함수)를 가리키도록 할 수 있습니다. 이렇게 되면 React는 이것을 정상적인 서버 액션 호출로 오인하여 그대로 실행해 버리는데, 사실상 그 “액션”은 공격자가 공급한 악성 함수인 셈입니다. 결과적으로 서버는 공격자가 의도한 임의의 코드를 실행하게 됩니다.

 

React RSC의 역직렬화 로직에서 신뢰할 수 없는 name 속성에 대한 필터링이 없어, 모듈 export의 프로토타입 체인 상 속성(constructor)까지 노출된 것입니다. 이로 인해 전역 Function 생성자를 호출할 수 있는 참조를 얻게 되었고, RSC의 바운드 함수 호출 구조와 결합되어 최종적으로 원격 코드 실행으로 이어졌습니다. 이러한 결함은 상속된 속성 접근에 대한 검증 부재가 근본 원인입니다.

 

패치는 React 19.0.1, 19.1.2, 19.2.1 등에 적용되었으며, requireModule에서 상속된 속성에 접근하지 못하도록 hasOwnProperty 체크를 추가하는 등의 조치가 이루어졌습니다. 또한 파일 업로드 시 Base64로 인코딩된 데이터를 다루는 부분도 강화하여 악용 가능성을 차단했습니다. 패치 이후에는 클라이언트가 존재하지 않는 export 이름이나 프로토타입 체인 속성을 요구할 경우 역직렬화 단계에서 에러가 발생하여 더 이상 RCE로 이어지지 않습니다 (패치된 버전에서는 공격 시도 시 bind를 호출하려다 undefined에 접근하는 오류로 실행이 중단됨)

 

 

공격 시나리오 및 PoC

나노바나나 생성 이미지

이 공격은 난이도가 매우 낮은 편입니다. 공격자는 특정한 HTTP 요청 한 번으로 취약한 서버를 장악할 수 있기 때문이다. 별도 인증이나 탐색 절차도 필요없고, 냅다 공격 페이로드 실행해보면 취약한 서버의 경우 코드를 실해하고 유효한 응답이 수신되기 때문이다.

대상 선정: 먼저 공격자는 대상 웹애플리케이션이 React 19 기반의 RSC 기능(Next.js 앱 라우터 등)을 사용 중인지 파악합니다. Next.js 13 이상(15,16 버전 포함)으로 구축된 사이트나 RSC 프레임워크 사용 흔적이 있다면 취약할 가능성이 높습니다. (실제로 Wiz의 연구에 따르면 클라우드 환경의 약 39%가 이번 취약한 버전의 React/Next.js 인스턴스를 포함하고 있었다고 한다.)

악성 페이로드 제작: 공격자는 RSC의 Flight 프로토콜 형식에 맞춘 특수한 페이로드를 생성합니다. 예를 들어, Next.js의 경우 _next 경로 하위에 서버 액션 호출을 위한 엔드포인트가 있으며 여기에 필요한 헤더(Next-Action 또는 RSC-Action-ID 등)와 폼 데이터 등을 첨부해 POST 요청을 보낼 수 있습니다

요청에는 평문으로 표현하면 다음과 같은 내용이 포함됩니다:
모듈 식별자와 export 이름: 예컨대 user-profile-action#constructor처럼 모듈 이름 뒤에 #constructor를 붙여, 해당 모듈의 constructor 속성을 요구합니다.
여기서 user-profile-action은 원래 애플리케이션에 존재하는 서버 액션 모듈 식별자이며, #constructor는 취약점을 노린 부분입니다.
바운드될 인자: 실행시키려는 악성 코드 문자열을 배열 형태로 첨부합니다. 예를 들어 \["console.log('Pwned!')"\] 또는 \["require('child\_process').exec('touch /tmp/pwned')"\] 와 같이 JavaScript 코드 한 줄을 문자열로 넣을 수 있습니다.

// 공격자가 구성한 서버 액션 호출 페이로드의 효과 (의사 코드)
const moduleExports = require('user-profile-action');    // 정상 모듈 로드
const FnConstructor = moduleExports["constructor"];      // 취약: 'constructor' 프로퍼티 획득 (Function 생성자)
const maliciousFunc = FnConstructor.bind(null, "console.log('서버 공격 성공')");
// 이제 maliciousFunc를 서버 액션으로 호출:
maliciousFunc();  // 내부적으로 new Function("console.log('서버 공격 성공')") 실행

 

위 가상의 흐름처럼 서버는 공격자가 보낸 문자열을 new Function으로 실행하게 되며, 결과적으로 원격 명령 실행이 이뤄집니다. 이 공격은 단일 HTTP 요청으로 완료되기에 탐지와 대응이 어렵고, 웹 방화벽(WAF)의 보호가 없거나 패치가 적용되지 않은 서비스라면 쉽게 뚫릴 수 있습니다.

 

영향도와 대응방안

 

이번 취약점들은 React 생태계에서 전례 없이 심각한 보안 버그로 평가됩니다. 서버 사이드에서 사용되는 React/Next.js 코드의 보안 취약으로 RCE가 발생한 것은 매우 이례적이며, 수많은 현대 웹애플리케이션에 광범위한 영향을 줄 수 있기 때문입니다. 특히 Next.js 앱의 기본 설정조차 영향받았다는 점, 그리고 익명 원격 공격으로 한 방에 서버를 장악할 수 있다는 점에서 공격자들의 관심이 집중되고 있습니다. 실제로 공개 직후부터 관련 취약점에 대한 공격 시도가 급증할 것으로 예상되고 있으며, 보안 업계에서는 이를 “언제 공격당해도 이상하지 않은” 상황으로 인식하고 있습니다.

 

영향 범위: React 19.0.0 ~ 19.2.0 및 이를 활용한 Next.js 15.x, 16.x 등이 모두 취약


취약점 악용의 파급력: 공격 성공 시 애플리케이션 서버에서 임의 코드 실행이 가능하므로, 공격자는 서버 권한으로 데이터베이스 접속, 민감정보 탈취, 랜섬웨어 설치 등 2차 피해 가능
Next.js 등의 서버가 Node.js 환경에서 동작하므로 Node.js API를 통해 OS 명령 실행, 파일 읽기/쓰기, 네트워크 접근 가능

패치 적용: React는 해당 취약점을 수정한 버전을 릴리즈했으며, React react-server-dom-* 패키지는 19.0.1, 19.1.2, 19.2.1로 업데이트되었습니다.

Next.js도 각 메이저 버전에 대한 보안 업데이트를 배포하여, 15.0.5 / 15.1.9 / 15.2.6 / 15.3.6 / 15.4.8 / 15.5.7 / 16.0.7 등으로 업그레이드할 것을 권고하고 있습니다.

https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components

 

Critical Security Vulnerability in React Server Components – React

The library for web and native user interfaces

react.dev

 

 

참고자료

https://www.wiz.io/blog/critical-vulnerability-in-react-cve-2025-55182

 

Critical RCE Vulnerabilities Discovered in React & Next.js | Wiz Blog

React and Next.js are exposed to critical unauthenticated RCE via CVE-2025-55182 and CVE-2025-66478. Learn which versions are impacted and how to mitigate.

www.wiz.io

https://vercel.com/changelog/cve-2025-55182

 

Summary of CVE-2025-55182 - Vercel

Vercel has provided a patch for CVE-2025-55182 affecting any frameworks allowing Server Components usage.

vercel.com

https://cloud.google.com/blog/products/identity-security/responding-to-cve-2025-55182?hl=en

 

Responding to CVE-2025-55182 | Google Cloud Blog

Follow these recommendations to minimize remote code execution risks in React and Next.js from CVE-2025-55182 vulnerabilities.

cloud.google.com