‘React2Shell’ RSC가 뚫리는 원리와 대응법

최근 React 및 Next.js 생태계를 뒤흔든 'React2Shell' 취약점의 기술적 원리와 대응 방안을 상세히 분석합니다. 서버 컴포넌트(RSC) 사용 시 반드시 알아야 할 보안 수칙을 확인하세요.

React2ShellRSCCVE-2025-55182
--

안녕하세요! 오늘은 최근 React 및 Next.js 생태계를 뒤흔든 React2Shell(CVE-2025-55182) 취약점에 대해 심층적으로 다뤄보려 합니다. 이 취약점은 보안 위험도 점수인 CVSS가 무려 **10.0(최고점)**에 달할 정도로 매우 치명적입니다.

단순한 버그를 넘어, 현대적인 프론트엔드 아키텍처인 **서버 컴포넌트(RSC)**의 핵심 로직에서 발생한 문제인 만큼,

그 원리와 방어 방법을 정확히 이해하는 것이 중요합니다.


1. 사전 지식: RSC와 Flight 프로토콜

취약점을 이해하기 위해 먼저 두 가지 핵심 개념을 알아야 합니다.

React 서버 컴포넌트(RSC)란?

기존의 클라이언트 사이드 렌더링(CSR)과 달리, 서버에서만 실행되는 컴포넌트입니다. 서버의 자원(DB, 파일 시스템 등)에 직접 접근할 수 있고, 결과물만 클라이언트로 전송하여 초기 로딩 속도를 최적화합니다.

Flight 프로토콜이란?

서버에서 생성된 RSC의 결과를 클라이언트로 전달할 때 사용하는 React 전용 직렬화(Serialization) 형식입니다.

JSON과 유사하지만, 컴포넌트 트리와 함수(Server Actions) 등을 스트리밍 방식으로 효율적으로 전달하기 위해 설계되었습니다.


2. React2Shell 취약점의 정체 (CVE-2025-55182)

이 취약점은 RSC의 데이터를 처리하는 역직렬화(Deserialization) 과정에서 발생합니다.

  • 핵심 요약: 공격자가 조작된 데이터를 보내 서버에서 **원격 코드 실행(RCE)**을 유도함.
  • 위험성: 별도의 로그인(인증) 절차 없이 단 한 번의 요청만으로 서버 제어권을 탈취당할 수 있음.

어떻게 공격이 이루어지나요?

  1. 조작된 페이로드: 공격자가 일반적인 데이터가 아닌, 실행 가능한 코드 형태를 포함한 조작된 Flight 데이터를 서버에 보냅니다.
  2. 역직렬화 오류: 서버가 이 데이터를 읽어 들이는 과정에서, 특정 데이터 타입을 잘못 해석하여 공격자의 코드를 서버 환경에서 즉시 실행하게 됩니다.

3. 기술적 심층 분석: 어떻게 코드가 실행되는가?

이 취약점의 기술적 핵심은 "데이터가 코드로 변하는 마법(역직렬화 취약점)"에 있습니다.

Flight 프로토콜의 취약한 구조

RSC는 데이터를 보낼 때 한 줄씩 처리되는 스트리밍 형식을 사용합니다. 각 줄은 J(JSON), M(모듈), S(심볼) 등의 태그로 시작합니다.

코드 레벨의 공격 원리 (Prototype Pollution)

공격자는 서버가 Flight 데이터를 파싱하여 객체를 생성하는 과정에서 __proto__나 특정 내부 예약어를 조작한 페이로드를 주입합니다.

[공격 페이로드 예시 (개념적)]

실제 공격은 복잡한 인코딩을 거치지만, 원리는 아래와 같이 서버 객체의 원형을 오염시키는 방식입니다.

// 공격자가 서버 액션 호출을 가로채서 보내는 악성 페이로드 예시
{
  "id": "action_id_123",
  "bound": {
    "__proto__": {
      "shell": "node",
      "exec": "rm -rf /" // 서버에서 위험한 명령어를 실행하도록 유도
    }
  }
}

취약점이 발생하는 지점 (Vulnerable Point)

React 내부의 parseModel 또는 resolveClientReference 함수에서 서버로 들어오는 데이터가 "어떤 모듈을 로드할지" 결정할 때 발생합니다. 서버는 이 데이터를 해석하며 필요한 모듈을 가져오는데, 이때 공격자가 주입한 경로의 모듈이나 내장 child_process 등을 실행하게 되는 것입니다.


4. 추가로 발견된 취약점들

이번 이슈는 단순 RCE 외에도 복합적인 문제를 안고 있습니다.

취약점 번호위험도영향설명
CVE-2025-55184높음DoS (서비스 거부)대량의 리소스를 소모하게 하여 서버를 마비시킴
CVE-2025-55183중간정보 유출서버의 소스 코드나 환경 변수가 노출됨

5. 해결 방법: 지금 바로 대응하세요!

이 취약점은 프레임워크 수준의 업데이트가 필수적입니다.

1) 프레임워크 업데이트 (가장 중요)

현재 프로젝트의 package.json을 확인하고 아래 버전 이상으로 즉시 업데이트하세요.

  • React: 19.2.1 이상
  • Next.js: 16.0.7 이상 (또는 각 Major 버전의 최신 보안 패치)

2) 인프라 및 네트워크 보안

  • WAF(웹 방화벽) 적용: Cloudflare나 AWS WAF를 사용 중이라면, 비정상적인 RSC 페이로드를 차단하는 전용 규칙을 활성화하세요.
  • 환경 변수 교체: 만약 패치 전 공격에 노출되었을 가능성이 있다면, API 키나 DB 접속 정보를 즉시 교체하는 것이 안전합니다.

6. 마치며: 개발자가 나아가야 할 방향

이번 React2Shell 사태는 **"서버로 들어오는 모든 입력값은 신뢰할 수 없다"**는 보안의 기본 원칙을 다시 한번 상기시켜 줍니다.

RSC는 개발 생산성을 높여주는 강력한 도구이지만, 서버 사이드 보안 모델에 대한 이해가 뒷받침되지 않으면 큰 위험이 될 수 있습니다.

지금 바로 여러분의 프로젝트 버전을 확인해 보세요! 안전한 개발 환경이 최고의 퍼포먼스를 만듭니다.


도움이 되셨나요? 이 글이 여러분의 서비스를 보호하는 데 도움이 되었기를 바랍니다.

관련하여 궁금한 점이나 의견이 있다면 댓글로 자유롭게 남겨주세요!

댓글

0/2000
Newsletter

이 글이 도움이 되셨나요?

새로운 글이 발행되면 이메일로 알려드립니다.

뉴스레터 구독하기