Ham.Blog
블로그로 돌아가기
2025. 12. 9.4분

홈서버에서 발생한 채굴 악성코드 감염 사건 분석 및 대응

NextJSReactUbuntuServer

최근 개인 서버에 발생한 침해 사고를 면밀히 분석한 결과를 공유합니다. 이는 단순한 보안 문제가 아니라, 최신 기술 환경의 복잡한 취약점을 악용한 고도화된 공격 패턴을 보여줍니다. 서버 관리자 및 개발자분들에게 경각심을 주고 실질적인 방어 전략을 제시하고자 합니다.

1. 침해 사고 초기 진단: 비정상적인 CPU 사용량

사고는 top 명령어 출력에서 시작되었습니다. 평소와 달리 **로드 평균(Load Average)**이 비정상적으로 높았으며, 특히 **pipewire**라는 프로세스가 시스템 자원을 거의 독점하고 있었습니다.

| PID | USER | %CPU | %MEM | COMMAND | | :---: | :---: | :---: | :---: | :--- | | 3806 | hamsm | 299.7 | 30.1 | pipewire |

pipewire는 일반적으로 사운드 및 비디오 처리를 위한 합법적인 시스템 컴포넌트이지만, 이처럼 비정상적인 CPU 사용률을 보이는 것은 **암호화폐 채굴 악성코드(Cryptomining Malware)**의 전형적인 프로세스 위장 시도임을 시사했습니다.

2. 악성코드 분석 및 침투 경로 확인

즉각적인 대응을 위해 악성 프로세스의 세부 정보를 추적했습니다.

(1) 악성 파일의 위치 및 구조

ls -l /proc/3806/exe를 통해 확인된 실제 실행 파일의 경로는 다음과 같습니다.

/proc/3806/exe -> /var/tmp/.../pipewire

악성 파일은 /var/tmp/ 디렉토리 내 숨겨진 폴더(...)에 위치해 있었으며, 파일 이름 역시 시스템 컴포넌트(pipewire)로 위장하여 탐지를 회피하려 했습니다.

[cite_start]또한, 해당 pipewire 파일의 내용을 분석한 결과, **UPX 패커(Packer)**로 압축된 형태임을 확인했습니다. [cite: 2, 635] 이는 악성코드의 크기를 줄이고 정적 분석을 어렵게 만드는 데 사용되는 기법입니다. [cite_start]파일 내부에는 MD5, SUMO, MINER 등의 문자열이 포함되어 있어, 암호화폐 채굴 목적으로 사용되었음을 재차 확인했습니다. [cite: 456, 458, 479]

(2) 영구 실행 메커니즘 (지속성)

악성코드는 프로세스가 종료되어도 재실행되도록 Crontab을 악용했습니다.

hamsm 사용자의 크론탭에는 다음과 같은 명령어가 등록되어 있었습니다.

*/5 * * * * /var/tmp/.../zmbackup > /dev/null 2>&1

[cite_start]/var/tmp/.../zmbackup 파일의 내용은 kdcflush라는 프로세스의 존재 여부를 확인하고, 해당 프로세스가 없으면 /var/tmp/.../pipewire (악성 채굴기)를 실행하는 쉘 스크립트였습니다. [cite: 1] 이는 5분마다 실행되며, 악성코드를 주기적으로 감시하고 재실행시키는 역할을 합니다.

3. 잠재적 침투 벡터 및 최신 취약점 연관성 진단

악성코드가 서버에 어떻게 침투했는지를 파악하는 과정에서, 서버 환경과 최근 발표된 주요 취약점 정보를 연결하여 잠재적인 침투 벡터를 진단했습니다.

서버의 top 출력 및 로그 파일 분석 결과, Java (Elasticsearch, Kibana) 기반의 애플리케이션Next.js 환경의 흔적이 발견되었습니다.

(1) Next.js/React Server Components 취약점 (CVE-2025-66478)

로그 기록에서 확인된 Next.js 기반의 애플리케이션 운영 환경은 최근 발표된 심각한 보안 취약점과 연관 지어 볼 필요가 있습니다.

  • [cite_start]취약점: Next.js와 React Server Components에서 발견된 **심각한 보안 취약점 (CVE-2025-66478)**은 인증되지 않은 원격 공격자가 임의의 코드를 실행(Remote Code Execution, RCE)할 수 있게 합니다. [cite: 3, 1]
  • 연관성: 공격자는 이 취약점을 악용하여 서버에 접근하고, pipewirezmbackup 파일을 업로드한 뒤, 이를 실행하여 채굴 활동을 시작했을 가능성이 있습니다.

(2) 기타 잠재적 취약점

  • npm-run-start-error.log: 업로드된 로그 파일에는 npm run start-error.log 기록이 남아있습니다. 이는 Node.js 환경에서 애플리케이션 실행 중 발생한 오류를 나타내며, [TypeError: Cannot read properties of undefined (reading 'aa')]와 같은 오류 메시지는 공격자가 애플리케이션의 특정 API를 비정상적으로 호출하여 취약점을 탐색하거나 악용하려 했을 가능성을 시사합니다.
  • 권한 상승: 악성코드는 일반 사용자 hamsm의 권한으로 실행되었지만, 시스템 전반의 자원을 점유했습니다. 이는 공격자가 최초 침투 후 권한 상승을 시도했거나, hamsm 사용자가 민감한 시스템 디렉토리에 쓰기 권한을 가지고 있었음을 의미합니다.

4. 긴급 제거 및 대응 전략 (Post-Mortem Action)

침해 사고에 대응하여 다음과 같은 긴급 조치를 취했습니다.

  1. 프로세스 즉시 종료: sudo kill -9 <PID> 명령을 사용하여 악성 pipewire 프로세스를 강제 종료하고 시스템 부하를 즉시 낮추었습니다.
  2. 지속성 제거: crontab -e를 통해 사용자 hamsm의 크론탭에서 악성 재실행 명령을 삭제했습니다.
  3. 악성 파일 제거: sudo rm -rf /var/tmp/... 명령을 사용하여 악성 실행 파일(pipewire)과 자동 실행 스크립트(zmbackup)를 포함하는 디렉토리를 완전히 제거했습니다.
  4. SSH 보안 강화: 모든 인증서 및 비밀번호를 변경하고, 가능하다면 비밀번호 인증을 비활성화한 뒤 SSH Key 인증만 사용하도록 전환했습니다.
  5. 시스템 재설치 (권장): 완벽한 악성코드 및 백도어 제거를 확신할 수 없으므로, 모든 중요 데이터를 백업한 후 운영체제를 재설치하는 것을 최우선 보안 조치로 결정했습니다.

이번 사고는 최신 웹 기술 스택(Node.js, Next.js)의 취약점이 채굴 악성코드와 결합하여 심각한 위협을 초래할 수 있음을 보여주었습니다. 모든 서버 관리자는 사용 중인 소프트웨어의 최신 취약점 정보를 주시하고, 주기적인 보안 감사 및 패치 적용을 통해 시스템 무결성을 유지해야 합니다.


참고 자료:

  • CVE-2025-66478: Next.js/React Server Components 취약점 ([참고: 3])
  • UPX Packer: 악성코드 분석을 통해 확인된 실행 파일 압축 기법 ([참고: 2, 635])