React2Shell 스캐너

다운로드 17
업데이트 2025. 12. 7.

사용 매뉴얼

React Server Component의 Proto Pollution 취약점(CVE-2025-55182)을 탐지하는 쿼리 명령어를 제공합니다.

사용법

json "{}" | eval url = "https://target.com" | react2shell-scan-batch
json "{}" | eval url = "https://target.com/api" | react2shell-scan-batch timeout=10

옵션

  • field: URL이 담긴 필드명 (기본값: url)
  • timeout: 연결/읽기 타임아웃 초 단위 (기본값: 30)

출력 필드

  • _time: 진단 시각
  • verdict: 취약 여부 (vulnerable / not vulnerable / unknown)
  • status: HTTP 응답 상태 코드
  • raw_data: HTTP 응답 원문 (헤더 + 본문)
  • _error: 에러 메시지 (실패 시)

취약점 기술 분석

CVE-2025-55182 (React2Shell)는 Next.js의 Server Actions 기능에서 발생하는 Prototype Pollution 취약점입니다. 공격자가 조작된 multipart/form-data 요청을 전송하면, React의 Flight 프로토콜 파서가 악의적인 객체 참조를 역직렬화하면서 임의 코드 실행(RCE)이 가능해집니다.

영향 받는 버전

  • Next.js 15.x ~ 15.1.6
  • Next.js 14.x ~ 14.2.24
  • Next.js 13.x ~ 13.5.8

공격 원리

1. React Server Components (RSC) Flight 프로토콜

Next.js Server Actions는 React의 Flight 프로토콜을 사용하여 클라이언트-서버 간 데이터를 직렬화/역직렬화합니다. Flight 프로토콜은 $ 접두사를 사용하여 객체 참조를 표현합니다:

$1        → 1번 청크 참조
$@1       → 1번 청크의 비동기 참조
$1:then   → 1번 청크의 'then' 속성 참조

2. Prototype Pollution 체인

공격의 핵심은 $ 참조를 통해 객체 프로토타입 체인을 조작하는 것입니다:

["$1:aa:aa"]  →  chunk[1]["aa"]["aa"] 를 참조 시도
              →  빈 객체 {}의 존재하지 않는 속성 접근
              →  프로토타입 체인 탐색 중 오류 발생

3. 가젯 체인 (Gadget Chain)

RCE를 위해 사용되는 주요 가젯:

{
  '_prefix': 'console.log(7*7+1)//',      // 실행할 코드 프리픽스
  '_formData': {'get': '$3:constructor:constructor'},  // Function 생성자 접근
  '_chunks': '$2:_response:_chunks'       // 내부 청크 배열 접근
}
  • _prefix: 주입할 JavaScript 코드
  • _formData.get: Function 생성자에 접근하여 임의 코드 실행
  • _chunks: 내부 상태 조작을 위한 청크 참조

탐지 방식

실제 코드 실행 없이 취약 여부만 탐지합니다.

페이로드

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

{}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

["$1:aa:aa"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

HTTP 요청

POST / HTTP/1.1
Host: target.com
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad

[multipart body]

취약 판정 조건

  1. HTTP 상태 코드: 500
  2. 응답 본문에 E{"digest" 패턴 포함

내부 동작

1. Next.js가 Server Action 요청 수신
2. Flight 파서가 multipart 데이터 파싱
3. name="0" 파트의 ["$1:aa:aa"] 역직렬화 시도
4. $1 참조로 name="1"의 빈 객체 {} 접근
5. {}.aa.aa 접근 시도 → 프로토타입 체인 탐색
6. 존재하지 않는 속성 접근으로 내부 오류 발생
7. 오류가 E{"digest":...} 형식으로 클라이언트에 반환

취약한 서버는 이 프로토타입 체인 탐색 과정에서 오류를 발생시키며, 이 오류 패턴으로 취약 여부를 판단합니다.

보안 권고

패치된 버전으로 업그레이드

  • Next.js 15.1.7 이상
  • Next.js 14.2.25 이상
  • Next.js 13.5.9 이상

완화 조치

  • Server Actions 기능 비활성화 (experimental.serverActions: false)
  • WAF에서 Next-Action 헤더 필터링
  • Netlify/Vercel의 경우 자동 패치 적용됨

참고 자료