원문 캡처 · thenewstack.io
원문 캡처 · thenewstack.io

해커들이 깃허브 계정 약 1,900개에 접근한 뒤 3만 개가 넘는 저장소의 워크플로에 자격 증명을 훔치는 코드를 넣었다. 악성 GitHub Actions 작업은 CI/CD 비밀값과 클라우드 접근 키, AI 업체 API 키를 노렸다. GitGuardian은 GhostAction 캠페인이 확대되는 과정을 추적했으며, 공격이 가장 집중된 10월 8~9일에는 사용자와 조직 약 3,000곳의 저장소에 접근해 비밀값 3,174개를 빼내려 했다.

계정 침해와 악성 워크플로

tj-actions/changed-files 침해 사건은 수천 개 저장소에서 쓰이는 공유 액션을 오염시켰다. GhostAction은 다른 방식을 택했다. 탈취한 개발자 자격 증명으로 저장소의 워크플로를 직접 수정했으며, GitHub Actions 자체의 취약점을 이용한 것은 아니었다.

공격자들이 자격 증명을 어떻게 얻었는지는 확인되지 않았다. 다만 StepSecurity의 10월 9일 분석은 자격 증명 유출 자료에서 가져온 개인용 액세스 토큰(PAT)이 유력한 경로라고 봤다. 최초 침해 경로는 확인되지 않았다.

공격자들은 저장소에 접근한 뒤 보안 검사 작업처럼 보이는 워크플로를 추가했다. 파일 이름은 security-audit.yml이나 github_actions_security.yml처럼 지었다. 이 파일들은 정상 빌드에서 이미 쓰던 비밀값을 참조했기 때문에, 실행될 때 해당 값을 수집해 공격자가 관리하는 서버로 보낼 수 있었다.

Git 기록에 남은 키도 탐색

10월 변종은 워크플로에서 명시적으로 참조하는 비밀값을 넘어섰다. actions/checkout@v4와 fetch-depth: 0을 사용해 작업 트리와 Git 기록 전체를 검색하면서 AWS 키, GitHub와 GitLab PAT, Google 및 Firebase 키, Anthropic·OpenAI·OpenRouter의 API 토큰을 찾았다. 이후 버전은 AWS 키 ID와 짝을 이루는 비밀 액세스 키를 찾도록 주변 줄도 함께 수집했다.

수집한 자격 증명은 HTTP를 통해 193.32.204.199로 전송됐다. 현재 코드에서 삭제된 키라도 Git 기록에 남아 있으면 공격 대상이 될 수 있었다.

차단과 피해 범위

GitGuardian은 공격이 여러 단계로 배포됐다고 밝혔다. 처음에는 앞서 표적이 된 피해자 약 160곳에 배포했고, 20분 뒤인 10월 8~9일에는 새 저장소 2만8,000곳으로 확대했다. GitGuardian의 분석 글에 따르면, 탈취된 자격 증명의 총수는 아직 알려지지 않았다. 3,174개 비밀값이 추출 대상으로 지정됐고 10월 공격에서 일부가 유출된 사실은 확인했지만, 공격자에게 실제로 전달된 고유 자격 증명이 몇 개인지는 파악하지 못했다.

8~9월 캠페인에서는 공개 저장소 772곳, 사용자와 조직 373곳에서 악성 워크플로가 확인됐다. 저장소 605곳에서 기록된 워크플로 실행 3,669건 가운데 실제로 실행된 것은 499건이었다. 이 중 336건은 성공적으로 완료돼 저장소 13곳에서 비밀값 26개를 빼냈다.

GitHub의 승인 제어는 대부분의 악성 워크플로 실행을 막았지만, 공격자들은 이전 공격에서 남겨둔 워크플로 92개를 재활용했다. 여기에는 2025년 9월부터 활성화된 인프라도 포함됐다. GitGuardian은 10월 5일까지 영향을 받은 저장소 가운데 16%인 124곳만 정리됐다고 밝혔다.

노출됐을 수 있는 자격 증명은 폐기하거나 교체해야 한다. GitHub 감사 기록과 PAT 활동 기록으로 .github/workflows/를 수정한 계정을 확인하고, Actions 실행 기록으로 어떤 작업이 실행됐으며 어떤 비밀값에 접근할 수 있었는지 살펴볼 수 있다. 악성 워크플로를 삭제했더라도 쓰기 권한이 남아 있는 침해 계정의 자격 증명은 폐기해야 한다.

공격 중 노출됐을 가능성이 있는 클라우드 키, 배포 자격 증명, 레지스트리 토큰, AI 업체 API 키도 폐기하거나 교체해야 한다. 코드에서 몇 달 전에 삭제했더라도 유효한 상태로 Git 기록에 남아 있었다면 공격자가 찾아냈을 수 있다.