3P by GN⁺ 16일전 | ★ favorite | 댓글 2개
  • 각 브랜치의 변경사항을 추적하는데 사용하는 인기 GitHub Action으로, 해킹된 커밋을 통해 CI/CD 시크릿 유출 시도가 발생
  • 23,000개의 Repo가 영향받았고, GitHub는 이 액션을 삭제했으며 더 이상 사용 불가능함
  • 대체 액션으로 교체 및 공개 워크플로 로그에서 시크릿이 노출되었을 가능성 존재하므로 확인 후 키 로테이션 필수
  • StepSecurity의 Harden-Runner가 발견했고, 보안이 강화된 대체 액션 step-security/changed-files를 무료로 배포중

사건 요약

  • tj-actions/changed-files는 23,000개 이상의 저장소에서 사용되고 있으며 해킹 발생
    • 공격자는 액션 코드 수정 및 버전 태그를 악성 커밋으로 재지정함
    • 이로 인해 GitHub Actions 빌드 로그에 CI/CD 시크릿이 출력
  • 공개된 워크플로 로그에서 시크릿이 노출되었을 가능성 존재
  • Harden-Runner가 예상치 못한 엔드포인트 탐지 후 문제 발견
  • 악성 Python 스크립트가 Runner Worker 프로세스에서 시크릿을 덤프하도록 함
  • 모든 태그가 동일한 악성 커밋 해시 (0e58ed8671d6b60d0890c21b07f8835ace038e67)로 지정됨

GitHub의 대응 조치

  • GitHub는 tj-actions/changed-files 액션을 삭제하고 사용을 중단시킴
  • 공식 CVE는 CVE-2025-30066

복구 조치 방법

  • 1. StepSecurity에서 제공하는 보안 대체 액션 사용

    • tj-actions/changed-files 액션을 step-security/changed-files@v45 로 교체
  • 2. 모든 tj-actions/changed-files 참조 제거

    • 코드베이스에서 tj-actions/changed-files 참조 검색 후 제거:
      git grep -l "tj-actions/changed-files"  
      
  • 3. GitHub Actions 워크플로 실행 로그 감사

    • 최근 실행 로그에서 시크릿이 유출되었는지 확인 필요
    • 유출된 시크릿이 발견되면 즉시 로테이션(재설정) 필요
  • 4. GitHub Actions 허용 목록 설정

  • 신뢰할 수 있는 GitHub Actions만 실행하도록 허용 목록 구성:
    • GitHub 설정에서 허용 설정 가능:
      • Settings → Actions → Allow select actions
  • 5. StepSecurity Harden-Runner 설정

    • Harden-Runner에서 네트워크 트래픽 및 워크플로 실행 모니터링 설정 가능

다음 단계

  • GitHub에 문제 보고 완료 → GitHub 이슈: #2463
  • tj-actions/changed-files 리포지토리 삭제됨
  • CVE-2025-30066으로 공식 등재됨
  • StepSecurity Harden-Runner를 통해 유사한 보안 문제 감지 및 방지 가능
  • 보안 상태를 강화하고 실시간 모니터링을 수행하기 위해 Harden-Runner 설정 권장
Hacker News 의견
  • Renovate의 작성자 및 유지보수자가 공격 시나리오를 설명함

    • 공격자가 tj-actions/changed-files 저장소에 쓰기 권한을 가졌음
    • 공격자는 Renovate 커밋을 스푸핑하여 최근 커밋을 위장했음
    • 이 스푸핑은 PR을 속이기 위한 것이 아니라 단순히 혼란을 주기 위한 것이었음
    • 커밋은 Unverified로 표시되었고, 대부분의 사람들은 서명된 커밋만을 강제하지 않음
    • 실제 Renovate Bot은 의존성을 업데이트하기 위한 PR을 제안함
    • 일부 사람들은 자동 병합을 활성화했지만, 이는 기본 설정이 아님
    • 이 사건은 많은 사람들이 git 태그가 불변이라고 잘못 생각한다는 것을 상기시킴
  • 최근 몇 년 동안 타사 의존성과 확장에 대한 신뢰가 줄어들고 있음

    • npm 패키지의 의존성이 많으면 설치하지 않음
    • vscode나 chrome 확장을 설치하지 않음
    • 악성 코드가 추가되거나 라이선스가 변경되는 경우가 많음
    • eslint의 의존성 트리를 보면 모든 것을 신뢰할 수 있는지 의문임
  • 저장소가 다시 온라인 상태가 되었고 개발자가 설명을 제공함

    • 공격은 @tj-actions-bot 계정의 PAT 토큰에서 발생했음
    • 계정 보안이 강화되었고, GitHub는 손상된 PAT를 취소함
  • Clickhouse에서 github_events를 조사하여 공격에 사용된 계정을 확인함

    • "2ft2dKo28UazTZ", "mmvojwip" 계정이 의심스러움
  • CI/CD를 실행하는 방식이 GitHub의 임의 저장소를 나열하는 것이라는 점이 충격적임

    • LLMs의 증가로 인해 문제가 더 심각해짐
    • 중요한 작업은 수동으로 실행해야 함
  • StepSecurity의 공동 창립자가 보안 사고를 감지한 방법을 설명함

    • Harden-Runner가 GitHub Actions 워크플로우의 네트워크 호출을 모니터링하여 이상 징후를 감지함
  • GitHub Actions의 기본 사용 방식이 불변하지 않은 git 태그를 사용하는 것이 문제임

    • SHA-1 해싱 알고리즘이 충돌을 일으킬 수 있어 SHA-256 지원이 필요함
  • 불변 GitHub Actions가 도입될 예정임

    • Actions를 포크하거나 커밋 해시를 사용함
  • maven-lockfile 프로젝트가 자동 병합된 PR을 설명함

    • 진짜 Renovate Bot이 가짜 Renovate Bot의 커밋을 자동 병합함
  • GitHub Actions는 의존성에 대해 lockfile을 사용해야 함

    • Semver 표기법이 문제 해결에 좋은 솔루션임

어제 밤에 안되던데 지금은 또 되네요