2026년 7월, 경찰청 국가수사본부가 GitHub 개인 액세스 토큰(Personal Access Token, PAT) 대량 유출 사건을 확인했다고 발표했다. 별건 사이버범죄 수사 중 한 용의자가 타인 명의의 GitHub 토큰을 보유하고 있는 것이 발견되면서 수사가 확대됐고, 그 결과 500여 개 계정의 토큰이 유출된 것으로 파악됐다. 이 글에서는 사건 개요를 정리하고, PAT 유출이 실제로 왜 위험한지, 그리고 실무에서 어떻게 막을 수 있는지를 다룬다.
사건 개요
- 발견 경위: 경찰이 별건 사이버범죄 수사를 진행하던 중, 용의자가 타인의 GitHub 접속 토큰을 갖고 있는 것을 확인하면서 조사가 시작됐다.
- 규모: 총 500여 개 계정이 영향을 받은 것으로 파악됐다. 이 중 370개 계정은 54개국에 걸쳐 있는 것으로 확인됐고, 200개 이상은 아직 소유자가 특정되지 않았다. 국내 기업 소유 계정은 약 30개로 파악됐다.
- GitHub(Microsoft)의 조치: 경찰 통보 후 유출된 토큰을 폐기하고 해당 이용자들에게 경고하는 등 필요한 보안 조치를 완료했다고 보고했다.
- 후속 대응: 국가수사본부는 Microsoft에 통보하고 인터폴과도 조사 내용을 공유했으며, 전국 단위 보안 권고문을 배포했다.
경찰 사이버수사기획관은 "공격자가 기업의 정보통신망뿐 아니라 개발 인프라까지 노리고 있다는 것을 보여주는 사례"라며 기업과 개발자 모두의 신속한 보안 조치가 필요하다고 강조했다.
PAT가 유출되면 실제로 무슨 일이 벌어지나
개인 액세스 토큰은 비밀번호 대신 API·Git 클라이언트가 GitHub에 인증하는 수단이다. 문제는 토큰 하나가 발급받은 스코프(scope) 전체에 대한 접근권을 그대로 대변한다는 점이다. 유출된 토큰의 스코프에 따라 공격자는 다음이 가능해진다.
- 비공개 저장소 접근: 소스코드, 내부 설정 파일, 배포 스크립트를 그대로 열람·다운로드
- 코드 푸시(쓰기 권한이 있는 경우): 저장소에 악성 커밋을 밀어넣어 공급망 공격(supply chain attack)으로 확장. 실제로 유출된 개발자 자격증명을 통해 저장소 push 권한을 확보하고, 여기에 난독화된 드로퍼(dropper)를 심어 npm에 악성 패키지를 배포한 사례가 같은 시기에 보고되기도 했다.
- CI/CD 파이프라인 오염: 저장소에 접근 가능하면 Actions 워크플로에 정의된 다른 시크릿(배포 키, 클라우드 자격증명 등)까지 연쇄적으로 노출될 수 있다.
- 정보 수집 발판: 코드에 하드코딩된 내부 시스템 접속 정보, API 키, DB 접속 문자열을 확보해 실제 인프라 침투의 초기 진입점으로 활용
즉 PAT 유출은 "저장소 하나 뚫리는 문제"가 아니라, 스코프와 연결된 다른 시스템까지 타고 들어가는 연쇄 침투의 시작점이 될 수 있다.
토큰은 보통 이렇게 샌다
- 소스코드나 설정 파일에 토큰을 하드코딩한 채로 커밋 (특히
.env를 .gitignore에 빠뜨리는 경우)
- 과거 커밋 히스토리에는 남아있는데, 최신 커밋에서만 지운 경우 (git history는 별도로 정리하지 않으면 영구히 남는다)
- CI 로그에 환경변수가 그대로 출력되어 공개 로그에 노출
- 개발자 PC에 설치된 인포스틸러(infostealer) 악성코드가 IDE·브라우저·Git 자격증명 저장소에서 토큰을 탈취
- 만료기간 없이 발급한 토큰을 장기간 방치 — 유출 시점과 발견 시점 사이의 창이 그만큼 길어짐
실무 대응 체크리스트
경찰 권고 사항과 GitHub가 제공하는 기능을 함께 정리하면 다음과 같다.
- 다중인증(MFA) 필수 적용: 계정 자체가 뚫리는 경로를 차단
- 최소 권한 원칙: 꼭 필요한 스코프만 부여. 가능하면 레거시 PAT 대신 저장소 단위로 권한을 세분화할 수 있는 fine-grained PAT 사용
- 만료기간 설정 + 주기적 로테이션: 발급 시 만료일을 반드시 지정하고, 정기적으로 재발급
- 소스코드에 자격증명 하드코딩 금지: 환경변수·시크릿 매니저로 분리,
.gitignore에 .env 계열 파일 포함 여부를 커밋 전에 항상 확인
- 커밋 전 자동 탐지 도구 도입:
gitleaks, git-secrets 같은 pre-commit 스캐너로 토큰·키가 커밋에 섞여 들어가는 것을 사전 차단
- GitHub의 Secret Scanning / Push Protection 활성화: 조직 저장소에 알려진 패턴의 시크릿이 커밋되면 자동 탐지·차단
- 개발자 PC 보안 점검 정기화: 인포스틸러 악성코드 감염 여부를 주기적으로 점검 — 토큰 관리를 아무리 잘해도 단말이 뚫리면 의미가 없다
- 유출 의심 시 즉시 조치: 토큰 revoke → GitHub 조직/저장소 audit log에서 비정상 접근 여부 확인 → 연결된 CI/CD 시크릿까지 함께 재발급
정리
이번 사건에서 눈여겨볼 부분은 유출 자체보다 발견 경위다. 전혀 별개의 사이버범죄 수사 과정에서 우연히 딸려 나온 것이지, 애초에 유출을 탐지하는 체계가 있어서 잡힌 게 아니다. 즉 아직 확인되지 않은 200여 개 계정처럼, 지금 이 순간에도 알려지지 않은 유출이 얼마든지 더 있을 수 있다는 뜻이다.
개인 개발자든 기업이든 "우리는 대상이 아니다"라고 생각하기 쉽지만, 공격자 입장에서 PAT는 스코프만 맞으면 그 자체로 침투 경로가 되는 자격증명이다. 인프라 진단·모의해킹 현장에서도 정찰(recon) 단계에서 공개 저장소나 유출 DB를 뒤져 자격증명부터 찾는 경우가 흔한 이유가 여기에 있다. 코드에 시크릿을 남기지 않는 습관, 스코프를 최소화하는 습관 하나가 실제 침해 여부를 가른다.
참고 자료