# `tj-actions/changed-files` GitHub Action 해킹됨 - 23000개 Repo가 사용중

> Clean Markdown view of GeekNews topic #19770. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=19770](https://news.hada.io/topic?id=19770)
- GeekNews Markdown: [https://news.hada.io/topic/19770.md](https://news.hada.io/topic/19770.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-03-16T09:17:54+09:00
- Updated: 2025-03-16T09:17:54+09:00
- Original source: [stepsecurity.io](https://www.stepsecurity.io/blog/harden-runner-detection-tj-actions-changed-files-action-is-compromised)
- Points: 3
- Comments: 2

## Topic Body

- 각 브랜치의 변경사항을 추적하는데 사용하는 인기 GitHub Action으로, 해킹된 커밋을 통해 **CI/CD 시크릿 유출 시도**가 발생  
- **23,000**개의 Repo가 영향받았고, GitHub는 이 액션을 삭제했으며 더 이상 사용 불가능함  
- **대체 액션으로 교체** 및 공개 워크플로 로그에서 **시크릿이 노출되었을 가능성 존재**하므로 확인 후 **키 로테이션 필수**  
- StepSecurity의 **Harden-Runner**가 발견했고, 보안이 강화된 대체 액션 [step-security/changed-files](https://github.com/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**](https://www.cve.org/CVERecord?id=CVE-2025-30066)임  
  
### 복구 조치 방법  
- # 1. StepSecurity에서 제공하는 보안 대체 액션 사용  
  - `tj-actions/changed-files` 액션을 `step-security/changed-files@v45` 로 교체   
- # 2. 모든 tj-actions/changed-files 참조 제거  
  - 코드베이스에서 tj-actions/changed-files 참조 검색 후 제거:  
    ```bash  
    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](https://github.com/tj-actions/changed-files/issues/2463)  
- tj-actions/changed-files 리포지토리 삭제됨  
- **CVE-2025-30066**으로 공식 등재됨  
- StepSecurity Harden-Runner를 통해 유사한 보안 문제 감지 및 방지 가능  
- 보안 상태를 강화하고 실시간 모니터링을 수행하기 위해 Harden-Runner 설정 권장

## Comments



### Comment 35950

- Author: dl57934
- Created: 2025-03-16T10:19:35+09:00
- Points: 1

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

### Comment 35944

- Author: neo
- Created: 2025-03-16T09:17:54+09:00
- Points: 2

###### [Hacker News 의견](https://news.ycombinator.com/item?id=43367987) 
* 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 표기법이 문제 해결에 좋은 솔루션임
