대상: GitHub에서 저장소를 개발하거나 관리하는 개인과 조직, 그리고 GitHub Actions나 클라우드 자격 증명(OIDC 연동 포함)을 쓰는 모든 분. 이 글은 조사한 보안 업체들의 공개 게시물과 관련 사업자의 안내를 바탕으로 합니다. 공격 절차는 다루지 않습니다.
続報待ち:この記事は公式発表に合わせて更新します
- 대상
GitHub에서 저장소를 개발하거나 관리하는 개인과 조직, 그리고 GitHub Actions나 클라우드 자격 증명(OIDC 연동 포함)을 쓰는 모든 분.
- 확인된 영향 범위표 보기 ↓
- 약 4,800개 계정 악용
- 저장소 61,764개로 탐색용 풀 리퀘스트
- 악성 변경이 있는 저장소
3개 더 보기
- 악성 코드가 실행되어 자격 증명이 전송됨
- 시크릿과 클라우드 자격 증명 탈취
- 게시된 패키지의 오염
가능성이 있다고 한 항목
- 클라우드 쪽 잔존(교체 후에도 남는 설정)
- 아직 확인되지 않은 사항
- 영향을 받은 계정과 저장소의 최종 수(조사 업체마다 집계 방식이 다름)
- 토큰이 처음 어떻게 도난되었는지(클라우드 사업자의 사례를 제외하면 캠페인 전체로는 확인되지 않음)
- GitHub의 공식 발표(11월 14일 확인 시점에는 명시되지 않음)
2개 더 보기
- 같은 행위자의 별도 10월 캠페인과의 관계(업체 A와 C는 단일 행위자라고 단정하지 않음)
- 클라우드 사업자의 토큰 폐기 완료 여부(사업자는 중간에 멈췄다고 추가함)
- 지금 할 일절차 보기 ↓
- 모르는 풀 리퀘스트, 브랜치, Actions 실행을 확인하세요
- 침해된 계정의 토큰, 인증, 세션을 폐기하세요
- 악성 변경이 실행되었을 수 있다면 그 저장소가 읽을 수 있던 모든 시크릿과 클라우드 권한을 교체하세요
3개 더 보기
- 교체 후에도 남는 변경이 없는지 클라우드 쪽을 확인하세요
- 토큰과 서드파티 앱의 목록을 만드세요
- 자사 앱이 버전 관리 폴더를 노출하지 않는지 확인하세요
- 마지막 확인
- 2026년 11월 14일 기준
후속 발표 예정과 확인 기록
조사한 업체들의 게시물은 모두 11월 12일에 게시되었고 수정될 수 있는 것으로 보입니다. 11월 14일 기준으로 GitHub 블로그, 변경 로그, 상태 이력에는 이에 관한 항목이 없었습니다.
저장소 소유자와 개발자가 오늘 해야 할 일
모르는 풀 리퀘스트, 브랜치, Actions 실행을 확인하세요
계정이 쓸 수 있는 모든 저장소(협력자로 참여한 조직 포함)에서 11월 10일 이후의 다음 세 가지를 확인하세요. 업체 A에 따르면 탐색용 풀 리퀘스트 61,839건 가운데 10,431건은 계정이 소유하지 않은 저장소로 갔고, 협력자나 조직 권한을 통해 도달했습니다.
- 본인이나 팀원이 열지 않은 풀 리퀘스트. 제목이 무해해 보여도(문서 업데이트 등) 여러 저장소에서 같은 패턴이 보이면 경고 신호입니다
- 모르는 단명 브랜치, 또는 브랜치가 만들어졌다가 삭제된 흔적
- 모르는 실행이 있거나 실행 번호가 비어 있는 Actions 실행 이력. 업체 A와 C는 공격자가 약 1분 안에 실행과 로그를 삭제한다고 적었으므로 번호의 빈 곳이 단서입니다. 조직 감사 로그도 확인하세요
하나라도 있으면 아래를 계속하세요. 업체 A는 탐색용 풀 리퀘스트가 있는 계정은 이후 단계가 실행되지 않았더라도 침해된 것으로 취급하라고 적었습니다.
침해된 계정의 토큰, 인증, 세션을 폐기하세요
이 순서는 업체 B와 C의 지침을 따릅니다.
- 개인 액세스 토큰, 서드파티 앱(OAuth 앱과 GitHub 앱) 인증, SSH 키, 활성 세션을 폐기한 뒤 필요한 것만 다시 만드세요
- 2단계 인증을 켜세요. 이미 도난된 토큰은 2단계 인증 없이도 작동하므로 토큰 폐기가 먼저입니다(이 사이트의 견해)
- 탐색용 풀 리퀘스트를 닫고 모르는 브랜치를 삭제하세요. 삭제하기 전에 어느 계정으로 만들어졌는지 기록하세요
악성 변경이 실행되었을 수 있다면 그 저장소가 읽을 수 있던 모든 시크릿과 클라우드 권한을 교체하세요
업체 A와 B는 악성 변경이 실행되었다면 그 워크플로가 쓸 수 있던 모든 시크릿과 클라우드 역할을 도난된 것으로 취급하라고 적었습니다.
- Actions 시크릿과 변수(저장소, 환경, 조직 수준), 게시용 토큰(패키지용 포함), 배포 키를 재발급하고 이전 것을 무효화하세요
- OIDC로 클라우드 계정에 접근한다면 그 클라우드 권한도 포함하세요(다음 단계)
- 악성 변경을 받았을 수 있는 저장소를 개발 머신에서 빌드했다면 그 머신이 읽을 수 있던 자격 증명(SSH 키, 클라우드 자격 증명, 패키지 게시 토큰 등)도 교체하세요. 업체 B와 C는 패키지 설치 시점에 실행되는 변경을 보고했습니다
- 11월 10일 이후 패키지를 게시했다면 게시된 버전에 악성 변경이 없는지 확인하세요. 있다면 철회하고 깨끗한 상태에서 다시 게시하세요
교체 후에도 남는 변경이 없는지 클라우드 쪽을 확인하세요
시크릿 교체 후에도 남는 변경으로 업체 A는 AWS 역할 신뢰 정책의 재작성과 Azure 페더레이션 자격 증명의 추가를 들었습니다(업체 B는 남겨진 AWS 액세스 키도 언급). 감사 로그와 현재 설정 양쪽에서 이 두 영역을 확인하세요.
- AWS: 새로 만들어진 액세스 키, 역할 신뢰 정책의 변경(의도하지 않은 계정이나 조건으로 신뢰가 넓어졌는지)
- Azure(Entra ID): 애플리케이션에 추가되어 저장소를 가리키는 페더레이션 자격 증명
별도로, 훔친 자격 증명을 통한 권한 상승 점검으로 Google Cloud(비정상적인 서비스 계정 사용이나 토큰 발급 호출)와 Vault나 Kubernetes(모르는 GitHub OIDC 로그인)도 살펴보세요.
아무것도 찾지 못해도 OIDC 신뢰 조건이 저장소, 브랜치, 환경으로 좁혀져 있는지 확인하세요(아래 「점검할 것」 참조).
토큰과 서드파티 앱의 목록을 만드세요
GitHub 설정에서 다음 목록을 만들고 불필요하거나 모르는 것을 제거하세요.
- 개인 액세스 토큰: 쓰지 않는 것은 삭제하고 나머지는 저장소, 권한, 수명을 제한하세요
- 인증해 준 OAuth 앱과 GitHub 앱(호스팅이나 CI 배포용으로 연결한 것 포함). 더 이상 쓰지 않는 것은 인증을 취소하세요
- SSH 키와 배포 키: 쓰지 않는 키와 소유자 없는 키를 제거하세요
- 봇과 자동화 계정의 권한: 보호된 브랜치 규칙을 우회할 수 있는 것이 있는지 확인하세요
클라우드 사업자의 안내에 따르면 그 사업자의 앱은 다시 연결해야 합니다. 이용한다면 사업자의 지침을 따르세요.
자사 앱이 버전 관리 폴더를 노출하지 않는지 확인하세요
같은 사업자는 GitHub를 통해 배포된 일부 앱이 빌드 디렉터리 전체를 공개하여 거기에 남은 토큰을 가져갈 수 있었다고 설명합니다. 앱의 공개 URL이 버전 관리 폴더(.git)의 내용을 제공하지 않는지 확인하세요. 제공한다면 이미지에서 제외하고 다시 배포한 뒤 그 안에 있던 자격 증명을 교체하세요. 배포 플랫폼이 비슷한 방식을 쓰는지도 확인하세요.
무슨 일이 있었나요(조사 업체와 관련 사업자 기준)
아래 내용은 보안 업체 A, B, C의 공개 게시물(모두 2026년 11월 12일 게시)과 한 클라우드 사업자의 안내(11월 12일 밤에 알게 됨, 11월 13일 추가)를 바탕으로 합니다. 이는 당사자와 조사자 자신의 설명이며 GitHub가 확인한 것은 아닙니다. 별도 표시가 없으면 시각은 UTC입니다.
11월 10일 약 12:45
업체 A에 따르면 공격자는 도난된 토큰으로 각 토큰이 쓸 수 있는 저장소에서 활동을 시작했습니다. 저장소마다 먼저 탐색용 풀 리퀘스트를 보내고, 악성 변경을 하고, 약 1분 안에 되돌리고, 실행과 로그를 삭제했습니다. 업체 B도 첫 악성 변경을 12:46으로 집계합니다.11월 11일 15:00
업체 A가 집계한 탐색용 풀 리퀘스트 61,839건의 집계 기간 종료.11월 12일 04:36
업체 B가 집계한 악성 변경이 있는 공개 저장소 8,093개의 집계 기간 종료.11월 12일 07:40
업체 C가 탐색용 풀 리퀘스트를 63,000건 이상으로 집계한 시각. 업체 A, B, C는 같은 날 게시물을 올렸습니다.11월 12일 22:00(시간대 미기재)
한 클라우드 사업자가 자사 GitHub 앱에 발급된 토큰이 고객 저장소에서 무단으로 쓰였음을 (11월 12일에, 시각 미기재) 알게 되었다는 안내를 게시했습니다(사업자의 안내).11월 13일 15:54
사업자는 모든 사용자 토큰의 폐기가 중간에 멈췄고 GitHub가 조사 중이라고 추가했습니다(사업자의 안내).
도난된 유효한 토큰
탐색용 풀 리퀘스트로 쓰기 가능 여부를 시험
↓→
악성 변경
CI 시크릿과 클라우드 자격 증명을 모아 외부로 전송
↓→
흔적 지우기
변경을 되돌리고 실행과 로그를 삭제. 클라우드에 설정이 남을 수 있음
출처별 수치(합산하지 마세요)
| 출처(역할) | 집계 대상 | 수치 | 비고 |
|---|---|---|---|
| 업체 A(최초 보고) | 탐색용 풀 리퀘스트를 보낸 계정 / 받은 저장소 | 계정 4,837개 / 저장소 61,764개 | 약 92%가 아직 열려 있음(분모는 계정이 소유하지 않은 저장소로 보낸 PR 10,431건) |
| 업체 A | 악성 코드가 실행되어 자격 증명이 전송된 저장소 | 최소 1,835(다른 곳에서는 1,806) | 게시물 안의 두 수치. 최소치일 수 있다고 밝힘 |
| 업체 A | 패키지를 게시할 수 있는 계정 | 최소 50 | npm, Go, PyPI, Packagist, crates의 게시 권한(파악한 범위) |
| 업체 B | 악성 변경이 있는 공개 저장소(11월 10일 12:46–11월 12일 04:36) | 8,093 | 실행된 수가 아님. 내역 합계는 8,096이며 차이는 설명되지 않음 |
| 업체 B | 탐색용 풀 리퀘스트 | PR 61,879건 / 계정 4,833개 / 저장소 61,734개 | 8,093에는 포함되지 않음 |
| 업체 C | 탐색용 풀 리퀘스트(11월 12일 07:40 기준) | 63,000건 이상 | 약 90%가 열려 있음. 그중 173건(계정 19개)은 한 클라우드 사업자의 GitHub 앱에 발급된 토큰을 통함 |
| 클라우드 사업자(자체 안내) | 영향을 받은 고객 계정에서 발견된 탐색용 풀 리퀘스트 | 250건 이상 | 소수의 고객이 영향을 받았다고 밝힘 |
업체 B는 수치가 GitHub 검색에서 나온 것이며 이는 공개 저장소의 기본 브랜치만 다루므로 실제 총계는 더 높을 가능성이 있다고 적었습니다.
- 탈취된 것
- GitHub Actions 시크릿과 변수, 워크플로 토큰, 클라우드 자격 증명(AWS, Azure, Google Cloud), 개발자 및 AI 서비스 자격 증명(업체 A)
- 원인(조사자의 설명)
- 도난된 유효한 토큰의 악용이며 GitHub Actions의 결함이 아님(업체 C). 커밋이 서명 없이 실제 사용자 이름으로 나타나는 것은 도난된 토큰을 가리킴(업체 B의 추론)
- 토큰을 얻은 방법
- 캠페인 전체로는 확인되지 않음. 클라우드 사업자의 앱을 통한 부분에 대해서도 업체 C는 토큰을 어떻게 얻었는지 확인하지 못했고 사업자 인프라가 침해된 증거는 없다고 밝힘
- 클라우드 사업자의 설명
- 자사 인프라는 침해되지 않음. GitHub 기반 배포에서 빌드 디렉터리의 설정 파일에 토큰이 남았고 일부 앱이 디렉터리 전체를 공개해 가져갈 수 있었음. 소수의 고객이 영향을 받았고 개별 연락함. 앱에 발급된 모든 사용자 토큰의 폐기를 시작했고 배포 과정을 바꿈. 자사 명령줄 도구를 통한 배포, API 토큰, 실행 중인 앱은 영향이 없다고 밝힘
- 패키지에 대한 영향
- 업체 B는 소스 저장소가 악성 변경을 받은 npm, Go, Packagist 패키지 218개를 조사했습니다. 악성 버전이 있었던 패키지는 3개(Packagist 1개, Go 2개), 목록상 합계 5개 버전이었고 다른 것은 찾지 못했습니다. PyPI 등은 조사하지 않았습니다. 업체 A도 공격자의 목표를 CI 시크릿으로 보며 패키지 오염은 자동 게시의 부수 효과로 봅니다
- 별도 10월 캠페인과의 관계
- 업체 A는 10월 캠페인의 피해 계정이 이번에도 당할 가능성이 더 높았다고 하면서도 서로 다른 행위자의 별개 작전으로 평가합니다. 업체 C도 겹침이 단일 행위자를 증명하지 않는다고 밝힙니다(도난된 토큰은 공유되고 판매됨)
- GitHub의 공식 발표
- 명시되지 않음(2026년 11월 14일 블로그, 변경 로그, 상태 이력 확인)
확인된 내용과 확인되지 않은 내용
2026년 11월 14일 기준 상태입니다. 새 소식이 있으면 상태 열을 업데이트합니다.
| 항목 | 공개된 내용 | 상태 |
|---|---|---|
| 약 4,800개 계정 악용 | 도난된 유효한 토큰으로 탐색용 풀 리퀘스트 전송 | 확인됨(업체 A, B) |
| 저장소 61,764개로 탐색용 풀 리퀘스트 | 변경이 뒤따랐는지와는 다른 수 | 확인됨(업체 A, 업체 B는 61,734로 집계) |
| 악성 변경이 있는 저장소 | 공개 저장소 8,093개 | 확인됨(업체 B, 공개 저장소와 기본 브랜치만) |
| 악성 코드가 실행되어 자격 증명이 전송됨 | 최소 1,835개 저장소 | 확인됨(업체 A, 1,806도 제시) |
| 시크릿과 클라우드 자격 증명 탈취 | 실행된 저장소에서 | 확인됨(업체 A, B) |
| 클라우드 쪽 잔존(교체 후에도 남는 설정) | AWS 역할 신뢰 정책 재작성과 Azure 페더레이션 자격 증명 추가(업체 A), 업체 B는 남겨진 AWS 액세스 키도 언급 | 가능성 있음(업체 A, B) |
| GitHub Actions 결함의 악용 | 쓰이지 않음 | 포함되지 않음(업체 C) |
| 게시된 패키지의 오염 | 패키지 3개(Packagist 1개, Go 2개), 합계 5개 버전(다른 것은 찾지 못함) | 확인됨(업체 B, PyPI 등은 미조사) |
| 클라우드 사업자 인프라의 침해 | 증거 없음(업체 C), 사업자는 침해를 부인 | 확인되지 않음(업체 C, 사업자) |
| 토큰이 처음 도난된 방법 | 클라우드 사업자 앱 토큰 일부는 설명됨, 전체로는 불명 | 조사 중 |
| 별도 10월 캠페인과의 관련 | 업체 A는 별개 작전으로 봄, 업체 C는 단정하지 않음 | 조사 중 |
| GitHub의 공식 발표 | 찾지 못함 | 명시되지 않음 |
| 확정된 피해 조직 목록 | 공개되지 않음 | 명시되지 않음 |
읽는 법: 수치는 서로 다른 것을 세며 이틀 사이에 달라졌습니다
업체 A의 1,835는 실행의 추정치이고, 업체 B의 8,093은 악성 변경이 있는 공개 저장소이며, 업체 C의 63,000은 탐색용 풀 리퀘스트입니다. 서로 같은 것이 아닙니다. 탐색용 풀 리퀘스트만 받은 저장소 중 다수는 변경이나 탈취가 없었을 수 있습니다. 그러나 업체 A에 따르면 탐색용 풀 리퀘스트를 보낸 계정은 변경이 뒤따르지 않았더라도 침해된 것으로 취급해야 합니다.
도난된 유효한 토큰이 쓰이면 어떤 일이 생길 수 있나요
아래는 일반적인 설명이며 이번에 이런 일이 있었다는 뜻이 아닙니다. 조사 업체들이 실제로 보고한 내용은 위의 「무슨 일이 있었나요」에 있습니다.
토큰이 유효하면 공격자는 정당한 사용자로서 쓸 수 있습니다. 악용할 GitHub 기능의 약점이 없으므로 소프트웨어 업데이트로는 막을 수 없습니다. 쓰기 권한이 있는 계정이 CI 워크플로를 수정할 수 있다면 그 워크플로가 읽을 수 있는 시크릿과 클라우드 권한이 함께 노려집니다. 클라우드 계정에 대한 OIDC 신뢰가 느슨하면(어떤 브랜치나 워크플로든 들어갈 수 있으면) 저장된 시크릿이 없어도 임시 자격 증명이 발급될 수 있습니다. 계정이 다른 조직의 협력자라면 피해는 본인 소유 범위를 넘어 확대됩니다.
CI와 클라우드 권한에서 점검할 것
이 항목은 피해 당사자에 대한 평가가 아닙니다. 조사자들의 보고를 바탕으로 자신의 환경에서 확인할 것을 이 사이트의 견해로 정리했습니다.
토큰을 넓게, 오래 쥐고 있지 마세요
이번에는 도난된 유효한 토큰이 쓰였습니다. 개인 액세스 토큰은 특정 저장소와 권한으로 제한하고, 수명을 짧게 하고, 쓰지 않으면 삭제하세요(세분화된 유형을 사용). 서드파티 앱은 필요한 범위에만 인증하세요(이 사이트의 견해).
워크플로 권한과 클라우드 진입 조건을 좁히세요
워크플로의 기본 권한을 읽기 전용으로 하고 쓰기는 필요한 곳에만 부여하세요. 클라우드 OIDC 신뢰를 저장소, 브랜치, 환경으로 좁혀 모든 워크플로가 들어갈 수 없게 하세요. 환경 시크릿에 승인자를 두면 고쳐 쓴 워크플로가 운영 시크릿을 그냥 읽을 수 없습니다(이 사이트의 견해).
필수 리뷰로 브랜치 보호를 고치세요
업체 A는 코드에 브랜치 보호를 우회하려는 장치가 들어 있다고 적었습니다. 검사 이름만 믿지 말고 코드 소유자의 승인 리뷰를 요구하고 봇 계정에 예외를 두지 마세요(이 사이트의 견해).
실행 번호의 빈 곳과 클라우드 설정 변경을 감지하세요
이번에는 실행과 로그가 삭제되었고 번호의 빈 곳이 단서였습니다. 조직 감사 로그를 보관하고, 워크플로 변경과 클라우드 액세스 키 생성, 신뢰 정책 변경, ID 연동 추가에 알림을 설정하세요. 업체 C는 CI의 외부 통신을 허용 목록으로 제한하는 것도 권고합니다.
저장소에 시크릿을 두지 마세요
CI 시크릿과 별개로, 코드 이력에 있는 자격 증명은 그것을 읽을 수 있는 사람의 도난된 토큰과 함께 가져갈 수 있습니다. 커밋 전에 잡는 방법은 gitleaks로 커밋 전에 시크릿 막기를, 폐기 순서는 GitHub에 노출된 자격 증명 54만 건이 여전히 유효를 참고하세요.
출처(공개 자료)
이 글의 사실은 아래 공개 정보에서 가져왔습니다. GitHub의 공식 발표는 없습니다(11월 14일 확인). 공격 절차의 세부 사항은 다루지 않습니다.
- GitHub, 「Changelog」와 「Security」(공식 블로그와 변경 로그, 이 건에 관한 항목 없음, 11월 14일 확인) — github.blog / github.blog
- GitHub Status(공식 사고 이력, 이 건에 관한 항목 없음, 11월 14일 확인) — githubstatus.com
- 한 클라우드 사업자의 안내, 「Security: GitHub tokens exposed by apps deployed from GitHub」(공식 커뮤니티 포럼, 11월 12일 인지, 11월 13일 추가, 11월 14일 확인) — community.fly.io
- 업체 A(보안 업체, 최초 보고), 「wfx-loot campaign pushes CI secret stealer to tens of thousands of repositories」(2026년 11월 12일, 11월 14일 확인) — aikido.dev
- 업체 B(보안 업체), 「wfx: GitHub Actions Credential Stealer Hits 8,000 Repos」(2026년 11월 12일, 11월 14일 확인) — safedep.io
- 업체 C(보안 업체), 「WFX Phantom: The GitHub Actions Secret Stealer That Deletes Its Tracks」(2026년 11월 12일, 11월 14일 확인) — stepsecurity.io
- 언론: BleepingComputer, 「Hackers compromise 4,800 GitHub accounts to steal cloud credentials」(11월 확인, 업체 A 게시물 보도) — bleepingcomputer.com
업데이트 기록
2026-11-14: 첫 버전. 보안 업체 세 곳의 공개 게시물(모두 11월 12일)과 한 클라우드 사업자의 안내를 바탕으로 작성. GitHub의 공식 발표는 없습니다. 언론 보도가 다른 경우에는 각 당사자의 원 게시물을 1차 출처로 취급합니다. 추가 정보가 나오면 업데이트합니다.
다음으로 읽기
- 폐기되지 않아 계속 유효한 공개 자격 증명: GitHub에 노출된 자격 증명 54만 건이 여전히 유효
- GitHub 기반 개발이 노려진 또 다른 사례: TanStack과 Nx 공급망 공격
- 폐기 순서와 패키지로 퍼지는 피해: npm 공급망 공격 방어
- 계정 보호: GitHub 2단계 인증 / 환경 변수와 API 키 기본
- 정당한 자격 증명으로 일어나는 사고: 2026년의 침해는 정당한 자격 증명으로 일어난다
- 2026년 기타 사고: 2026년의 데이터 유출과 사이버 공격