Leaked GitHub App private keys let researchers impersonate 440 apps including CDC and BuildBuddy
유출된 GitHub App 개인 키로 CDC·BuildBuddy 등 앱 440개 사칭 가능
GitGuardian이 공개 유출 데이터에서 GitHub 관련 RSA 개인 키 4,802개를 조사해 474개가 여전히 유효하며 앱 440개에 접근할 수 있음을 확인했습니다. GitHub App 키는 만료되지 않아 권한이 큰 앱의 오래된 키가 조직과 공급망을 위협할 수 있습니다.
- 주제
AI 요약
GitGuardian은 공개적으로 유출된 RSA 개인 키 50만 개 이상을 조사해 GitHub와 관련 있고 주변에서 App ID를 찾을 수 있는 키 4,802개를 추렸습니다. 이 가운데 474개, 약 10%가 GitHub API 인증에 여전히 성공했습니다. 키들은 GitHub App 440개에 속했습니다. 개인 키 하나로 앱을 사칭하면 설치된 조직의 저장소나 관리 기능에 접근할 수 있어, 단순한 비밀값 노출을 넘어 공급망 위험으로 이어질 수 있습니다.
GitHub App 인증과 키의 위험
GitHub App은 CI/CD, 코드 보안 검사, 프로젝트 관리, 반복 작업 자동화 등에 쓰는 GitHub 확장 기능입니다. OAuth 앱과 달리 앱 자체의 신원으로 먼저 인증하고, 이후 설치 토큰을 발급받아 앱을 설치한 조직에서 작업합니다. 설치할 때는 앱이 접근할 저장소 범위와 권한을 정합니다. 권한은 저장소 콘텐츠나 Pull Request, 워크플로, 조직 관리 등에 읽기 또는 쓰기로 부여합니다.
앱은 GitHub가 생성한 RSA 개인 키로 RS256 서명 JWT를 만들고 API에 인증합니다. JWT에는 발급 시각(iat), 최대 10분 뒤로 제한된 만료 시각(exp), App ID(iss)가 들어갑니다. GitHub가 JWT를 확인하면 앱 정보와 설치 목록에 접근할 수 있고, 설치 토큰을 발급받아 조직의 저장소에서 작업합니다. 개인 키를 가진 사람은 앱과 구분되지 않는 토큰을 직접 요청할 수 있습니다.
문제는 GitHub App 개인 키 자체에는 만료일이 없다는 점입니다. 관리자가 앱 설정에서 키를 직접 삭제하기 전까지 작동합니다. 짧은 수명의 JWT를 쓰더라도 그 JWT를 발급하는 장기 키가 유출되면 위험이 계속됩니다.
조사 결과와 영향 범위
GitGuardian은 먼저 유출 데이터에서 RSA 개인 키 50만 개 이상을 모았습니다. 이 가운데 GitHub 관련 맥락에서 발견되고 근처에 App ID가 있는 키 4,802개를 대상으로 개인 키로 토큰에 서명한 뒤 /app API에 요청했습니다. 유효한 키라면 앱 정보를 반환하는 방식으로 확인했습니다. 그 결과 키 474개가 앱 440개에 인증됐습니다.
영향을 받은 앱의 설치 수는 0곳에서 303곳까지 다양했습니다. 59%는 설치가 한 곳뿐이어서 공개 제품보다 특정 조직의 내부 자동화나 단일 사용자를 위한 도구일 가능성을 시사했습니다. 72%는 비공개 저장소 콘텐츠를 읽을 권한이 있었고, 207개는 저장소에 쓸 수도 있었습니다. 44개는 조직 관리자 권한, 40개는 자체 호스팅 러너 관리 권한, 98개는 워크플로 제어 권한을 가졌습니다. 이 권한은 조직 장악이나 내부 인프라에서의 코드 실행으로 이어질 수 있습니다. 앱 키 156개는 앱 관리자가 소유하지 않은 저장소에서 유출됐습니다.
확인된 앱 사례
GitHub Actions용 Access Tokens 앱의 개인 키는 2024년 1월 커밋에서 유출됐습니다. 앱은 Civica와 Sierra Nevada Corp.를 포함해 조직 300곳에 설치됐고, 저장소 수정과 조직 관리 권한을 가졌습니다. GitGuardian이 알린 뒤 관리자가 키를 교체했습니다.
BuildBuddy 앱 키는 2025년 6월 소유자 조직의 저장소에서 유출됐습니다. 앱은 10개 조직에 설치됐고 BuildBuddy의 주요 저장소에도 접근할 수 있었습니다. 저장소 쓰기와 관리 권한이 있어 클라이언트와 서버 코드, 나아가 이를 사용하는 CLI 사용자와 자체 호스팅 조직, SaaS 플랫폼에 공급망 피해를 줄 가능성이 있었습니다. BuildBuddy 보안팀은 앱을 비활성화했습니다. 조사에서는 악용 흔적이 발견되지 않았습니다.
Crusher.dev의 테스트 앱 키는 2020년 11월 유출됐습니다. 앱은 설치 범위 내 저장소를 읽을 수 있었습니다. 프로젝트는 3년 동안 유지보수되지 않았고 웹사이트도 내려갔지만, 앱 키와 설치는 여전히 작동했습니다. 프로젝트가 버려진 뒤 앱을 제거하지 않은 사용자의 비공개 코드가 노출될 위험이 남아 있었습니다.
미국 질병통제예방센터(CDC) 관련 앱 키는 2025년 4월 CDCGov 조직 저장소에서 유출됐습니다. 앱은 cdcent 조직의 비공개 저장소 두 곳에 쓰기 권한을 가졌습니다. 공개 문서를 토대로 한 분석에서는 해당 저장소가 CDC 저장소와 Azure 인프라의 상호작용을 중개하는 것으로 보였으며, 앱을 이용해 CDC Azure 테넌트에서 코드를 실행할 가능성이 있다고 설명했습니다. GitGuardian은 9월 4일 HHS 책임 공개 창구에 신고했고, CDC는 9월 9일 접수 사실을 알렸습니다. 여러 차례 연락한 끝에 9월 18일 자격 증명이 폐기됐습니다. 연구진은 해당 저장소에 직접 접근하지 않았습니다.
관리자가 점검할 사항
세 사례에는 유출된 키가 커밋에 남아 오랫동안 살아남는 공통점이 있습니다. 키가 유출됐을 때 교체하는 것뿐 아니라, 앱의 설치 대상과 권한을 관리하고 더는 쓰지 않는 앱을 제거해야 합니다. GitGuardian은 개인 키를 API 키나 서비스 계정처럼 기계 신원 자격 증명으로 다루고, 유출 가능성이 생기면 교체하며 지속해서 탐지하라고 권고합니다. 앱 소유자와 사용 조직 모두 오래된 통합 기능이 계속 권한을 보유하는지 살펴야 합니다.
Reddit 반응
- @u/ryan_namba — 제게 두드러지는 점은 키 유출 자체보다 누군가 수동으로 교체하기 전까지 몇 년 동안 키가 계속 유효할 수 있다는 점입니다. 오래된 테스트 앱, 방치된 통합 기능, 회사를 떠난 사람까지 겹치면 꽤 위험한 조합입니다. 자산 목록과 소유권 관리도 비밀값 탐지만큼 중요해 보입니다. 키를 찾는 것도 좋지만, 누군가는 그 앱이 아직 존재하는지, 애초에 접근 권한을 가져야 하는지 알아야 합니다.
- @u/mabote — 동의합니다. 제 생각에는 앱 양쪽 모두 책임이 있습니다. 사용자와 관리자가 더는 쓸모없는 앱을 확실히 없애야 합니다. Crusher.dev 사례가 명백한 예입니다. 유지보수가 3년 전에 끝났는데도 관리자나 사용자 누구도 통합 기능을 제거하지 않았습니다. 거기에 누군가 키까지 유출했습니다.
- @u/ryan_namba — 맞습니다. 통합 기능이 만든 팀이나 프로젝트보다 오래 살아남으면 소유권이 모호해집니다. Crusher.dev 사례가 딱 그렇습니다. 앱을 계속 둬도 되는지 검토할 책임자가 분명하지 않으면 아무도 신경 쓰지 않는 사이에 권한이 계속 남습니다.
- @u/endor_robert — 참고로 저는 사이버보안 업체 Endor Labs에서 일합니다. 저희 제품에도 비밀값 탐지가 있습니다. 여기서 제품을 팔 생각은 없습니다. 모두가 첫째, 있어서는 안 될 곳에 있는 비밀값을 검사해야 합니다. 꼭 고급 도구가 필요한 건 아니며 오픈소스 도구도 많습니다. 이미 애플리케이션 보안 테스트 도구를 쓴다면 비밀값 탐지 기능이 있을 겁니다. 둘째, 수명이 짧은 자격 증명을 써야 합니다. 보안 태세 관리 도구가 안전하지 않은 설정을 찾아내는 데 도움이 될 수 있습니다. 이쪽도 오픈소스 도구가 있고 상용 제품에 포함된 경우도 있습니다.
- @u/Vegetable_Door_1618 — 장기 유효 앱 키는 위험합니다. 공격 범위가 몇 년 동안 잠복할 수 있습니다. 개인 키가 유출된 채 계속 작동하면 그 앱에 붙은 모든 권한이 사고 범위에 포함됩니다. 조직 수준 권한이 있는 앱이라면 키 교체와 만료를 기본값으로 삼아야 합니다.
원문: GitGuardian / 번역·요약: Trawling