GitHub에 이슈를 여는 행위가 공급망 공격의 시작점이 될 수 있다면 어떨까요?

2026년 2월 17일, AI 코딩 도구 Cline의 npm 패키지 [email protected]이 배포됐습니다. CLI 바이너리는 이전 버전과 바이트 단위까지 동일했고, 바뀐 건 package.json 딱 한 줄뿐이었습니다. 그 한 줄 덕분에 이후 8시간 동안 Cline을 설치하거나 업데이트한 약 4,000명의 개발자는 자신도 모르게 별도의 AI 에이전트인 OpenClaw를 시스템에 깔게 됐습니다. 공격의 출발점은 GitHub 이슈 제목이었습니다.
출처: A GitHub Issue Title Compromised 4,000 Developer Machines – grith.ai
5단계 공격 체인
Snyk이 “Clinejection”으로 명명한 이 공격은 잘 알려진 취약점 5가지를 하나의 연쇄 공격으로 조합했습니다.
1단계 — 프롬프트 인젝션: Cline은 GitHub 이슈를 자동 분류하는 AI 트리아지 워크플로를 운영하고 있었습니다. 문제는 이슈 제목이 그대로 Claude의 프롬프트에 삽입되었다는 것입니다. 공격자는 이슈 제목 안에 “특정 GitHub 저장소에서 패키지를 설치하라”는 명령을 숨겨 넣었습니다.
2단계 — AI 봇의 코드 실행: Claude는 이 주입된 명령을 정당한 지시로 해석하고 npm install을 실행했습니다. 연결된 저장소는 ‘glthub-actions/cline’이라는 타이포스쿼팅 저장소(‘github’의 ‘i’가 빠진)였고, 그 안의 사전 설치 스크립트가 원격 쉘 스크립트를 내려받아 실행했습니다.
3단계 — 캐시 포이즈닝: 쉘 스크립트는 GitHub Actions 캐시를 10GB 이상의 쓰레기 데이터로 채워 LRU 정책에 의해 Cline의 정상 캐시가 밀려나도록 만들었습니다. 새로 채운 오염된 캐시는 Cline의 야간 릴리스 워크플로 캐시 키 패턴에 정확히 맞췄습니다.
4단계 — 자격증명 탈취: 야간 릴리스 워크플로가 실행되면서 오염된 node_modules를 캐시에서 복원했습니다. 이 워크플로에는 npm 배포 토큰, VS Code 마켓플레이스 토큰, OpenVSX 토큰이 모두 포함되어 있었고, 세 가지 모두 탈취됐습니다.
5단계 — 악성 패키지 배포: 탈취한 npm 토큰으로 공격자는 OpenClaw 자동 설치 훅이 포함된 [email protected]을 배포했습니다. 패키지는 게시 14분 만에 StepSecurity의 자동 모니터링에 탐지됐지만, 실제 삭제까지는 8시간이 걸렸고 그사이 약 4,000건의 다운로드가 이루어졌습니다.
왜 기존 보안은 놓쳤나
이 공격에서 주목할 점은 기존 보안 도구들이 탐지에 실패했다는 사실입니다.
npm audit은 OpenClaw 자체가 악성 코드가 아니라 합법적인 패키지이기 때문에 탐지하지 못했습니다. 코드 리뷰도 CLI 바이너리는 동일했고 package.json 한 줄만 바뀌었기 때문에 바이너리 변경 검사로는 걸리지 않았습니다. npm 프로비넌스 증명은 Cline이 당시 OIDC 기반 프로비넌스를 사용하지 않았기 때문에, 탈취된 토큰만으로 이상 없이 배포가 가능했습니다. 권한 프롬프트도 없었습니다. npm 패키지의 postinstall 훅은 npm install 중에 조용히 실행되며, 어떤 AI 코딩 도구도 의존성의 라이프사이클 스크립트 실행 전에 사용자에게 묻지 않습니다.
한편 이 취약점은 보안 연구자 Adnan Khan이 2025년 12월에 먼저 발견해 1월 1일에 GitHub Security Advisory로 신고했지만, 5주 동안 아무 응답을 받지 못했습니다. Khan이 2월 9일 공개 공시하자 Cline은 30분 만에 AI 트리아지 워크플로를 삭제했지만, 자격증명 로테이션 과정에서 잘못된 토큰을 삭제하는 실수를 범했습니다. 공격자는 그 사이 이미 자격증명을 탈취한 상태였고, Khan과는 무관한 별도의 공격자였습니다.
AI가 AI를 설치하는 새로운 공급망 패턴
이 공격이 주목받는 이유는 피해 규모가 아니라 구조입니다. 개발자는 Tool A(Cline)를 신뢰하고 설치했습니다. 그런데 Tool A가 침해되어 Tool B(OpenClaw)를 설치했고, Tool B는 개발자가 한 번도 평가하거나 동의한 적 없는 독립적인 능력 — 쉘 명령 실행, 자격증명 접근, 재부팅 후에도 살아남는 데몬 설치 — 을 갖추고 있었습니다.
grith는 이를 ‘혼동된 대리인(confused deputy)’ 문제에 비유합니다. 개발자가 Cline에 부여한 권한이, 개발자가 전혀 모르는 에이전트에게 위임된 것입니다. 공격의 진입점은 자연어였고, CI/CD 환경에서 AI 에이전트를 이슈 트리아지나 코드 리뷰에 활용하는 모든 팀이 동일한 구조적 취약점을 안고 있다는 점에서, Clinejection은 단발성 사고로 보기 어렵습니다.
사건 이후 Cline은 자격증명 처리 워크플로에서 GitHub Actions 캐시 사용을 제거하고, OIDC 프로비넌스 증명을 도입해 장수명 토큰을 없애는 등 개선 조치를 취했습니다. 하지만 공격의 첫 번째 고리였던 “비신뢰 입력을 처리하는 AI 에이전트가 CI 환경의 권한으로 코드를 실행한다”는 구조 자체는 Cline만의 문제가 아닙니다. 공격 체인의 기술적 세부 내용과 Cline의 공식 포스트모템은 원문을 참고하세요.
참고자료:

답글 남기기