github

npm 및 GitHub Actions의 공급망 공격 교란 (새 탭에서 열림)

npm과 GitHub Actions를 겨냥한 공급망 공격은 계정 탈취, CI/CD 취약점 악용, 자격 증명 탈취, 악성 패키지 확산을 연쇄적으로 결합한다. GitHub는 단일 방어 기능보다 공격 단계별로 핵심 연결고리를 끊는 다층 방어가 필요하다고 보고, npm과 GitHub Actions에 계정 보호·워크플로 권한 제한·캐시 보호·무자격 증명 배포 등의 기능을 도입했다. 목표는 공격을 완전히 제거하기보다 초기 침해와 권한 상승, 자격 증명 유출, 대규모 확산을 차단하고 탐지·대응 시간을 확보하는 것이다.

공급망 공격의 구조

  • 공격은 대개 다음 단계로 진행된다.
    • 유지보수자 계정이나 프로젝트의 GitHub Actions 워크플로를 침해한다.
    • CI/CD 환경에서 더 높은 권한과 자격 증명을 찾는다.
    • 토큰과 계정 정보를 외부로 유출한다.
    • 탈취한 자격 증명으로 다른 패키지와 프로젝트를 연쇄적으로 감염시킨다.
  • 공격 방식은 다양하지만, 초기 침해·권한 상승·확산이라는 공통된 흐름을 가진다.
  • 따라서 하나의 보안 기능보다 공격 사슬의 영향력이 큰 지점을 여러 단계에서 차단하는 접근이 필요하다.

초기 침해 차단

  • 고영향 npm 계정 보호

    • 이메일 주소를 변경하거나 2FA 복구 코드를 사용한 고영향 npm 계정은 72시간 동안 읽기 전용 상태가 된다.
    • 피싱으로 계정을 탈취당하더라도 공격자가 즉시 악성 버전을 배포하지 못하게 한다.
    • 해당 기간 동안 유지보수자가 계정을 복구하거나 이상 행위를 확인할 수 있다.
  • pull_request_target의 안전한 checkout 기본값

    • 포크에서 제출된 풀 리퀘스트의 신뢰할 수 없는 코드를 워크플로가 실행하는 “pwn request” 취약점을 완화한다.
    • actions/checkout은 일반적으로 악용되는 트리거에서 포크의 비신뢰 코드를 checkout하지 않도록 변경됐다.
    • 관리자가 위험을 검토한 뒤 명시적으로 예외를 선택해야 하며, 기존 버전에도 변경 사항이 백포트됐다.
  • 워크플로 실행 주체와 트리거 제한

    • 엔터프라이즈·조직·저장소 수준에서 누가 워크플로를 실행할 수 있는지 설정할 수 있다.
    • 허용할 워크플로 트리거 유형도 제한할 수 있다.
    • 이를 통해 Actions 인프라에 최소 권한 원칙을 적용하고 공격 표면을 줄인다.
  • 비신뢰 트리거의 Actions 캐시 읽기 전용화

    • 공격자가 워크플로 실행 권한을 얻은 뒤 공유 캐시를 오염시켜 더 높은 권한의 워크플로를 공격하는 경로를 차단한다.
    • 신뢰도가 낮은 워크플로는 다른 워크플로와 공유되는 캐시를 수정할 수 없게 된다.
    • 결과적으로 릴리스·패키지 배포 워크플로의 고권한 자격 증명 탈취로 이어지는 권한 상승을 어렵게 만든다.

자격 증명 탈취와 유출 방지

  • 장기 자격 증명 제거

    • CI/CD 파이프라인에 저장된 장기 토큰은 공격자가 가장 먼저 노리는 대상이다.
    • npm Trusted Publishing은 장기 자격 증명 없이 패키지를 배포하도록 해 탈취 가능한 비밀 정보를 줄인다.
    • CircleCI도 Trusted Publishing 공급자로 추가되어, CircleCI 기반 배포에서도 장기 자격 증명 제거가 가능해졌다.
  • Actions 네트워크 방화벽

    • 기술 프리뷰 단계의 기능으로, Actions 실행 중 발생하는 모든 외부 네트워크 트래픽을 기록한다.
    • 악성 코드 다운로드나 새 도메인으로의 자격 증명 유출처럼 비정상적인 통신을 탐지하는 데 활용할 수 있다.
    • 향후에는 네트워크 외부 연결 제한과 정책 기반 차단을 지원해 유출이 발생하기 전에 공격을 막는 방향으로 확장될 예정이다.

악성 패키지 확산 억제

  • npm 단계적 게시(Staged Publishing)
    • 패키지 배포 자격 증명만 가지고는 새 버전을 즉시 공개할 수 없도록 한다.
    • 배포된 패키지는 추가 승인과 npm CLI 또는 npmjs.com에서의 2FA 인증이 완료될 때까지 보류된다.
    • 선택적으로 활성화할 수 있으며, 자동화·CI/CD 자격 증명과 실제 배포 승인 절차를 분리한다.
    • 탈취된 배포 자격 증명으로 악성 버전을 대규모 배포하는 공격을 줄인다.

실용적인 권장 사항

npm 유지보수자는 고영향 계정 보호, Trusted Publishing, 단계적 게시를 검토하고, GitHub Actions 사용자는 포크 PR 처리 방식과 캐시 공유 구조를 점검하는 것이 좋다. 또한 워크플로 실행 주체를 최소화하고, Actions 네트워크 트래픽을 모니터링하면 자격 증명 유출과 연쇄 확산을 조기에 발견할 가능성을 높일 수 있다.