React 팀이 발표한 2025년 12월 보안 권고안은 웹 애플리케이션 보안의 패러다임 전환을 의미합니다. 업계에서 React 서버 컴포넌트(RSC)를 통한 서버 측 렌더링(SSR)을 빠르게 채택함에 따라 공격 표면이 클라이언트 DOM에서 서버의 직렬화 경계로 이동하고 있습니다. CVE-2025-55184 는 사소한 리소스 고갈 버그가 아니라 정교한 알고리즘 복잡성 서비스 거부 의 기본 아키텍처를 대상으로 합니다. Promise의 재귀적 역직렬화 기능을 활용하여 비행 프로토콜인증되지 않은 공격자는 다음을 유도할 수 있습니다. 마이크로태스크 대기열 굶주림를 사용하여 TCP 포트를 열어둔 채로 서버 프로세스를 혼수 상태로 만들 수 있습니다. 이 최종 가이드에서는 와이어 수준에서 취약점을 분석하고, "Ouroboros" 재귀 메커니즘을 살펴보고, 다음과 같은 방법을 시연합니다. 펜리전트 는 AI 기반 차등 퍼징을 활용하여 생산 가용성을 방해하지 않고 이 결함을 검증합니다.

크래시의 아키텍처 RSC, 비행 및 이벤트 루프
CVE-2025-55184의 심각성을 완전히 이해하려면 먼저 Next.js 앱 라우터와 React 19를 구동하는 독점적인 통신 계층을 해체해야 합니다. 비행 프로토콜.
비행 프로토콜 와이어 형식
일반적으로 정적 JSON을 반환하는 REST 또는 GraphQL과 달리 RSC는 구성 요소 트리를 점진적으로 해결하도록 설계된 하이브리드 행 기반 스트리밍 형식을 사용합니다.
일반적인 비행 응답 스트림은 다음과 같습니다:
HTTP
1:I{"id":134,"chunks":["app/page.js"],"name":"default"} 2:{"title":"Welcome","content":"$@1"} 3:{"$":"$@2"}
- 1호선: 모듈(클라이언트 컴포넌트)을 가져옵니다.
- 2호선: 청크 1을 참조하는 JSON 객체를 정의합니다.
- 3호선: 청크 2에 대한 참조를 정의합니다.
치명적인 기능: 비동기 직렬화
React를 사용하면 개발자가 서버에서 클라이언트로 Promise를 전달할 수 있습니다. 직렬화기는 보류 중인 프로미스를 발견하면 자리 표시자를 방출합니다. 역직렬화기(수신 측, 계층형 아키텍처에서는 서버일 수도 있음)는 이러한 프로미스가 해결될 때까지 기다리도록 프로그래밍됩니다.
이 요구 사항에는 재귀적 해결 전략: 프로미스 A가 프로미스 B로 해결되면 역직렬화자는 프로미스 B를 구독해야 합니다. 이 재귀가 바로 취약점이 있는 부분입니다.
Node.js 내부: 마이크로태스크 대기열 고갈
이 익스플로잇이 표준 익스플로잇과 비교했을 때 왜 그렇게 파괴적인가? while(true) 루프? 답은 V8 엔진의 작업 스케줄링에 있습니다.
- 매크로 작업: 타이머 (
setTimeout), I/O 콜백,setImmediate. - 마이크로태스크: 프로미스 콜백 (
.then,.catch),process.nextTick.
굶주림의 정비공:
Node.js 이벤트 루프는 엄격한 우선순위 규칙에 따라 작동합니다: 이벤트 루프가 다음 단계로 진행하기 전에 마이크로태스크 대기열이 완전히 비워져야 합니다.
CVE-2025-55184 익스플로잇에서 공격자는 자신(또는 자신으로 다시 연결되는 체인)으로 해결되는 프로미스가 있는 페이로드를 전송합니다.
- 역직렬화기는
.then()를 사용하여 해상도를 처리합니다. - 콜백이 실행되고, 재귀를 확인하고, 일정을 예약합니다. 다른
.then(). - 결정적으로 다음과 같은 일이 발생합니다. 동기식 대기열 처리와 관련하여 대기열 길이는 절대 0에 도달하지 않습니다.
- 영향: 네트워크 I/O 콜백(새 요청 처리), 상태 확인 프로브 및 OS 신호가 영구적으로 차단됨. 프로세스는 살아있고(PID 존재) 포트는 열려 있지만(SYN-ACK은 OS 수준에서 작동) 애플리케이션은 뇌가 죽은 상태입니다.
익스플로잇 리버스 엔지니어링
"오로보로스" 페이로드
취약점은 다음에 존재합니다. 반응-서버-돔-웹팩 (및 소포/터보팩의 변형). 패치되지 않은 프로세스 값 기능에는 참조 유형에 대한 깊이 제한 또는 주기 감지 기능이 없습니다.
공격자는 이를 무기화할 수 있습니다. 방향성 순환 그래프(DCG) 비행 페이로드 내에서
개념 익스플로잇 코드(프로토콜 수준)
실제 바이너리 인코딩은 복잡하지만 공격 벡터의 논리적 구조는 우아할 정도로 간단합니다:
자바스크립트
악성 플라이트 구조 // 표적의 JSON 표현: Next.js 앱 라우터 엔드포인트(POST /)
{ "id": "root", "청크": [], "value": { // 플라이트 구문 "$"를 사용하여 Promise 객체를 수동으로 정의합니다: "$Promise", "status": "fulfilled", "value": { // 이 해결된 프로미스의 값은... ITSELF입니다. "$": "$@root" } } }`
서버가 이를 파싱할 때
- 약속이 이행되는 것을 봅니다.
- 값의 래핑을 해제합니다.
- 루트 객체(프로미스)에 대한 참조를 확인합니다.
- 마이크로태스크를 예약하여 루트 개체의 래핑을 다시 해제합니다.
- GOTO 1.
이 루프는 전적으로 메모리에서 발생하며, SQL 인젝션 서명이나 대용량 요청 본문을 찾는 기존 WAF를 우회합니다. 페이로드는 대개 1KB보다 작습니다.
"불완전한 수정" 사가(CVE-2025-67779)
이 취약점에 대한 초기 패치는 며칠 만에 우회되었다는 점에 유의해야 합니다. 첫 번째 수정은 재귀 깊이를 추적하려고 시도했지만 특정 중첩 구조 변형(예: 사이클을 내부의 지도 또는 설정). 이로 인해 CVE-2025-67779. 따라서 단순히 "업데이트"하는 것만으로는 충분하지 않습니다. 결정적 패치된 버전(React 19.0.3+ / Next.js 15.0.6+).
조용한 파트너: CVE-2025-55183(소스 코드 노출)
55184는 가용성을 파괴합니다, CVE-2025-55183 는 기밀성을 파괴합니다. 이 동반 취약점은 동시에 공개되었습니다.
누수 메커니즘:
서버 액션은 내부 함수입니다. 그러나 공격자가 서버 액션을 호출하는 대신 ID로 서버 액션을 값으로 요청하면 취약한 직렬화기는 이를 데이터 객체로 취급합니다. 이 과정에서 컴파일된 함수 본문을 문자열로 직렬화합니다.
영향:
- 논리 추출: 공격자는 백엔드 유효성 검사 로직을 읽을 수 있습니다(
if (!user.isAdmin) ...). - 비밀 스크래핑: 하드코딩된 API 키 또는 내부 엔드포인트가 공개됩니다.
- 섀도 API 검색: 사용하지 않거나 숨겨진 서버 액션이 눈에 보이는 공격 대상이 됩니다.
고급 검증: 엄격한 접근 방식
위험도가 높은 환경에서 취약점을 증명하기 위해 '서버를 다운시키려는 시도'는 비전문적이고 위험합니다. 펜리전트 AI 기반 안전한 익스플로잇 다운타임 없이 이러한 CVE를 검증하기 위한 전략입니다.
전략 1: 제한적 재귀 프로빙(안전 DoS)
펜리전트 AI 에이전트는 무한 루프가 아닌 유한 재귀 깊이 ($N=5000$).
- 프로브: 5000회 반복 후 종료되는 재귀적 프로미스 체인입니다.
- 휴리스틱 분석:
- 취약한: 서버가 체인을 처리합니다. 펜리전트는 뚜렷한 지연 시간 드리프트 (예: 응답 시간 = 기본값 + 200ms) 및 힙 사용량이 일시적으로 급증하는 경우입니다.
- 패치: React 19의 새로운 보안 메커니즘은 "순환 참조" 오류를 즉시 발생시킵니다. 응답은 거의 즉각적입니다(500 내부 서버 오류).
- 결론: 지연 시간이 깊이와 상관관계가 있는 경우($T \propto N$), 프로세스를 중단하지 않고 취약점을 확인합니다.
전략 2: 소스 누출에 대한 차등 퍼징(CVE-2025-55183)
소스 코드 노출 취약점을 탐지합니다:
- 지문 인식: 펜리전트는 합법적인 클라이언트 측 번들에서 사용 가능한 서버 액션 ID를 식별합니다.
- 반사 주입: 상담원이 이러한 ID를 데이터 속성으로 '에코'하려는 수정된 항공편 요청을 보냅니다.
- 패턴 매칭 AI: 응답 스트림이 분석됩니다. AI가 JavaScript 함수 서명을 감지하는 경우(예
비동기 기능 $...,var _0x...)를 JSON 응답 내에 플래그(플래그)로 지정합니다. 중요 정보 유출.

엔지니어의 조치 계획 및 해결 방법
익스플로잇의 창은 활짝 열려 있습니다. 자동화된 봇이 이미 노출된 Next.js 15.0.x 인스턴스를 검색하고 있습니다.
1. 업그레이드 매트릭스(엄격한 시행)
종속성 트리가 안전한 버전으로 해결되는지 확인해야 합니다. 세미버 캐럿(^)만으로는 pnpm-lock.yaml 또는 package-lock.json.
| 패키지 | 취약한 범위 | 안전 버전(최소) |
|---|---|---|
| 반응-서버-돔-웹팩 | < 19.0.3 | 19.0.3 |
| Next.js | 15.0.0 – 15.0.5 | 15.0.6+ (또는 v14의 경우 14.2.34 이상) |
2. 종속성 해결 오버라이드
왜냐하면 반응-서버-돔-웹팩 가 중첩된 종속성인 경우가 많으므로 강제로 package.json 를 사용하여 이전 버전이 몰래 들어오는 것을 방지합니다:
JSON
// package.json { "pnpm": { "overrides": { "react-server-dom-webpack": "19.0.3", "react-server-dom-turbopack": "19.0.3" } } }
3. 지속적인 유효성 검사
보안은 일회성 패치가 아닙니다. 사용 펜리전트 를 사용하여 배포를 지속적으로 모니터링합니다. CVE-2025-67779에서 볼 수 있는 것과 같은 새로운 우회 방법이 등장함에 따라 Penligent의 AI 모델은 이러한 변형을 테스트하도록 업데이트되어 진화하는 로직 공격에 대한 방어벽이 뚫리지 않도록 보장합니다.
참조 및 권한 링크:
- React 보안 권고: 서비스 거부 및 소스 코드 노출
- Next.js 공식 보안 업데이트(2025년 12월)
- Node.js 문서: 이벤트 루프, 타이머, process.nextTick()
- NIST NVD - CVE-2025-55184 세부 정보


