FlawOpen

flawopen.com/Teardowns/cve-2025-55182-react-server-components-rce

● CVE-2025-55182 · CVSS 10.0[1] · 심각
보안 연구 · FlawOpen

CVE-2025-55182: React2Shell RSC 원격 코드 실행 취약점

CVE-2025-55182는 React Server Components(RSC) payload 디코딩의 인증 없는 원격 코드 실행 취약점입니다. React는 결함을 확인했고 Google Threat Intelligence는 downloader, backdoor, miner 캠페인을 기록했습니다.[1], [4], [5]

💡 알기 쉬운 설명 (ELI5)

허용된 서비스 목록을 확인하는 접수 담당자를 떠올려 보세요. 잘못된 조회는 목록 템플릿에서 상속된 이름을 목록 소유자가 등록한 항목처럼 취급합니다. React 패치는 요청된 모듈 export가 해당 모듈 자체의 항목인지 확인합니다. 공개 권고문은 전체 악용 절차를 공개하지 않았습니다. 영향받는 패키지를 업데이트하세요.[1]

핵심 개념 및 용어

React Server Components (RSC)
React Server Components: 서버 렌더링과 Flight 데이터 교환을 위한 React 프로토콜 및 패키지입니다.[1]

프레임워크 매핑

근본 원인 분석 (Root Cause)

React는 Server Function endpoint payload 디코딩 결함을 확인했으며 RSC 지원만으로도 앱이 영향받을 수 있다고 밝혔습니다. 최초 공지는 상세 exploit을 제한했습니다. 공개 upstream patch는 requireModule() own-property 검사와 multipart 오류 처리를 추가합니다. 이는 구체적 보강이며 전체 취약점 재현은 아닙니다.[1], [2]

React2Shell 영향 버전 및 배포 범위

구성 요소 또는 배포범위 평가조치
react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack의 19.0, 19.1.0, 19.1.1 또는 19.2.0.Server-side RSC 지원이 있으면 앱이 자체 Server Function 엔드포인트를 선언하지 않아도 영향을 받을 수 있습니다. 서버 경계에 접근할 수 있어야 합니다.해당 패키지 계열을 19.0.1, 19.1.2 또는 19.2.1 이상으로 업그레이드하고 서버 아티팩트를 다시 빌드·배포하세요.
영향받는 15.x/16.x 릴리스 또는 14.3.0-canary.77 이후 canary를 사용하는 Next.js App Router.영향받는 프레임워크 통합에는 취약한 RSC 패키지가 포함됩니다. 앱에 자체 Server Function 엔드포인트가 없다는 이유만으로 안전하다고 판단하지 마세요.해당 계열의 패치 버전을 사용하세요: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 또는 16.0.7 이상. 이는 인용한 권고에 기록된 최소 릴리스입니다. 배포 전에 공급업체의 현재 브랜치를 확인하세요.
서버 측 RSC 지원이 없는 클라이언트 전용 React 앱.서버 디코더 경계가 없으므로 문서화된 CVE 범위 밖입니다.이 구성에는 React2Shell 서버 패치가 필요하지 않습니다. RSC 또는 서버 컴포넌트를 도입하면 다시 평가하세요.
배포가 패치되었다고 보고됨.manifest 버전만으로 모든 운영 리전, 미리보기 서비스, worker, 컨테이너가 수정된 아티팩트를 사용한다고 확인할 수 없습니다.운영, 미리보기, worker 환경의 이미지 digest와 확인된 패키지 버전을 검증하고 과거 노출 기간을 조사하세요.
2026-01-26 React 업데이트의 Next.js 브랜치별 버전 안내React의 후속 안내에는 더 최신 보안 릴리스가 포함되어 있습니다. 이는 CVE-2025-66478을 처음 수정한 최소 버전과 다릅니다. 관련 RSC 권고와 지원 브랜치에 따라 업데이트 목표가 달라질 수 있습니다.관련 RSC 권고 CVE-2025-55183, CVE-2025-55184, CVE-2025-67779, CVE-2026-23864에 대해 React는 수정 버전으로 19.0.4, 19.1.5, 19.2.4를 제시했습니다. 2026-01-26 Next.js 권고는 안정 버전 13.3.x–14.x에 14.2.35, 15.0.x에 15.0.8, 15.1.x에 15.1.12, 15.2.x에 15.2.9, 15.3.x에 15.3.9, 15.4.x에 15.4.11, 15.5.x에 15.5.10, 16.0.x에 16.0.11, 16.1.x에 16.1.5였습니다. 이는 관련 문제에 대한 후속 안내이며 CVE-2025-66478을 수정한 Next.js 최소 버전이 아닙니다. 배포 전에 최신 공급업체 권고와 지원 브랜치를 확인하세요.
CVE-2026-23869 — RSC 서비스 거부(2026-04-08).React에 따르면 Server Function 엔드포인트로 보낸 특수 제작 HTTP 요청은 포착 가능한 오류가 발생하기 전까지 최대 1분 동안 CPU를 과도하게 사용할 수 있습니다. 영향을 받는 react-server-dom-* 패키지 계열은 19.0.4, 19.1.5, 19.2.4까지입니다.React가 제시한 각 계열의 수정 버전은 19.0.5, 19.1.6, 19.2.5입니다.
CVE-2026-23870 — RSC 서비스 거부(2026-05-06).React에 따르면 특수 제작 HTTP 요청은 메모리 부족 예외나 과도한 CPU 사용을 일으킬 수 있습니다. 영향을 받는 react-server-dom-* 패키지 계열은 19.0.5, 19.1.6, 19.2.5까지입니다.React가 제시한 각 계열의 수정 버전은 19.0.6, 19.1.7, 19.2.6입니다.
CVE-2026-44907 — Server Functions 서비스 거부(2026-07-21).React에 따르면 특수 제작 HTTP 요청은 메모리 부족 예외나 과도한 CPU 사용을 일으킬 수 있습니다. 영향을 받는 react-server-dom-* 패키지 계열은 19.0.7, 19.1.8, 19.2.7까지입니다.React가 제시한 각 계열의 수정 버전은 19.0.8, 19.1.9, 19.2.8입니다.

단계별 공격 실행 흐름

단계 1

노출된 RSC 경계가 미인증 요청 수신

React는 자체 endpoint가 없어도 RSC 지원만으로 앱이 영향을 받을 수 있다고 설명합니다. 서버가 없는 클라이언트 전용 앱은 대상이 아닙니다.[1], [4]

단계 2

조작 요청이 취약한 디코더에 도달

벤더는 Server Function 요청 디코딩 결함이라고 설명합니다. 전체 exploit 절차는 공개되지 않았으므로 미공개 동작을 추측하지 마세요.[1], [2]

단계 3

웹 프로세스 권한으로 코드 실행

공지에 따르면 코드는 서버 프로세스 권한으로 실행됩니다. 영향은 해당 계정과 접근 가능한 비밀값 및 서비스에 달려 있습니다.[1], [4]

단계 4

Google GTIG가 tunneler, downloader, backdoor, miner 관찰

GTIG는 tunneller, downloader, backdoor, miner 배포를 관찰했습니다. 실제 악용 증거지만 모든 취약 호스트가 침해되었다는 뜻은 아닙니다.[5], [6]

소스 코드 비교: 취약한 구현 vs 보안 패치

이 upstream patch 발췌는 모듈 자체 export만 반환합니다. 디코더 결함 전체를 재현하거나 단독 수정안이 되지는 않습니다. 영향을 받는 React Server Components 패키지나 framework를 업데이트하세요.[2], [1]

소스 코드 발췌: React Parcel 클라이언트의 requireModule() 함수

취약한 구현
export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = parcelRequire(metadata[ID /* module id */]);
  return moduleExports[metadata[NAME]];
}
보안 강화 패치
export function requireModule<T>(metadata: ClientReference<T>): T {
  const moduleExports = parcelRequire(metadata[ID /* module id */]);
  if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
    return moduleExports[metadata[NAME]];
  }
  return (undefined: any);
}

엔지니어링 및 시스템 보안 강화 체크리스트

출처