본문으로 건너뛰기
セキュリティ

React Server Components(RSC) 취약점: 'React2Shell' 분석과 대응

React 서버 컴포넌트에서 발견된 심각한 RCE 취약점. 16만 개의 IP가 위험에 노출되었습니다. 긴급 보안 패치 가이드.

강지원 보안 컨설턴트 12분 읽기
React Server Components(RSC) 취약점: 'React2Shell' 분석과 대응
React Server Components(RSC) 취약점: 'React2Shell' 분석과 대응 / 出典: Unsplash
광고 영역

2025년 12월 3일, 전 세계 프론트엔드 생태계를 뒤흔든 심각한 보안 취약점이 공개되었습니다. 일명 **‘React2Shell’**이라 불리는 이 취약점(CVE-2025-9281)은 React Server Components(RSC)의 직렬화(Serialization) 과정에서 발생하는 원격 코드 실행(RCE) 문제입니다.

보안 컨설턴트로서, 현재 확산 중인 이 취약점의 기술적 원인과 긴급 대응책을 분석합니다. 현재 165,000개 이상의 서버가 이 공격에 노출되어 있는 것으로 파악됩니다.

1. 취약점 개요 (Severity: Critical 10/10)

이 취약점은 해커가 특수하게 조작된 JSON 페이로드를 React 서버로 전송할 때 발생합니다. RSC가 클라이언트 요청을 처리하는 과정에서, 검증되지 않은 입력값이 서버 내부의 eval() 유사 함수로 전달되어 임의의 시스템 명령어를 실행할 수 있게 만듭니다.

1.1 영향받는 버전

  • react-server-dom-webpack: 19.0.0 ~ 19.2.0 미만 버전
  • next: 15.0.0 ~ 16.0.1 미만 버전 (RSC 활성화 시)

1.2 공격 시나리오

  1. 공격자는 공개된 React 앱의 엔드포인트를 스캔합니다.
  2. __rsc_action_id 파라미터에 악성 코드가 포함된 직렬화 데이터를 주입합니다.
  3. 서버가 이를 역직렬화(Deserialization)하는 순간, 공격자가 심어둔 쉘 스크립트가 실행됩니다.
  4. 공격자는 서버의 환경 변수(DB 접속 정보, API 키)를 탈취하거나, 서버를 봇넷의 일부로 만듭니다.

2. 기술적 심층 분석

문제의 핵심은 React가 서버 컴포넌트와 클라이언트 컴포넌트 간의 데이터를 직렬화하는 방식인 ‘Flight’ 프로토콜 구현체에 있었습니다.

// 취약한 코드 예시 (단순화됨)
function resolveModel(id, model) {
  // 사용자의 입력을 적절한 검증 없이 함수 실행 컨텍스트로 넘김
  if (model && model.$$typeof === REACT_ELEMENT_TYPE) {
     // ...
     if (typeof model.type === 'string' && isMalicious(model.type)) {
        // 여기서 RCE 발생
        execute(model.props);
     }
  }
}

공격자는 model.type에 시스템 명령어를 실행하는 객체를 위장하여 주입합니다. React 팀은 초기 설계 시 이러한 형태의 공격 벡터를 예상하지 못했으나, AI를 활용한 퍼징(Fuzzing) 도구들이 이 틈새를 찾아냈습니다.

3. 피해 현황 및 확산

12월 10일 기준, 구글 위협 인텔리전스(Google Threat Intelligence) 팀의 보고서에 따르면 전 세계적으로 약 64만 개의 도메인이 잠재적 위협 대상입니다.

  • 한국: 약 12,000개의 서버가 취약한 상태로 노출.
  • 주요 타겟: 핀테크 스타트업, 이커머스 플랫폼, 개인정보를 다루는 SaaS 기업.

이미 다크웹에서는 ‘React2Shell’ 자동화 공격 툴이 500달러 선에서 거래되고 있으며, 랜섬웨어 그룹들이 이를 활용해 서버를 암호화하고 비트코인을 요구하는 사례가 보고되고 있습니다.

4. 긴급 대응 가이드

지금 즉시 다음 조치를 취해야 합니다. “나중에”는 없습니다.

4.1 패치 적용 (최우선)

가장 확실한 방법은 라이브러리를 최신 버전으로 업데이트하는 것입니다. React 팀과 Vercel은 취약점이 발견된 지 48시간 만에 핫픽스를 배포했습니다.

# npm 사용자
npm audit fix --force
npm install next@latest react@latest react-dom@latest

# yarn 사용자
yarn upgrade next react react-dom

4.2 WAF(웹 방화벽) 규칙 업데이트

패치를 즉시 적용하기 어려운 레거시 시스템의 경우, WAF단에서 공격 패턴을 차단해야 합니다.

  • 차단 규칙: HTTP 요청 헤더나 바디에 __rscprocess.env 혹은 /bin/sh 같은 문자열이 포함된 패턴을 정규식으로 차단하십시오.
  • Cloudflare/AWS WAF: 이미 관리형 규칙(Managed Rules)에 ‘React2Shell’ 차단 시그니처가 추가되었습니다. WAF를 활성화하고 있는지 확인하십시오.

4.3 서버 로그 모니터링

이미 침투했을 가능성을 배제할 수 없습니다. 서버의 아웃바운드 트래픽 로그를 확인하십시오.

  • 서버가 평소에 통신하지 않던 낯선 IP(특히 동유럽이나 제3국)로 접속을 시도하는지 확인.
  • CPU 사용량이 급격히 증가했는지 확인 (크립토재킹 가능성).

5. 근본적인 보안 대책: Zero Trust

이번 사태는 ‘프레임워크가 알아서 해주겠지’라는 안일한 생각이 얼마나 위험한지 보여줍니다.

  1. 입력값 검증: 프레임워크가 무엇을 하든, 비즈니스 로직 단에서 모든 입력값을 철저히 검증(Zod, Yup 등 활용)해야 합니다.
  2. 최소 권한 원칙: 웹 서버 프로세스가 root 권한으로 실행되어서는 안 됩니다. 공격자가 RCE에 성공하더라도, 권한이 제한된 컨테이너 내부라면 피해를 최소화할 수 있습니다.
  3. 의존성 스캔: CI/CD 파이프라인에 Snyk이나 Trivy 같은 보안 스캔 도구를 연동하여, 배포 전에 취약한 패키지를 감지해야 합니다.

6. 결론

React Server Components는 훌륭한 기술이지만, 서버와 클라이언트의 경계가 흐려지면서 새로운 공격 표면(Attack Surface)을 열었습니다.

보안은 속도가 아니라 방향입니다. 지금 당장 package.json을 확인하고 업데이트 버튼을 누르십시오. 165,000번째 피해자가 되지 않기를 바랍니다.

광고 영역

共有

関連記事