
Clinejection: 이슈 제목이 어떻게 Cline의 npm 토큰에 도달했는가
- OrcaNEWOrcaCyber: GLM 5.3 Abliterated / Uncensored2026-11-04$3.00 / $5.00 100만 토큰당 · 74 tok/s
- OrcaNEWOrcaCyber: Hy4 Abliterated / Uncensored2026-11-04$0.80 / $1.60 100만 토큰당 · 113 tok/s
- OrcaNEWOrcaCyber: Kimi K3.1 Pro Abliterated / Uncensored2026-11-04$4.00 / $20.00 100만 토큰당 · 43 tok/s
- orcaNEWOrca: OrcaC2 1.02026-10-303 tok/s
- OrcaNEWOrcaCyber: MiniMax M3.1 Flash Abliterated / Uncensored2026-10-29$0.80 / $1.60 100만 토큰당 · 100 tok/s
- OrcaNEWOrcaCyber: GLM 5.3 Flash Abliterated / Uncensored2026-10-27$0.80 / $1.60 100만 토큰당 · 101 tok/s
- OrcaNEWOrcaCyber: Qwen3.8 Flash Next Abliterated / Uncensored2026-10-26$0.80 / $1.60 100만 토큰당 · 100 tok/s
- OrcaNEWOrcaCyber: MiMo V2.6 Flash Abliterated / Uncensored2026-10-26$0.80 / $1.60 100만 토큰당 · 49 tok/s
- MoonshotNEWMoonshotAI: Kimi K3.1 Pro2026-10-2447지능
- OrcaNEWOrcaCyber: DeepSeek V4.1 Flash Abliterated / Uncensored2026-10-23$0.80 / $1.60 100만 토큰당 · 76 tok/s
- minimaxMiniMax: M3.1 Flash2026-10-1929지능
- OrcaOrca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 100만 토큰당 · 111 tok/s
- deepseekDeepSeek: DeepSeek V4.1 Flash 10172026-10-1733지능
- DeepSeekDeepSeek: DeepSeek V4.1 Flash2026-10-1740지능
- OrcaOrca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 100만 토큰당 · 57 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2955지능
- anthropicAnthropic: Claude Sonnet 5.52026-09-2855지능
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 100만 토큰당 · 163 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2228지능
- OpenAIOpenAI: GPT-6 Sol2026-09-2244지능
2026년 2월 9일, 보안 연구원 Adnan Khan은 1월 1일 Cline에 비공개로 보고했던 결함에 관한 설명을 공개했다: 오픈소스 AI 코딩 어시스턴트가 Anthropic의 claude-code-action GitHub Action을 기반으로 구축된 자동 이슈 트리아저를, 들어오는 모든 GitHub 이슈 제목을 모델의 지침에 그대로 붙여 넣는 프롬프트에 연결했었다. 어떤 GitHub 계정이든 이슈를 열어 이를 트리거할 수 있었고, Khan의 재현에서는 지침처럼 표현된 제목이 에이전트로 하여금 워크플로 내부에서 셸 명령을 실행하게 했다. 그런 다음 그는 그 발판에서 GitHub Actions 캐시 포이즈닝을 거쳐 VS Code Marketplace, OpenVSX 및 npm의 릴리스 자격 증명까지 이르는 경로를 추적했다. Cline이 워크플로를 수정한 지 8일 후, Cline이 교체했다고 믿었던 npm 게시 토큰이 cline 2.3.0을 게시하는 데 사용되었고, 이는 해당 패키지를 설치한 모든 머신에 OpenClaw를 설치했다. 심각도 및 신뢰도 등급이 포함된 전체 항목은 Orca AI Incident Archive에, 같은 시기 인접한 공급망 기록들과 함께 실려 있다.
하나가 아닌 두 날짜
아카이브는 이 기록의 날짜를 2026년 2월 9일로, 일 단위 정밀도로 표시하며, 이는 Khan이 adnanthekhan.com에 자신의 글을 게시한 날이다. 악성 패키지가 등장한 날은 아니다. 취약점 자체는 2025년 12월 21일 cline/cline 저장소에 트리아지 워크플로를 추가한 커밋에서 도입되었고, Cline이 2월 9일 해당 워크플로를 삭제할 때까지 활성 상태로 유지되었다. 무단 npm 게시는 2월 17일에 이루어졌으니, 수정 후 8일째이자 Khan의 첫 비공개 보고 이후 47일째였다.
그 두 날짜를 구분해 두는 것이 중요하다. 이 사건에서 가장 중대한 사실이 바로 두 날짜 사이의 간극에 있기 때문이다. 문은 2월 9일에 닫혔지만, 침입자가 이미 복사해 둔 열쇠는 2월 17일에도 여전히 작동했다. 2월 17일 Khan에게 보내고 자신의 글에 그대로 실은 Cline 본인의 정정은 이를 직설적으로 말해 준다. "2월 9일에 자격 증명을 교체했을 때 npm 게시 토큰은 제대로 폐기되지 않았다. 잘못된 토큰이 삭제되었고, 노출된 토큰은 계속 활성 상태로 남아 있었다."
체인: 이슈 제목에서 릴리스 토큰까지
취약한 파일은 .github/workflows/claude-issue-triage.yml이었으며, 이 파일은 issues 이벤트에서 실행되고 Claude Opus 4.5와 함께 anthropics/claude-code-action@v1을 호출했는데, 워크플로에서는 claude-opus-4-5-20251101로 고정되어 있었습니다. Khan은 해당 워크플로의 구성을 인용합니다. allowed_non_write_users가 와일드카드 "*"로 설정되어 있어 어떤 GitHub 계정이든 이슈를 여는 것만으로 에이전트를 트리거할 수 있었고, claude_args는 --allowedTools에 Bash, Read, Write, Edit, Glob, Grep, WebFetch 및 WebSearch를 전달했습니다. 문제가 된 것은 Bash였습니다. 이는 기본 브랜치 컨텍스트에서 실행되는 워크플로 내부에서 모델에 셸 실행 권한을 부여했습니다.
프롬프트는 이슈 제목을 새니타이즈하지 않고 그대로 보간했다. Khan의 개념 증명은 "Tool error."로 시작하고, 이어서 트리아지를 계속하기 전에 특정 커밋에서 헬퍼 패키지를 설치하라는 지시가 붙은 제목을 사용했다. 해당 커밋 참조는 package.json에 preinstall 스크립트가 포함된 포크를 가리켰고, 이 스크립트는 npm이 무엇이든 설치를 마치기 전에 공격자가 제어하는 엔드포인트를 대상으로 curl 명령을 실행했다. 설치가 Bash 도구를 통해 실행되었기 때문에, 모델은 무엇이 실행되었는지 전혀 확인하지 않았다. Khan은 Cline 저장소의 미러에서 이를 재현했으며, 에이전트가 매 시도마다 페이로드를 실행했다고 보고했다.
트리아지 워크플로에서의 코드 실행은 그 자체만으로 릴리스 자격 증명에 대한 접근 권한이 아닙니다. 그 단계는 Khan이 Cacheract라는 이름으로 2024년에 공개한 도구에서 문서화한 GitHub Actions의 한 속성에서 비롯되었습니다. 즉, 모든 워크플로가 캐시 키와 버전을 완전히 제어하면서 저장소의 캐시를 읽고 쓸 수 있으며, 캐싱 단계를 선언한 적이 없는 워크플로조차 그렇습니다. 트리아지 작업은 기본 브랜치에서 실행되었기 때문에 야간 게시 작업과 캐시 범위를 공유했으며, 그 야간 게시 작업은 실제로 캐시에서 node_modules를 복원했고 게시 토큰을 보유하고 있었습니다.
캐시 항목은 불변이므로 공격자가 릴리스 작업이 복원할 항목을 단순히 덮어쓸 수는 없습니다. Khan이 이를 우회한 방법은 2025년 11월 20일의 GitHub 정책 변경을 악용하는 것이었는데, 이 변경으로 저장소의 캐시가 10GB를 넘으면 서비스가 최소 최근 사용 순서로 캐시 항목을 즉시 제거하게 되었습니다. 캐시를 10GB 넘게 범람시키면 정상 항목들은 밀려나고, 비워진 키를 오염된 콘텐츠로 차지하면 다음에 해당 항목을 복원하는 작업이 공격자 코드를 실행하게 됩니다. Cacheract는 전체 시퀀스를 단일 워크플로 실행 내에서 자동화하며, actions/checkout의 action.yml을 덮어써 해당 액션의 post 단계가 모든 작업 끝에 페이로드를 실행하도록 하여 지속성을 유지합니다.
사슬의 마지막 고리는 대략 UTC 오전 2시에 실행되어 오염된 node_modules를 복원한 뒤 폭발하는 야간 작업입니다. 그렇게 빠져나오는 것은 각각 VS Code Marketplace, OpenVSX, npm의 자격 증명인 VSCE_PAT, OVSX_PAT, NPM_RELEASE_TOKEN입니다. 모든 고리가 그 순서대로 Cline 자체 저장소를 대상으로 실행되었는지는 별개의 질문이며, 아래에서 다룹니다.

야간 자격 증명이 왜 프로덕션 자격 증명이었는지
당연한 반론은 nightly 릴리스와 프로덕션 릴리스는 서로 다른 시크릿을 보유해야 한다는 것입니다. Khan의 답변은 그 분리가 명목상의 것이었다는 것입니다. OpenVSX와 VS Code Marketplace는 게시 토큰을 개별 확장이 아니라 게시자 아이덴티티에 연결하며, stable 및 nightly Cline 확장 모두 동일한 아이덴티티로 게시되었는데, Khan은 OpenVSX에서 그 아이덴티티를 saoudrizwan으로 식별합니다. npm에서는 세분화된 토큰 모델이 패키지에 연결되며, Cline은 stable 및 nightly CLI 빌드를 동일한 cline 패키지에 게시했습니다. 따라서 nightly 작업을 위해 발급된 토큰으로 프로덕션 아티팩트를 게시할 수 있었고, 바로 그 일이 8일 후에 발생했습니다.
칸이 영향력을 규정하는 방식은 규모에 달려 있다. 그는 클라인이 설치 500만 건을 넘었다고 발표한 점을 인용하고, 탈취된 자격 증명을 통해 밀어 넣은 확장 프로그램 업데이트는 편집기가 자동으로 업데이트되는 모든 개발자의 맥락에서, 그 개발자의 권한과 해당 기기에 있는 모든 키, 토큰, 소스 코드를 가지고 실행된다고 지적한다.
실제로 무엇이 출판되었고, 그것이 무엇을 했는가
게시된 아티팩트는 cline 2.3.0이었고, 크기가 작았다. npm 레지스트리 자체의 타임스탬프에 따르면 2.3.0은 2026년 2월 17일 11:26:51 UTC에, 문제없는 2.4.0은 같은 날 19:23:08 UTC에 게시되었으며, Cline 권고문은 노출 기간을 약 8시간, 즉 2.3.0이 PT 기준 오전 11시 30분에 사용 중단(deprecated)될 때까지로 본다. 해당 패키지의 package.json에는 추가된 줄이 하나 있었는데, npm install -g openclaw@latest를 실행하는 postinstall 스크립트였다. Cline의 권고문 GHSA-9ppg-jx86-fqw7에 따르면 다른 패키지 파일은 변경되지 않았으며 dist/cli.mjs는 정품 2.2.3 빌드와 바이트 단위로 동일하다.
OpenClaw는 실제 오픈소스 AI 에이전트 프레임워크이며 악성코드가 아니다. Cline의 권고문도 이를 명시적으로 밝히고 있다. 합법적인 프로젝트이긴 하지만, 해당 설치는 승인되지 않았고 의도된 것도 아니었다. tarball을 분석한 Endor Labs는 설치 과정에서 OpenClaw의 Gateway 데몬이 시작되지 않았다는 점을 근거로 전체적인 영향을 낮음으로 평가했다. StepSecurity의 분석 글은 그 이면을 다룬다. 전역 설치를 하면 설치한 사용자가 가진 자격 증명과 파일 접근 권한 그대로 프레임워크가 디스크에 남게 되며, 운영자 API를 갖춘 상시 구동 로컬 게이트웨이라는 OpenClaw의 설계상 그것은 그곳에서 발견될 경우 매우 가치 있는 대상이 된다. 두 평가는 상충하지 않는다. 하나는 해당 시간대에 무엇이 실행되었는지를 설명하고, 다른 하나는 그 후에 무엇이 남겨졌는지를 설명한다.
규모는 신중하게 다뤄야 하는 유일한 숫자다. StepSecurity는 침해된 버전이 지원 중단되기 전 약 4,000회 다운로드되었다고 보고했고, The Register도 이 수치를 그대로 전했다. Endor Labs는 1월 19일부터 2월 17일까지 cline의 월간 다운로드 수를 418,545로 집계했는데, 이는 악성 빌드가 아니라 패키지의 정상 트래픽을 보여준다. 어느 수치도 머신 수를 세는 것은 아니다. 다운로드 수는 영향을 받은 개발자 수가 아니며, 어떤 당사자도 2.3.0의 설치 기반 수치를 공개하지 않았다. Microsoft의 Threat Intelligence 팀은 X에서 The Hacker News가 보도한 바와 같이 2월 17일 Cline 설치 스크립트로 인해 OpenClaw 설치가 "작지만 눈에 띄는 증가"를 보였다고 말했다.
GHSA-9ppg-jx86-fqw7에 대한 GitHub의 권고 기록에는 CVE도 CWE도 없으며, 심각도는 Low입니다. 그 등급은 무해한 페이로드에 관한 것이지 자격 증명 탈취에 관한 것이 아니며, 사건 자체에 대한 아카이브의 치명적 등급과 나란히 놓이기에는 어색합니다. 권고에는 영향을 받는 버전으로 2.3.0, 수정 버전으로 2.4.0이 기록되어 있습니다.
Cline이 답변하지 않은 공개 사항
Khan의 공개 전 타임라인은 기록 중 모델에 관한 내용이 가장 적고 프로세스에 관한 내용이 가장 많은 부분이다. 그는 2026년 1월 1일 GitHub의 비공개 취약점 신고를 통해 GHSA를 제출했고, 같은 날 Cline의 신뢰 페이지에 기재된 보안 담당자에게 이메일을 보냈다. 그는 1월 8일 Cline 개발자에게 후속 연락을 보냈다. 그는 1월 18일 X에서 Cline CEO에게 다이렉트 메시지를 보내려고 시도했다. 그는 2월 7일 다시 글을 보냈지만 자동 생성된 티켓 번호 외에는 아무것도 받지 못했다. 그는 2월 9일 공개했다.
Cline은 약 30분에서 한 시간 후에 수정 사항인 풀 리퀘스트 9211을 병합했습니다. 해당 PR은 세 개의 워크플로 파일인 claude-issue-triage.yml, claude-pr-review.yml, cline-pr-review.yml을 삭제하고, publish.yml, publish-nightly.yml, npm-nightly.yaml, npm-main.yaml에서 캐싱을 제거합니다. 총 7개 파일이며, 이제 의존할 캐시 적중이 없으므로 설치 단계가 무조건 실행되도록 변경했습니다.
Khan의 게시물에서 인용된 2월 10일 Cline의 공개 응답은 해당 발견을 인정하고 즉각적인 완화 조치를 나열했습니다. 이슈 및 PR 봇 검토 워크플로 제거, 릴리스 자격 증명을 처리하는 게시 워크플로에서 actions/cache 제거, 봇, 공급자 및 게시 토큰을 포함한 관련 자격 증명 교체입니다. 또한 대응 처리에 대해서도 인정했습니다. "초기 보고에 대한 저희의 응답 시간이 용납될 수 없었음을 인정합니다. 1월 1일에 제출된 보고서가 처리되기 위해 2월 9일에 공개적으로 밝혀질 필요는 없었습니다."
2월 11일 Cline은 VSCE_PAT, OVSX_PAT 및 NPM_RELEASE_TOKEN의 전체 교체를 완료했다고 밝혔으며, 2025년 12월 21일부터 2026년 2월 9일까지 세 배포 채널의 모든 릴리스에 대한 감사를 실시한 결과 모든 Marketplace 및 OpenVSX 버전이 태그가 지정된 GitHub 릴리스에 매핑되었고 41개의 npm 버전 모두 소스와 일치한다는 사실을 확인했다고 말했다. Cline은 "주장된 노출 기간" 동안 승인되지 않은 릴리스가 게시되지 않았다고 결론지었다. 6일 후, 위에 인용된 메시지에서 Cline은 기록을 정정했다. npm 토큰은 폐기되지 않았으며, 2.3.0이 해당 토큰으로 게시되었다는 것이다.

확립됨, 귀속됨, 미해결됨
• 입증됨. 워크플로 구성은 공개되어 있으며 수정 전에 게시되었습니다. Khan은 저장소 미러에서 프롬프트 인젝션을 재현했습니다. Cline은 수정 조치를 병합하고 2.3.0 게시, 추가된 postinstall 줄, 변경되지 않은 CLI 바이너리, 8시간 창, 토큰 실패를 확인하는 보안 권고를 발표했습니다. npm 레지스트리의 2.3.0 및 2.4.0 타임스탬프는 권고의 시간과 일치합니다. 아카이브는 해당 기록을 critical 등급, 신뢰도 A로 평가했으며, 실제 피해가 기록되었고 분쟁 플래그는 없습니다.
• 귀속 주장은 있으나 확정된 것은 아님. 2.3.0을 누가 배포했는지는 여전히 미해결된 귀속 문제다. Michael Bargury와 Raptor라는 자동화 조사 도구가 19 February에 발표한 포렌식 보고서는 glthub-actions라는 GitHub 계정을 지목하며, 이 계정이 cline/cline을 포크하고 28 January 2026 03:51 UTC에 주입된 제목으로 이슈 8904를 열었으며 포크 커밋을 사용해 gist에서 페이로드를 실행했다고 높은 신뢰도로 보고한다. Khan은 gcbrun과 Dev11940518 계정은 자신의 것이 맞고 glthub-actions는 자신의 것이 아니라고 확인했다. 해당 계정은 보고서가 발표되었을 때 이미 삭제되었거나 정지된 상태였고, Cline은 누구도 지목하지 않았다. 이 신원은 제3자의 조사 결과로 간주해야 한다.
• 논쟁의 대상은 사실이 아니라 성격이다. Bargury는 이 사건이 악의적 캠페인이라기보다 보안 연구 시연에 부합한다고 평가하며, 무해한 페이로드와 해당 행위자가 New Relic 자동화 리포지토리를 겨냥했던 이력을 근거로 든다. Cline은 이를 무단 게시라고 부르고, Khan은 2.3.0을 게시한 행위자가 캐시를 오염시킨 이와 "아마도" 동일 인물이라고 쓴다. 해를 끼치려는 의도가 있었음을 입증한 사람은 아무도 없고, 그런 의도가 없었음을 입증한 사람도 아무도 없다.
• 미해결. Khan 자신의 출판 전 메모는 이후 보도에서 때때로 단순화되는 한 지점을 신중히 짚는다. 2026년 1월 31일부터 2월 3일 사이에 여러 야간 실행이 아무 출력도 내지 않은 Post Checkout 단계 때문에 실패했는데, 이는 Cacheract의 침해 지표이며, 트리아지 워크플로가 가장 명백한 경로이긴 하지만 해당 활동의 진입점이었다는 점은 입증되지 않았다. 또한 Marketplace 또는 OpenVSX 토큰이 사용되었다는 증거를 공개한 당사자도 없다. 누구든 제시한 유일한 산출물은 npm 빌드뿐이다.

그 후 무엇이 달라졌나요?
수정 조치는 여러 계층에 동시에 적용되었으며, 각 계층이 이 실패의 서로 다른 부분에 대응하므로 각각을 짚고 넘어갈 가치가 있다. 외부인이 접근할 수 있었던 워크플로는 범위를 좁히는 대신 삭제되었다. 게시 비밀을 보유한 네 개의 릴리스 워크플로에서 캐싱이 제거되었으며, 저장소 전체에서 제거된 것은 아니다. 이것이 피벗을 끊는 변경이다. 자격 증명이 교체되었고, 2월 17일 수정 이후 올바른 npm 토큰이 폐기되었다. Cline의 권고문은 npm 게시가 이제 GitHub Actions를 통한 OIDC 출처 증명을 사용한다고 밝히며, StepSecurity의 메타데이터 분석은 그것이 왜 중요했는지를 보여준다. 정당한 릴리스들은 이미 출처 증명을 갖추고 있었고, 2.3.0은 사람 계정으로 게시된 예외였다. 허점은 신뢰할 수 있는 게시와 함께 장기 수명 토큰 경로가 계속 열려 있었다는 점이며, 이는 Endor Labs가 유지관리자들이 반드시 닫아야 한다고 주장하는 바로 그 부분이다. Cline은 GHSA-9ppg-jx86-fqw7을 게시하고, 설치해서는 안 된다는 메시지와 함께 2.3.0을 지원 중단 처리했으며, 사용자들에게 2.4.0 이상을 안내했다.
Khan의 구조적 권고는 구현된 범위보다 더 나아가며, Cline의 것이 아니라 그의 것으로 기록할 가치가 있습니다. 즉, 모든 트리아지 워크플로에서 Bash, Write, Edit을 제거하고 파일 읽기와 필요한 특정 GitHub CLI 호출만 남길 것, 운영 게시 비밀을 보유한 작업에서는 캐시를 절대 복원하지 말 것, 그리고 야간 릴리스에 자체 레지스트리 네임스페이스와 전용 비운영 게시 ID를 부여하여 탈취된 야간 토큰으로는 안정 릴리스를 전혀 게시할 수 없게 할 것입니다.
수정과 악성 배포 사이의 8일 간격은 이 기록을 남겨 둘 가치가 있게 만드는 세부 사항이다. 이 체인의 모든 단계는 이미 알려진 기법이었다. Khan은 캐시 포이즈닝 도구를 공개했고, Aikido Security의 2025년 12월 PromptPwnd 연구는 동일한 트리아지 설정 오류 패턴을 문서화했다. 이것들을 공급망 사고로 엮어낸 것은 외부인의 텍스트가 셸에 도달하게 한 워크플로, 릴리스 키를 보유한 작업들과 공유된 캐시, 그리고 자격 증명 하나를 놓친 토큰 교체였다. 세 가지 수정은 각각 그 자체로 체인을 끊을 수 있었지만, 세 번째 수정은 8일 늦게 도착했다.
