EDR도 탐지 못 하는 정상적인 API 호출 악용... NHI 인벤토리 점검 시급
[보안뉴스= 김동현 OWASP 서울 챕터 리더] 지난 20일 깃허브(GitHub)가 자사 내부 저장소 약 3800개의 외부 유출을 공식 인정했다. 전 세계 개발자가 코드를 맡기는 플랫폼에서 직원 한 명이 설치한 VS Code 확장 프로그램 하나가 원인이었다.

[출처: 생성형 AI 활용 이미지]
공격자로 알려진 TeamPCP는 구글 위협 인텔리전스가 UNC6780으로 추적 중인 그룹이다. 지난 3월 보안 취약점 스캐너 ‘아쿠아 트리비(Aqua Trivy)’를 시작으로, 4월 크로스 플랫폼 개발자 도구인 ‘비트워든 CLI(Bitwarden CLI)’, 5월 한 달간 ‘탠스택(TanStack)’과 미스트랄 AI(Mistral AI)를 포함한 170여 개의 npm·PyPI 패키지, MS 듀러블태스크(Microsoft DurableTask), 알리바바 앤트V(Alibaba AntV)에 이어 깃허브까지. 8개월간 누적된 공급망 캠페인을 진행했다. 이번 사건이 의미는 침투 경로가 아닌 침투 표면의 변화에 있다.
단말 확장 프로그램 하나에 뚫린 글로벌 코드 저장소
깃허브의 발표에 따른 공격 흐름은 다음과 같다.
△ 직원 한 명이 VS Code Marketplace에서 악성 확장을 설치
△ 단말이 침해되면서 개발자 자격증명·토큰·내부 시스템 접근 권한이 유출
△ 공격자가 이 권한으로 내부 저장소 약 3800개를 외부 반출
△ 다크웹 포럼에 $50000부터 호가했고, 그룹은 현재 $95000 제안을 받았다고 주장
깃허브 측은 “고객사와 저장소에 영향을 미친 증거는 현재까지 없다”고 밝혔지만, 어떤 확장이 사용됐는지 공식적으로 확인해 주지는 않았다. 일부 보도에서 같은 시기 철회된 Nx Console의 연관성을 거론했지만, 공식적으로 확인된 사항은 아니다.
정상 배포로 위장한 8개월의 치밀한 공급망 장악

[출처: 생성형 AI 활용 이미지]
이번 공격의 배후로 지목된 TeamPCP 활동 중 눈여겨볼 부분은 11일 탠스택 침해다. 악성 패키지에서 유효한 SLSA Build Level 3 인증(provenance attestation)이 부여된 첫 사례였다. 공격자가 게시한 악성 버전이 모든 단계에서 합법적으로 배포됐다. 워크플로를 시작한 자격증명이 침해된 결과다.
19일 AntV 사례는 다른 방식의 정교함을 보였다. 공격자는 RSA-PSS 서명 기반의 하이브리드 암호화 C2 채널을 사용했고, 깃허브의 commit-search API를 데드드롭(dead-drop)으로 활용해 외부 통신을 도메인 안에 머물게 설계했다. 22분 만에 323개 패키지를 자동 배포한 부분은, 사람이 아닌 자동화된 웜(worm)이 침해된 관리자(maintainer) 자격증명을 탈취하면서 스스로 전파됐음을 의미한다.
공식 인증을 받은 개발자(Verified Publisher) 배지, 공급망 보안 표준, 소프트웨어 공급망 보안을 위한 프레임워크, 수백만 건의 다운로드 횟수, 신뢰할 수 있는 공식 자동화 빌드 시스템(GitHub Actions)까지. 우리가 안전한 소프트웨어라고 판단하던 기준들이 이제는 모두 무력화됐다.
비인간 자격증명(NHI) 관점에서 본 공격 표면의 진화
이번 캠페인 전체를 자격증명 관점에서 다시 보면, 침투 자산은 모두 비인간 자격증명(NHI)이다.
△TanStack: GitHub Actions OIDC 토큰을 runner 프로세스 메모리에서 추출
△DurableTask: 침해된 깃허브 계정의 repo secret에서 PyPI 토큰 노출
△AntV: 컴프로마이즈된 npm maintainer 계정의 publish 권한
△GitHub: 직원 단말의 IDE 확장 → 개발자 토큰·세션·접근 권한
공통적으로 사람이 패스워드를 입력하는 단계는 없다. 모두 기계가 기계에게 권한을 부여하는 구간, CI/CD 파이프라인, OIDC 토큰 교환, IDE 확장의 ambient credential 영역에서 사고가 발생했다.
미니 샤이-훌루드(Mini Shai-Hulud) 웜은 이 점을 노골적으로 활용한다. 자격증명 하나를 훔치면 관리자가 통제하는 모든 패키지를 열거하고 각각 감염된 버전을 자동 게시한다. 페이로드는 100여 개 파일 경로에서 클라우드 자격증명, 암호화폐 지갑, AI 도구 설정, 메시징 앱 토큰을 수집하고 .claude/settings[.]json이나 .vscode/tasks[.]json 같은 개발자 도구 설정 파일에 persistence hook을 심어 재부팅 후에도 살아남는다.
EDR은 이 패턴을 잡지 못한다. EDR이 보는 것은 프로세스 행위이지만, 이 공격의 핵심은 “신뢰받는 도구가 신뢰받는 권한으로 정상적인 API를 호출”한다는 데 있다. 행위 자체가 합법이고, 행위를 수행한 자격증명만 침해된 상태다.
국내 기업들이 짚어봐야 할 3가지 점검 포인트
첫째, OSS 의존성. 지난 11일 이후 영향받은 170여 개 npm·PyPI 패키지의 누적 다운로드는 5억 회 이상이다. @tanstack/react-router(주간 1200만 회), Mistral AI SDK, OpenSearch 클라이언트, Guardrails AI 등이 포함된다. 한국 스타트업·SaaS 회사 중 영향 버전이 의존성 트리(dependency tree)에 남아 있을 가능성이 적지 않다.
둘째, 개발자 단말의 IDE 확장 거버넌스. 누가 어떤 확장을 어떤 권한으로 설치했는지 인벤토리로 답할 수 있는 회사가 얼마나 될까. 확장이 접근할 수 있는 토큰·시크릿 범위는 어떻게 제한되는가. 깃허브조차 이 질문에 답하지 못해 뚫렸다.
셋째, NHI 인벤토리. CI/CD 파이프라인의 서비스 계정(service account), OIDC 토큰, PAT, npm/PyPI publish 토큰이 몇 개인지 정확히 아는 보안팀은 많지 않다. 사람 계정은 IAM·SSO로 관리하지만 기계 자격증명은 거버넌스 대상에서 빠져 있는 경우가 다수다. 공격자는 정확히 그 사각지대를 노린다.
실제로 Cremit의 NHI 보안 플랫폼 ‘Argus’가 최근 6개월간 국내 기업의 공개 저장소 및 협업 도구에서 관측한 NHI 토큰 노출 데이터에 따르면, 전체 유출의 42%가 깃허브 관련 자격증명이었다. 더욱 심각한 것은 그중 78%가 발급 후 90일 이상 회수되지 않은 채로 유효하게 방치되어 있었다는 점이다.
시스템 취약점 아닌 신뢰 관계를 뚫는 AI 시대의 방어법
이번 사건은 공격 패러다임의 이동을 보여 준다. 공격자는 더 이상 시스템 취약점을 뚫지 않는다. 신뢰 관계를 뚫는다. verified publisher 배지가 달린 확장, SLSA 인증이 붙은 패키지, 공식 GitHub Actions 워크플로에서 게시된 빌드. 우리가 안전 시그널로 삼아 온 모든 것이 이제 공격 표면이다.
방어자의 선택지는 두 가지로 좁혀진다. 자격증명 위생을 기계 아이덴티티 영역까지 확장하는 것, 그리고 유출된 자격증명을 실시간으로 탐지·회수하는 것. 패치는 이미 늦은 대응이다. TeamPCP가 AntV 패키지 323개를 22분 만에 자동 배포한 속도로, 같은 속도의 대응이 준비되어 있는가. 지금이 NHI 보안을 미루지 말아야 할 시점이다.
[글_김동현 OWASP 서울 챕터 리더/크리밋 대표]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>














