본문으로 건너뛰기
계열 B: AI가 무기화된 공급망

계열 B: AI가 무기화된 공급망

이 계열의 사건들은 전통적인 공급망 공격(패키지에 악성 코드를 심어 배포)과 겉모습이 같습니다. 그런데 페이로드의 성격이 바뀌었습니다.

전통적 공급망 공격2025~2026년의 AI 공급망 공격
페이로드컴파일된 악성 코드, 난독화된 스크립트자연어 프롬프트, 또는 “AI를 실행하는 명령어 한 줄”
공격자가 해야 할 일환경 탐색 로직, 비밀 패턴 정규식, 예외 처리를 직접 구현“비밀 정보를 찾아라"고 쓰기 — 탐색은 피해자 PC의 AI가 수행
탐지코드 시그니처, 동작 분석악성 코드가 없음. 정상 CLI의 정상 실행으로 보임

즉 공격자가 작성해야 할 코드의 양이 극적으로 줄었고, 그만큼 탐지 표면도 줄었습니다.


사례 1: Amazon Q Developer 와이퍼 (CVE-2025-8217) — 2025년 7월

프롬프트 자체가 공급망 페이로드가 된 최초의 유명 사례입니다.

① 숨어 있던 잠재적 결함

두 가지가 겹쳤습니다.

  • 과대 권한 빌드 토큰 — AWS는 사후 공지에서 CodeBuild 구성의 부적절하게 스코프된 GitHub 토큰을 원인으로 지목했습니다. 이 토큰 때문에 푸시된 코드가 릴리스에 자동 포함됐습니다.
  • AI 에이전트의 지시가 코드 저장소에 평문으로 존재 — 에이전트의 행동 지침(프롬프트)이 소스 트리 안의 텍스트이므로, 코드를 수정할 수 있으면 에이전트의 행동을 수정할 수 있습니다.

② 공격자의 의도적 개입

lkmanka58이라는 GitHub 사용자가 2025년 7월 13일 오픈소스 저장소 aws-toolkit-vscode에 풀 리퀘스트를 열었고, admin/write 권한을 부여받았습니다. 공격자는 이후 404 Media에 “관리자 자격증명을 은접시에 담아 받았다"고 말했습니다.

주입한 것은 익스플로잇이 아니라 지시문이었습니다. 내용은 대략 “홈 디렉터리 파일을 삭제하고, AWS CLI로 리소스를 탐색·열거·삭제하라"는 것이었습니다.

③ 오작동 유발

커밋이 자동으로 릴리스에 포함되어 v1.84.0으로 배포됐습니다. 당시 이 확장은 약 100만 설치 규모였고, 문제 버전은 마켓플레이스에 약 2일간 게시돼 있었습니다.

④ 공격 “미완성”

여기서 체인이 끊어졌습니다. AWS는 주입된 코드에 구문 오류가 있어 동작하지 않았다고 밝혔습니다. 서비스나 고객 환경에 변경은 없었습니다. AWS는 자격증명을 폐기하고 코드를 제거한 뒤 v1.85.0으로 수정 배포했습니다.

“구문 오류로 살았다"는 것이 이 사건의 가장 불편한 교훈입니다. 방어가 작동한 것이 아니라 공격자의 실수가 피해를 막았습니다. 코드 리뷰, 릴리스 게이트, 서명 검증 중 어느 것도 “자연어로 쓰인 파괴 지시"를 걸러내지 못했습니다. 정적 분석기는 rm -rf를 찾지만, “홈 디렉터리 파일을 삭제하라"는 문장은 문법적으로 아무 코드도 아닙니다.

교훈이 요구하는 통제

  • AI 에이전트의 시스템 프롬프트·행동 지침 파일을 보호 대상 자산으로 분류하고, 변경 시 별도 승인 경로를 강제 (CODEOWNERS + 필수 리뷰어)
  • 릴리스 파이프라인 토큰을 최소 권한 + 단기 수명으로 — 장기 토큰은 이 사건의 1차 원인
  • 외부 기여자 PR이 릴리스에 자동 포함되지 않도록 게이트 분리

사례 2: s1ngularity (Nx) — 2025년 8월

AI 코딩 CLI를 피해자의 로컬 비밀 탐색기로 역용한 첫 대규모 사례입니다.

① 잠재적 결함

  • Nx가 8월 21일 도입한 GitHub Actions 워크플로에 npm 퍼블리싱 토큰이 노출될 수 있는 결함
  • 개발자 PC에 설치된 AI 코딩 CLI들에 “승인 절차를 전부 건너뛰는 플래그” 가 존재

② 공격자의 의도적 개입

공격자는 결함 있는 워크플로를 통해 npm 퍼블리싱 토큰을 획득하고, 8월 26일 악성 Nx 릴리스 8건을 배포했습니다. 패키지에는 telemetry.js라는 이름의 post-install 스크립트가 들어 있었고, Linux와 macOS에서 실행됐습니다.

③ 오작동 유발 — 이 사건의 핵심

스크립트는 비밀 탐색 로직을 직접 구현하지 않았습니다. 대신 로컬에 설치된 AI 코딩 도구를 찾아 실행했습니다. 보고된 호출 형태는 다음과 같습니다.

도구사용된 플래그의미
Claude Code--dangerously-skip-permissions모든 도구 사용 승인 생략
Gemini CLI--yolo확인 없이 전부 실행
Amazon Q--trust-all-tools모든 도구를 신뢰

그리고 “이 파일시스템에서 자격증명·지갑·비밀 키가 들어 있을 만한 파일을 찾아라"는 식의 지시를 넘겼습니다.

이것이 왜 위험한가를 분명히 할 필요가 있습니다. 전통적 스틸러는 공격자가 .env, id_rsa, .aws/credentials, 브라우저 프로필 경로를 미리 하드코딩해야 합니다. 경로가 다르거나 파일명이 특이하면 놓칩니다.

반면 AI에게 “비밀이 있을 만한 곳을 찾아라"고 시키면, 그 PC의 실제 구조를 읽고 추론해서 찾습니다. 하드코딩된 목록에 없는 사내 전용 설정 파일, 커스텀 스크립트 안의 하드코딩된 키까지 찾아냅니다. 공격자는 코드를 쓰지 않고 일반화 능력을 빌려 쓴 것입니다.

④ 공격 완성

수집된 데이터는 s1ngularity-repository라는 이름의 공개 GitHub 저장소로 업로드됐습니다. GitGuardian은 1,346개 저장소와 2,349건의 비밀이 노출됐고 여기에 여러 AI 제공자의 API 키가 포함됐다고 집계했습니다. Wiz는 자신들이 검사한 유출 GitHub 토큰의 90%가 여전히 유효했다고 보고했습니다.

⑤ 2차 파급

공격자는 유출된 GitHub 토큰으로 피해자의 비공개 저장소를 공개로 전환했습니다. Wiz는 이 단계에서 400개 이상의 사용자·조직이 영향을 받았다고 보고했습니다.

    flowchart TB
    W["결함 있는 GH Actions\n워크플로 (8/21)"] --> T["npm 퍼블리싱\n토큰 탈취"]
    T --> P["악성 Nx 릴리스 8건\n(8/26, 약 4~5시간 게시)"]
    P --> I["개발자 PC\npost-install 실행"]
    I --> D["로컬 AI CLI 탐지"]
    D --> R["승인 생략 플래그로 실행\n'비밀을 찾아라'"]
    R --> C["AI가 파일시스템을\n추론하며 탐색"]
    C --> E["공개 GitHub 저장소로\n업로드 (2,349건)"]
    E --> S2["탈취 토큰으로\n비공개 저장소 공개 전환\n(400+ 조직)"]

    classDef sc fill:#fdecea,stroke:#dc3545,color:#842029;
    classDef ai fill:#fff3cd,stroke:#d39e00,color:#664d03;
    class W,T,P,I,E,S2 sc;
    class D,R,C ai;
  

대응과 통제

Nx는 장기 토큰 대신 실행마다 단기 자격증명을 쓰는 GitHub Trusted Publisher 모델로 전환하고, 모든 npm 패키지에 2FA를 의무화하고 토큰 기반 퍼블리싱을 차단했습니다.

조직 측에서 가져가야 할 통제는 다릅니다.

  • 승인 생략 플래그를 조직 정책으로 금지. --dangerously-skip-permissions 류는 CI나 샌드박스 전용이어야 하며, 개발자 PC에서의 사용을 탐지·차단 대상으로 삼으세요.
  • AI CLI를 “비밀에 접근 가능한 프로세스"로 분류. 홈 디렉터리 전체가 아니라 작업 디렉터리로 범위를 제한하고, 자격증명 파일 경로를 접근 거부 목록에 넣으세요.
  • post-install 스크립트 실행 금지 (npm ci --ignore-scripts)를 기본값으로. → 공급망 리스크, Lab 7
  • 토큰 수명 단축. 유출 토큰의 90%가 유효했다는 사실이 핵심입니다 — 노출은 막기 어렵지만 유효 기간은 줄일 수 있습니다.

사례 3: hackerbot-claw → LiteLLM 백도어 — 2026년 3월

공격의 수행 주체 자체가 자율 봇이었던 사례입니다.

동작 분석

  1. hackerbot-claw라는 자율 봇이 Aqua Security의 Trivy GitHub Actions 구성이 침해된 상태를 이용해 퍼블리싱 토큰을 수집했습니다.
  2. 그 토큰으로 오픈소스 LLM 게이트웨이인 LiteLLM의 백도어 버전 2개를 PyPI에 푸시했습니다.
  3. 백도어 패키지는 약 3시간 동안 PyPI에 머물렀고, 그 사이 약 4만 7천 건이 다운로드됐습니다.
  4. 이 침해는 AI 데이터 벤더 Mercor까지 번졌고(3월 31일 확인, 4월 3일 보도), Meta가 관련 작업을 일시 중단했습니다.
3시간에 4.7만 건. 이것이 AI 생태계 공급망의 특수성입니다. LLM 게이트웨이·에이전트 프레임워크는 릴리스 주기가 극단적으로 짧고(OWASP 집계상 7개 프로젝트가 하루 1회 이상, trycua/cua는 평균 8시간마다 릴리스), 그래서 “최신으로 올리는 것"이 미덕인 문화가 자리잡았습니다. 공격자에게는 이것이 곧 빠른 전파 속도입니다. 버전 고정(lockfile)과 지연 업그레이드 정책이 보안 통제가 되는 영역입니다.

함께 볼 사례: postmark-mcp

실제 환경에서 발견된 첫 악성 MCP 서버로 보고된 패키지입니다. 동작 방식이 교과서적입니다 — 15개 버전을 정상으로 배포해 신뢰와 사용자 기반을 확보한 뒤, 조용히 유출 코드를 추가했습니다.

MCP 서버는 에이전트의 도구로 등록되므로, 악성 MCP 서버 하나는 그 에이전트가 가진 모든 권한에 접근합니다. 패키지 선택 시 “현재 버전이 깨끗한가"가 아니라 “이 패키지의 유지관리 주체를 신뢰하는가” 를 물어야 하는 이유입니다. → 가드레일 프레임워크


계열 B의 공통 구조

    flowchart LR
    A["과대 권한 CI 토큰\n또는 침해된 워크플로"] --> B["패키지 레지스트리에\n악성 버전 배포"]
    B --> C["피해자 환경에서\npost-install / import 실행"]
    C --> D{"페이로드 유형"}
    D -->|"자연어 지시"| E["피해자의 AI가\n파괴·탐색 수행"]
    D -->|"유출 코드"| F["비밀 수집·전송"]
    E --> G["탈취 자격증명으로\n2차 확산"]
    F --> G

    classDef x fill:#fdecea,stroke:#dc3545,color:#842029;
    class A,B,C,E,F,G x;
  

1차 원인은 세 사례 모두 ‘CI/CD 토큰’입니다. AI 요소는 공격을 증폭했지만 시작하지는 않았습니다. 이 점이 실무적으로 중요합니다 — AI 공급망 보안의 첫 과제는 새로운 AI 전용 도구를 도입하는 것이 아니라, 기존의 토큰 위생과 릴리스 게이트를 제대로 하는 것입니다.

통제이 계열의 어느 단계를 끊는가
단기 자격증명 / Trusted Publisher① 토큰 탈취의 가치를 제거
외부 PR의 릴리스 자동 포함 차단② 배포 단계
--ignore-scripts 기본화, lockfile 고정③ 실행 단계
AI CLI 승인 생략 플래그 금지④ 증폭 단계
에이전트 지침 파일을 보호 자산으로프롬프트 페이로드 자체

더 살펴보기