탈취된 GitHub 토큰으로 6만여 저장소 탐색…CI 악성 코드 실행은 약 6,500곳 추정
Aikido의 Oliver Smith는 탈취된 GitHub 토큰을 이용한 4,837개 계정이 61,764개 저장소에 탐색용 PR을 열었다고 보고했습니다. 무작위 표본 1,500곳 중 10.6%(±1.6%)에서 악성 코드가 실행됐고, Aikido는 전체 약 6,500곳으로 추산했습니다. 악성 워크플로는 실행에 제공된 비밀값과 클라우드 인증정보 등을 외부로 보내도록 구성됐습니다.
보안업체 Aikido의 Oliver Smith는 2026년 11월 10일부터 시작된 GitHub Actions 정보 탈취 캠페인을 보고했습니다. Aikido가 수집한 자료에 따르면 탈취된 GitHub 토큰을 이용한 4,837개 계정이 61,764개 저장소에 탐색용 풀 리퀘스트(PR)를 열었습니다. 이는 공격자가 접근을 시도한 저장소 수입니다. 악성 코드 실행 여부는 별도 표본 조사로 추정했습니다.
공격자는 저장소마다 먼저 docs: dependency audit notes라는 제목의 PR을 열어 쓰기 권한을 확인했습니다. 권한이 확인되면 세 가지 경로 중 하나로 코드를 추가했습니다. 기존 GitHub Actions 워크플로에 약 1,500줄을 끼워 넣거나, .ci-xxxxxx.sh 스크립트를 만들고 package.json의 postinstall 항목에 연결해 npm install 때 실행되게 했습니다. 또는 chore/로 시작하는 임시 브랜치에 새 워크플로 파일을 추가했습니다.
GitHub Actions는 저장소 코드를 빌드하거나 배포하는 자동화 도구입니다. 워크플로 작성자는 저장소나 조직에 설정된 비밀값을 secrets 문맥으로 작업에 전달할 수 있습니다. Aikido가 제시한 악성 워크플로는 secrets와 vars 값을 모아 외부 서버로 보내도록 구성됐습니다. 따라서 해당 실행에 제공된 비밀값은 저장소 파일에 기록되지 않았어도 악성 코드가 읽을 수 있습니다.
Aikido는 악성 코드가 Actions의 GITHUB_TOKEN과 실행·캐시 토큰, 실행 환경의 메모리와 환경 변수에 남은 비밀값, AI 서비스 API 키도 수집 대상으로 삼았다고 밝혔습니다. 클라우드 인스턴스 메타데이터나 OIDC 인증으로 얻는 AWS·Google Cloud·Azure 자격증명, 저장소 내용과 Git 이력, Actions 캐시와 빌드 산출물도 대상에 포함됐습니다. 실제로 읽을 수 있는 값은 해당 워크플로 실행에 제공되거나 실행 환경에서 접근 가능한 정보입니다.
공격자는 코드를 넣은 뒤 최대 1분 안에 변경을 되돌리고 워크플로 실행 기록과 로그를 삭제했습니다. Aikido가 GitHub 검색에서 찾은 docs: dependency audit notes PR은 2026년 11월 10일 12:45 UTC부터 11월 11일 15:00 UTC 사이에 61,839개였습니다. 그중 10,431개는 계정 소유자가 아닌 저장소에 열렸으며, 협업자나 조직 권한으로 쓰기가 가능했던 사례였습니다. 수집 당시 PR의 92%가 열린 상태였습니다.
실행 비율은 표본을 통한 추정치입니다. Aikido가 무작위로 뽑은 탐색 대상 저장소 1,500곳 가운데 10.6%(±1.6%)에서 악성 코드가 실행됐습니다. Aikido는 이 비율을 전체 탐색 대상에 적용해 약 6,500곳, 약 11%에서 실행됐다고 추산했습니다. 표본에서 코드가 실행된 159곳 중 156곳은 실행 기록이 삭제돼 있었습니다. Aikido는 악성 코드가 실행된 저장소에서는 워크플로가 사용할 수 있던 비밀값과 클라우드 권한이 침해된 것으로 간주하라고 권고했습니다.
Aikido는 PR 제목 외에도 ci: refresh build cache, chore: add ci helper, chore: add dependency audit workflow 같은 커밋 메시지와 chore/로 시작하는 짧은 브랜치를 공격 흔적으로 제시했습니다. 공격 코드는 자동 게시 절차를 통해 패키지에도 들어갔습니다. Aikido는 Packagist의 digitalelvis/neuronai-studio 3.14.3을 설치하거나 열어 본 기기를 침해된 것으로 간주하라고 권고했습니다. Go 모듈 github.com/onuragtas/docker-env의 v1.0.278과 v1.0.280에서는 워크플로 파일만 바뀌었고 Go 소스와 배포 바이너리는 그대로였습니다. Go 빌드는 GitHub Actions 워크플로 파일을 실행하지 않아 모듈 이용자에게 영향이 없었을 가능성이 있지만, Aikido는 해당 버전의 제거를 권고했습니다.
공격에 쓰인 계정 일부는 10월 GhostActions 활동 때 관측된 계정과 겹쳤습니다. Aikido는 이번 캠페인의 인프라와 도구, 공격 수법이 다르다는 이유로 두 활동을 같은 행위자의 소행으로 분류하지 않았습니다.