Tinycolor 공급망 공격 사건 후속 분석

1 month ago 9

  • @ctrl/tinycolor 등 20개 패키지가 공급망 공격으로 인해 악성 버전 배포 피해 발생
  • npm 토큰이 GitHub Actions 워크플로우를 통해 탈취되어 여러 패키지에 악성 코드 배포 진행
  • GitHub와 npm 보안팀은 신속하게 대응하여 해당 악성 버전들을 제거하고, 클린 버전으로 패키지 신뢰성 복원 시도
  • 패키지 유지 관리를 위해 2FA 강제 적용과 토큰 권한 제한 등 추가 보안 조치 도입
  • 향후에는 Trusted Publishing(OIDC) 도입과 함께 published provenance 강화 의지 강조

사건 개요

  • 20개 npm 패키지, 대표적으로 @ctrl/tinycolor 패키지가 공급망 공격으로 인해 악성 버전 배포 피해를 입음
  • 공격은 공유된 GitHub 저장소에서 악의적인 GitHub Actions 워크플로우가 푸시되며 시작됨
  • 작업 흐름 실행 후 저장된 npm 토큰이 공격자에게 탈취되어 정상적으로 게시 권한을 가진 상태에서 악성 패키지가 배포
  • 피해자 본인의 GitHub 계정, 저장소는 직접적인 침해를 당하지 않았으며, 피싱·로컬 악성코드 감염도 없었음
  • 강력한 권한의 토큰이 남아 있던 angulartics2 공유 저장소에 관리자가 악의적 워크플로우를 강제 푸시한 경로로 분석됨

주요 진행 상황

  • 피해 사실 인지 후 GitHub와 npm 보안팀이 즉각적으로 대응해 문제가 된 패키지 버전을 비공개 처리
  • 이후 피해자가 클린 버전을 새로 배포하여 설치 캐시를 모두 갱신하고 신뢰성 회복 조치 진행
  • 공격자는 약 20개의 패키지에 악성 버전을 게시하였으며, 그 중 @ctrl/tinycolor는 주간 200만회 이상 다운로드되는 주요 패키지임
  • 악성 버전 설치 시 postinstall 스크립트가 실행되어 추가 피해 우려가 있었음

대응 방법 및 교훈

  • 만약 악성 패키지 버전을 설치한 경우, 추가 조치 사항은 StepSecurity 문서를 참고할 수 있음
  • 지속적으로 semantic-release 및 pnpm을 사용해 게시 자동화 및 postinstall 보호 기능을 적극 활용 중임
  • 새로운 기여자는 받지 않으며, 각 저장소별로 권한이 분리된 npm 토큰만 사용해 위험도를 낮추고 있음
  • 인증 강화(2FA) 및 OIDC 기반 Trusted Publishing으로 전환 준비 중이며, 추후 완전히 도입 가능 시 더 이상 정적 토큰을 사용하지 않을 계획임
  • 보안성을 높이기 위해 추후 GitHub UI 내에서 2FA 기반 수동 승인 워크플로우와 같은 안전한 게시 옵션 희망

향후 바람 및 개선 요구

  • npm에서 OIDC 기반 Trusted Publishing을 계정 수준 옵션으로 일괄 적용하고, 증명(provenance)이 없는 게시를 차단할 수 있는 설정 필요성 강조
  • semantic-release와 OIDC 연동 공식 지원 촉구
  • GitHub 보호 환경(Environments) 등 워크플로우 보안 옵션을 프로 사용자 전용이 아니라 모두 이용 가능하게 하는 개선 요구
  • npm 패키지 상세 페이지에서 postinstall 스크립트 존재 여부를 더 눈에 띄게 표시할 것과, 삭제된 버전의 정보 투명성 확대 필요 의견

결론

  • 이러한 공급망 공격에서 협력적이고 신속한 보안팀 공동 대응의 중요성 체감
  • 앞으로도 강력한 인증, 권한 분리, 자동화 안전성 확보가 공급망 보안의 핵심 과제임을 확인함

Read Entire Article