
FBI FLASH 경고: TeamPCP의 공급망 웜과 AI 에이전트 설정 파일 오염: GitHub Actions/CI 방어 체크리스트
요약
FBI가 TeamPCP 공격 그룹의 공급망 웜(Supply Chain Worm)에 대한 FLASH 경고를 발표했습니다. GitHub Actions와 AI 에이전트 설정 파일을 노리는 이 공격은 npm/PyPI 패키지를 통해 확산되며, CI/CD 파이프라인과 인증 정보를 탈취하는 것을 목표로 합니다.
핵심 포인트
- GitHub Actions 워크플로를 태그 대신 커밋 SHA로 고정할 것
- 신규 패키지 채택 시 최소 7일의 경과 시간 임계값 적용 권장
- CI/CD 및 클라우드 서비스의 모든 Secret과 토큰 로테이션 실시
- AI 코딩 에이전트 및 CI/CD 서비스 계정에 최소 권한 부여
2026년 7월 2일, FBI가 IC3를 통해 FLASH 경고(FLASH-20260702-01)를 공개했다. npm/PyPI를 가로지르는 자기 증식형 공급망 웜(Supply Chain Worm) 군(Mini Shai-Hulud, Miasma 등)을 공격 그룹 TeamPCP의 소행으로 규정하였으며, 그 수법으로 GitHub Actions 워크플로(Workflow) 탈취와 AI 코딩 어시스턴트 설정 파일에 대한 은닉 명령 삽입을 꼽았다.
여기서 일어나고 있는 것은 CI/CD 파이프라인과 AI 코딩 에이전트의 설정 파일이 동시에 일차 공격면(Attack Surface)이 되었다는 전환이다. "의존성을 추가한다", "프로젝트를 에디터로 연다"라는 일상적인 동작이 자격 증명(Credential) 탈취와 웜 전파의 트리거가 된다. 동일한 공격자 도구군에 AI 게이트웨이의 알려진 취약점까지 포함되어 있다. 본고는 공개된 소스에서 확인할 수 있는 사실만을 기점으로, 오늘날 CI와 에이전트 설정에서 수정해야 할 부분을 체크리스트로 정리한다.
| 경계 (무엇이 새로운 공격면인가) | 뉴스상의 함의 | 오늘 수정할 것 |
|---|---|---|
| GitHub Actions 러너 (pull_request_target · 캐시 오염 · OIDC 토큰 실행 시 추출) | 태그(Tag)를 pin 상태로 두면 교체를 통해 악성 코드가 실행될 수 있음 | 모든 action을 풀 커밋 SHA(Full Commit SHA)로 다시 pin 할 것 |
| ... |
FBI의 FLASH 경고는 npm과 PyPI를 넘나드는 자기 증식 웜 군(Mini Shai-Hulud, Miasma)과 인증 정보 스틸러(Credential Stealer)인 SANDCLOCK을 TeamPCP의 소행으로 귀속시켰다. 변조 대상으로 지목된 도구에는 Trivy, KICS, LiteLLM, Telnyx Python SDK가 포함된다. 이들은 모두 CI/CD · 클라우드 · 보안 워크플로에 널리 통합되어 사용되는 것들이다.
규모 또한 구체적이다. Mend의 추적에 따르면, Mini Shai-Hulud 파동은 48시간 이내에 npm/PyPI를 가로질러 172개의 패키지 · 403건의 악성 버전으로 확대되었다. 침해된 @tanstack/react-router는 단독으로 주당 약 1,270만 다운로드라는 유통량을 보유하고 있다. 보도에 따르면 1,000개 이상의 기업 환경이 영향을 받았으며, 약 300GB의 데이터와 추정 약 50만 건의 인증 정보 세트가 유출된 것으로 알려졌다. 관련 CVE로는 CVE-2026-33634, CVE-2026-48027, CVE-2026-45321, CVE-2025-55182가 언급된다.
수법의 핵심은 GitHub Actions 워크플로의 탈취다. pull_request_target의 악용, Actions 캐시 오염, 러너 상에서의 OIDC 토큰 실행 시 추출을 통해 publish 토큰을 위조하며, 침해된 메인테이너(Maintainer)가 관리하는 모든 패키지로 전파된다. 탈취 대상은 AWS/GCP/Azure 키, GitHub PAT, HashiCorp Vault 토큰, Kubernetes secret, SSH 키에 이른다.
FBI의 권장 대책은 구체적이며, 그대로 행동에 옮길 수 있다.
원문: "Pin GitHub Actions workflows to verified commit SHA hashes rather than floating version tags"/"Enforce a minimum package age threshold of at least seven days"
번역: "GitHub Actions 워크플로를 플로팅(Floating) 버전 태그가 아닌 커밋 SHA 해시로 pin 하라", "신규 버전 채택 전 최소 7일의 경과 시간 임계값을 강제하라". 이에 더해 FLASH는 CI/CD와 클라우드의 모든 secret · publish 토큰의 로테이션(Rotation), CI/CD 서비스 계정에 대한 최소 권한 부여, publish 권한을 가진 모든 계정에 대한 피싱 내성 MFA(Multi-Factor Authentication), 러너의 실행 시 동작 모니터링을 제시하고 있다. (FBI FLASH-20260702-01, securityaffairs 보도 기준)
구조적인 요점은 두 가지가 있다. 하나는 메인테이너 1명의 침해가 의존성 그래프(Dependency Graph) 전체로 파급된다는 점이다. 당신이 직접 침해되지 않더라도, 의존 대상 중 한 명이 뚫리면 그 사람의 모든 패키지를 통해 공격이 내려온다. 또 다른 하나는 이 파동의 악성 패키지가 유효한 SLSA Build Level 3의 provenance 서명을 동반하고 있었다는 점이다. 즉, provenance 검증은 "어떤 파이프라인이 만들었는가"는 보증하지만 "그 파이프라인이 안전하게 동작했는가"는 보증하지 않는다. 서명이 붙어 있으니 안전하다는 운용 방식은 여기서 무너진다.
2026년 6월 상순에 관측된 Miasma 파동(SecurityJoes, Morphisec 등이 분석)은 AI 코딩 에이전트(AI coding agent)의 설정 파일을 영속화(persistence)를 위한 발판으로 사용한다. 악성 패키지가 .cursorrules나 CLAUDE.md를 투척하고, 그곳에 제로 너비 유니코드(Zero-width Unicode)를 이용한 숨겨진 명령을 심어둔다. 개발자가 Cursor나 Claude Code로 프로젝트를 열면, 에이전트가 정당한 프로젝트 지침으로 보이는 이를 읽고, '보안 스캔'을 빙자하여 로컬의 비밀 정보를 탈취하는 구현 방식이 보고되고 있다.
더욱 악질적인 것은 훅(hook)을 통한 영속화다. .claude/settings.json에 SessionStart 훅, .gemini/settings.json, .vscode/tasks.json(폴더 오픈 시 실행), .cursor/rules/setup.mdc, 악성 MCP 서버 정의 등을 심어둔다. 이것들은 와일드카드 매처(wildcard matcher)로 작동하여, 개발자가 프롬프트를 입력하기도 전에 드롭퍼(dropper)를 실행한다. 이는 멀웨어 스캐너가 거의 확인하지 않는 경로에 배치되므로, npm uninstall이나 node_modules를 모두 삭제해도 살아남는다. GitHub의 자동 대응은 Microsoft/Azure 관련 49건을 포함하여 73개의 리포지토리를 약 105초 만에 무효화했다.
"AI 설정 파일은 읽기만 하니까 안전하다"라는 전제는 무너졌다. 제로 너비 유니코드는 육안으로 보이지 않으며, SessionStart 훅은 에이전트 구동과 동시에 실행된다. 만약 CLAUDE.md / AGENTS.md / .cursorrules / .claude/settings.json을 코드 리뷰 대상에서 제외했다면, 그 운영 방식은 전면 재검토되어야 한다. 아울러 MCP 도구의 출력이나 웹에서 가져온 콘텐츠도 "신뢰할 수 없는 입력(untrusted input)"으로 취급해야 한다. 에이전트에 전달되는 모든 문자열은 명령 주입(command injection)의 경로가 될 수 있다.
CISA는 2026년 6월 8일, AI 게이트웨이인 LiteLLM의 CVE-2026-42271(명령 주입, CVSS 8.7)에 대해 실제 악용 사례(in-the-wild)를 확인한 후, 이를 Known Exploited Vulnerabilities (KEV) 카탈로그에 추가했다. MCP 서버의 프리뷰용 엔드포인트(예: POST /mcp-rest/test/connection)가 stdio 트랜스포트용 command/args/env를 포함하는 서버 설정을 그대로 받아들이는 점이 근본 원인이며, 인증된 프록시 API 키 보유자가 임의의 명령을 실행할 수 있다. 여기에 CVE-2026-48710(Starlette의 host-header 검증 우회, 통칭 BadHost)을 연쇄시키면 인증을 완전히 회피하여, 노출된 LiteLLM 배포 환경에 대해 인증 정보 없이 원격 코드 실행(RCE)에 이를 수 있다. LiteLLM은 FBI의 TeamPCP 변조 대상 도구 목록에도 등장한다.
KEV에 포함되었다는 것은 CISA의 기한에 따라 즉시 패치를 적용해야 함을 의미한다. 이와 함께 관리/admin 인터페이스가 신뢰할 수 없는 네트워크에 노출되어 있지 않은지 감사해야 한다. 요컨대, AI 게이트웨이를 "내부 전용의 편리한 프록시"가 아니라, 인터넷에 면한 인증 경계(authentication boundary)로 취급해야 한다는 뜻이다. 네트워크 분리, host-header 검증 및 WAF, 자격 증명 로테이션(credential rotation)을 다른 인터넷 공개 엔드포인트와 동일한 기준으로 적용하라. 공급망 침해와 게이트웨이 취약점이 동일한 공격자 도구 세트에서 겹친다는 점이 이 복합 리스크의 까다로운 부분이다.
-
모든 action을 태그(예: @v4)가 아닌 풀 커밋 SHA(full commit SHA)로 다시 고정(pin)할 것
-
각 워크플로우에서
permissions:를 선언하여, 기본 전체 권한을 최소 권한으로 제한할 것 -
pull_request_target사용처를 전수 조사하여, 신뢰할 수 없는 PR로부터의 secret 노출 경로를 차단할 것 -
Actions 캐시의 신뢰 경계를 확인할 것 (오염된 캐시를 신뢰하고 있지는 않은가)
-
OIDC subject의 audience(대상)를 한정하여, 토큰의 런타임 추출 및 악용 여지를 좁힐 것
-
신규 버전에 최소 경과 일수 게이트(Minimum Age Gate)를 설정할 것 (FBI의 사례는 7일)
-
lockfile을 고정하여 의도하지 않은 버전 업그레이드를 방지할 것
-
provenance/서명(Signature)을 검증할 것. 단, 이번 공격 파동은 유효한 provenance를 동반했음 — 서명의 유무만으로 안전하다고 판단하지 말고, 공개처의 행위 모니터링과 병행할 것
-
침해된 메인테이너(Maintainer)에 의한 이상 징후(단시간 내 일괄 publish 등)를 탐지하는 메커니즘을 갖출 것
-
CI/CD 및 클라우드의 모든 키(AWS/GCP/Azure, GitHub PAT)를 로테이션할 것
-
publish 권한을 가진 모든 계정에 피싱 내성 MFA(Phishing-resistant MFA)를 강제할 것
-
최소 권한 원칙을 철저히 준수하고, 정적 자격 증명(Static Credentials)보다 일시적 자격 증명(Ephemeral Credentials)을 우선할 것
-
HashiCorp Vault 토큰, Kubernetes secret을 전수 조사하여 노출 여부를 확인할 것
-
.cursorrules / CLAUDE.md / AGENTS.md / .claude/settings.json / .gemini/settings.json의 예기치 않은 차분(Diff) 리뷰를 필수화할 것
-
제로 너비 유니코드(Zero-width Unicode) 등 불가시 문자를 탐지할 것 (육안에 의존하지 말 것)
-
SessionStart/폴더 오픈 계열 후크(.vscode/tasks.json 등)와 등록된 MCP 서버를 전수 조사할 것
-
MCP 도구의 출력과 웹에서 가져온 콘텐츠를 신뢰할 수 없는 입력(Untrusted Input)으로 취급할 것
-
러너(Runner) 상의 실행 시 동작(예상치 못한 외부 통신, 토큰 액세스)을 행위 기반으로 모니터링할 것
-
패턴 1: 태그(@v4) 핀(Pin) 상태로 안심함 → 대책: 태그는 가변적임. 풀 커밋 SHA(Full Commit SHA)로 핀하여, 교체를 통한 악성 코드 주입을 차단함.
-
패턴 2: provenance 서명이 있으니 안전하다고 간주함 → 대책: 이번 공격 파동은 유효한 SLSA Build L3 서명을 동반했음. 서명은 "어떤 파이프라인이 만들었는가"에 대한 증명일 뿐, 안전성의 증명이 아님. 행위 모니터링과 병행할 것.
-
패턴 3: AI 설정 파일을 코드 리뷰 대상에서 제외함 → 대책: CLAUDE.md/AGENTS.md/.cursorrules/.claude/settings.json을 차분 리뷰에 포함하고, 불가시 문자와 후크를 탐지할 것.
-
패턴 4: 신규 의존성을 즉시 채택함 → 대책: 최소 경과 일수 게이트(예: 7일)와 lockfile 고정을 통해, 공개 직후의 웜(Worm) 전파를 기다리지 않도록 함.
-
패턴 5: AI 게이트웨이를 내부 전용으로 오인하여 공개함 → 대책: 인터넷 접점의 인증 경계(Authentication Boundary)로 취급하고, 네트워크 분리, host-header 검증, 자격 증명 로테이션을 적용할 것.
-
패턴 6: 비밀번호 로테이션을 "의심스러울 때만" 수행함 → 대책: KEV/FLASH급 경고 시에는 의심 여부와 관계없이 모든 키를 로테이션하는 상시 운영 체제로 전환할 것.
-
FBI FLASH-20260702-01 (IC3, TLP:CLEAR PDF)
-
FBI: TeamPCP compromised dev tools to steal cloud credentials (securityaffairs)
-
Mini Shai-Hulud wave hits 172 npm and PyPI packages (Mend)
-
Mini Shai-Hulud is back: self-spreading supply-chain attack (StepSecurity)
-
Shai-Hulud: Miasma — when a supply-chain worm learned to hijack AI coding agents (SecurityJoes)
-
It's in your AI assistant now: Shai-Hulud Wave 3 and the Miasma worm (Morphisec)
-
Miasma supply-chain worm burrows into 73 Microsoft repositories (Dark Reading)
-
Copilot CLI no longer needs a PAT in GitHub Actions (GitHub Changelog)
-
LiteLLM flaw CVE-2026-42271 exploited in the wild, chains to unauthenticated RCE (The Hacker News)
-
CSA research note: LiteLLM CVE-2026-42271 AI gateway exploitation
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기