React·Next.js RSC 취약점 대응 가이드
CVE-2025-55182: React 서버 컴포넌트 중대 취약점 가이드
https://www.dailysecu.com/news/articleView.html?idxno=203063

1) 요약
12월 3일 공개된 CVE-2025-55182는 React 19의 Server Components에서 발생하는 인증 불필요한 원격 코드 실행(RCE) 취약점입니다. CVSS 10.0 최고 심각도로 평가되며, 특수하게 조작된 HTTP 요청 하나로 서버의 모든 권한으로 코드 실행이 가능합니다. Wiz의 연구에 따르면 클라우드 환경의 39%가 취약하며, 44%의 클라우드 환경이 공개적으로 노출된 Next.js 인스턴스를 운영 중입니다. 즉시 패치 업데이트가 필수입니다.reddit+2
2) 핵심 기술 설명
취약점의 원인: 안전하지 않은 역직렬화(Insecure Deserialization)
React Server Components는 Flight 프로토콜을 사용하여 클라이언트에서 서버로 데이터를 송수신합니다. 클라이언트가 Server Function을 호출하면 React는 요청을 JSON 형식의 HTTP POST 요청으로 변환하고, 서버는 이를 받아 역직렬화(deserialization)합니다.fieldeffect+1
문제는 서버가 받은 페이로드의 구조를 충분히 검증하지 않는다는 점입니다. 공격자가 특수하게 조작된 악의적 페이로드를 보내면, 서버의 역직렬화 로직이 이 데이터를 실행 가능한 JavaScript 코드로 변환하여 즉시 실행되기 때문입니다. 이는 메모리 오버플로우 같은 확률적 취약점이 아니라 논리적 결함이므로 거의 100% 성공률로 악용됩니다.unit42.paloaltonetworks+2
영향받는 버전과 프레임워크
React 직접 영향 버전:reddit
react 19.0, 19.1.0, 19.1.1, 19.2.0
react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack 19.0, 19.1.0, 19.1.1, 19.2.0
Next.js 영향 버전(CVE-2025-66478):reddit
14.3.0-canary.77 이상의 모든 canary 버전
15.0.0 ~ 15.5.x
16.0.0 이상
기타 영향받는 프레임워크:careerly+1
React Router (RSC 모드)
Waku
Vite RSC 플러그인
Parcel RSC 플러그인
RedwoodSDK
심각한 이유: 기본 설정이 취약함
create-next-app으로 기본 생성한 Next.js 앱도 코드 변경 없이 즉시 악용 가능합니다. Server Functions를 명시적으로 구현하지 않았더라도, 프레임워크가 RSC를 기본 활성화하면 취약합니다.jjeongil.tistory+2
3) 개발자 실제 대응 방법
Phase 1: 현 상황 파악 (지금 바로 해야 할 일)
먼저 자신의 프로젝트가 실제로 취약한지 확인하세요:
bash# 1단계: 패키지 버전 확인 npm list react next react-server-dom-webpack # 2단계: package.json에서 버전 직접 확인 cat package.json | grep -A 5 '"dependencies"'
취약한 경우 다음과 같은 버전이 보입니다:
react: 19.0.0, 19.1.0, 19.1.1, 19.2.0
next: 14.3.0-canary.77 이상, 15.0.0~15.5.x, 16.0.0~16.0.6
Phase 2: 긴급 업데이트 (오늘 중 필수)
프레임워크별 정확한 업그레이드 명령어:jjeongil.tistory+1
Next.js 15.0.x 사용자:
bashnpm install next@15.0.5 react@latest react-dom@latest npm install --save-dev @types/node@latest
Next.js 15.1.x 사용자:
bashnpm install next@15.1.9 react@latest react-dom@latest
Next.js 15.2.x 사용자:
bashnpm install next@15.2.6 react@latest react-dom@latest
Next.js 15.3.x ~ 15.5.x 사용자:
bashnpm install next@15.3.6 react@latest react-dom@latest
Next.js 16.0.x 사용자:
bashnpm install next@16.0.7 react@latest react-dom@latest
Next.js 14.3.0-canary.77 이상 canary 사용자:
bash# Canary는 수정되지 않음. 안정 버전으로 다운그레이드 npm install next@14 react@latest react-dom@latest
React 직접 사용자 (Server Components를 직접 구현한 경우):
bashnpm install react@19.0.1 react-dom@19.0.1 npm install react-server-dom-webpack@19.0.1 npm install react-server-dom-parcel@19.0.1 npm install react-server-dom-turbopack@19.0.1
React Router RSC 사용자:
bashnpm install react@latest react-dom@latest npm install react-server-dom-parcel@latest npm install react-server-dom-webpack@latest npm install @vitejs/plugin-rsc@latest
Phase 3: 패치 검증
업데이트 후 반드시 검증하세요:
bash# 1단계: 의존성 트리 확인 - 취약 버전이 남아있는지 확인 npm ls react react-server-dom-webpack # 2단계: 패키지-lock.json 정리 후 재설치 rm package-lock.json node_modules -rf npm install # 3단계: 빌드 테스트 npm run build # 4단계: 로컬 테스트 실행 npm run dev # 브라우저에서 http://localhost:3000 접속 하여 정상 동작 확인
Phase 4: 배포
bash# 보안 관점에서 배포 전 추가 체크리스트 npm audit # 다른 취약점 없는지 확인 npm test # 모든 테스트 통과 확인 # 배포 git add package.json package-lock.json git commit -m "Security patch: CVE-2025-55182 React RCE vulnerability fix" git push # 프로덕션 배포 (환경에 따라) # Vercel의 경우: git push 후 자동 배포 # Self-hosted의 경우: npm ci && npm run build && systemctl restart app
4) 긴급 패치가 불가능한 경우 임시 완화 방법
만약 즉시 업데이트가 불가능한 상황이라면, 다음 임시 조치들을 적용하세요. 단, 이들은 근본적인 해결책이 아니므로 48시간 내에 반드시 패치해야 합니다.arcticwolf
방법 1: Web Application Firewall (WAF) 규칙 배포
Google Cloud Platform 사용자 (Cloud Armor):cloud.google
bash# gcloud CLI로 WAF 규칙 배포 gcloud compute security-policies rules create 1000 \ --action "deny-403" \ --security-policy "default" \ --expression "evaluatePreconfiguredExpr('xss-v35')" # 또는 콘솔에서: Cloud Armor → Create or modify policy → Add rule # Match condition: Preconfigured rules → CVE-2025-55182
Cloudflare 사용자 (자동 배포됨):
Cloudflare의 모든 고객에게 자동으로 WAF 규칙이 적용됨
대시보드에서 WAF → Managed Rules 확인 가능
Vercel 사용자:
모든 Vercel 호스팅 앱에 기본 보호 적용됨
추가 설정 불필요
방법 2: 네트워크 수준 접근 제어
bash# nginx 설정 예시 - Server Function 엔드포인트 제한 location ~ /_rsc { # 신뢰된 IP에서만 접근 허용 allow 203.0.113.0/24; # 내부 네트워크 allow 10.0.0.0/8; # VPC deny all; # 나머지는 거절 }
AWS Security Group 설정:
bash# EC2 인스턴스의 포트 3000만 특정 CIDR에 열기 aws ec2 authorize-security-group-ingress \ --group-id sg-xxxxxxxx \ --protocol tcp \ --port 3000 \ --cidr 10.0.0.0/8
방법 3: 환경 변수로 Server Components 임시 비활성화
javascript// next.config.js module.exports = { experimental: { // Server Components 완전 비활성화 (임시) isrMemoryCacheSize: 0, serverActions: false, } } // 또는 .env.local DISABLE_RSC=true
방법 4: 모니터링 및 로깅 강화
javascript// middleware.ts - 의심스러운 요청 탐지 import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' export function middleware(request: NextRequest) { // Server Function 요청 모니터링 if (request.nextUrl.pathname.includes('/_rsc')) { console.log('RSC Request:', { timestamp: new Date().toISOString(), method: request.method, path: request.nextUrl.pathname, ip: request.ip, userAgent: request.headers.get('user-agent'), contentLength: request.headers.get('content-length'), }) // 의심스러운 페이로드 크기 제한 const contentLength = parseInt(request.headers.get('content-length') || '0') if (contentLength > 1000000) { // 1MB 이상 console.warn('⚠️ Suspicious large RSC payload detected') return NextResponse.json( { error: 'Payload too large' }, { status: 413 } ) } } return NextResponse.next() } export const config = { matcher: ['/_rsc/:path*'] }
5) 공격 발생 여부 확인 방법
패치 후 로그를 분석하여 실제 공격 시도가 있었는지 확인하세요:
bash# 1. 웹 서버 로그에서 /_rsc 엔드포인트 접근 분석 grep "_rsc" /var/log/nginx/access.log | grep -E "POST|PATCH" | wc -l # 2. 의심 IP 주소 식별 grep "_rsc" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn # 3. Node.js 에러 로그 확인 tail -f ~/.pm2/logs/app-error.log | grep -i "deserialize\|code execution\|syntax" # 4. 보안 모니터링 도구 (예: Wazuh 설치된 경우) tail -f /var/ossec/logs/alerts/alerts.log | grep CVE-2025-55182
의심 패턴:
POST 요청이 갑자기 증가
/_rsc 엔드포인트로 대량의 비정상적 요청
해당 시간대에 프로세스 CPU 사용률 급증
서버에서 예기치 않은 명령 실행
6) 장기 보안 개선 사항
안정성을 위한 추가 조치들:react
자동 보안 업데이트 설정: npm의 audit fix를 CI/CD에 자동화
bash# GitHub Actions 예시 - name: Security audit run: npm audit --audit-level=moderate
의존성 버전 고정: 프로덕션 환경에서 package-lock.json으로 정확한 버전 고정
bashnpm ci # npm install 대신 ci 사용 (정확한 버전 설치)
정기적 취약점 스캔: 월 1회 이상
bashnpm audit npx snyk test # 추가 취약점 탐지
보안 모니터링 서비스 가입: Vercel, Google Cloud의 보안 알림 활성화
Server Components 최소화: 가능하면 꼭 필요한 경우만 Server Components 사용
7) 체크리스트
버전 확인 완료:
npm list react next실행하여 현재 버전 파악취약 버전 여부 판단: 위의 "영향받는 버전" 목록과 비교
패치 적용: 해당 프레임워크의 업데이트 명령어 실행
의존성 검증:
npm ls또는npm audit실행로컬 테스트 완료:
npm run build && npm run dev실행빌드 성공 확인: 컴파일 오류 또는 경고 없음
프로덕션 배포: 테스트 환경 후 운영 환경에 배포
배포 후 모니터링: 에러 로그 확인 (최소 1시간)
공격 시도 분석: 웹 로그에서 /_rsc 비정상 요청 확인
팀 공지: 개발팀 전원에게 업데이트 내용 공유
타임라인 요약: 11월 29일 보안 연구원 Lachlan Davidson이 취약점 보고 → 11월 30일 Meta 보안팀 확인 및 수정 개발 시작 → 12월 1일 호스팅 업체 및 오픈소스 프로젝트와 조율 → 12월 3일 npm 배포 및 CVE 공개reddit
최종 조언: 현재 상황은 "바로 지금" 업데이트해야 하는 매우 심각한 보안 결함입니다. 임시 조치는 몇 시간의 숨을 돌리는 것 이상의 효과가 없습니다. 늦어도 오늘 중에 패치를 적용하고 배포하기를 강력 권장합니다.
수정된 업그레이드 가이드
Next.js 15.4.x 사용자:
bashnpm install next@15.4.8 react@latest react-dom@latest
Next.js 15.5.x 사용자:
bashnpm install next@15.5.7 react@latest react-dom@latest
PPR 기능을 위해 Canary 사용 중인 경우:
bashnpm install next@15.6.0-canary.58 react@latest react-dom@latest