Plugin4Shell, 제로클릭 원격 코드 실행이 Claude Code·Codex·Copilot·Gemini CLI를 관통했다

보안 기업 Air는 주요 코딩 에이전트 전부가 검증하지 않는 플러그인 고정 버전을 그대로 믿는다고 밝혔다

|6분 읽기0
Source code on a developer's screen — Plugin4Shell turns a routine git checkout inside AI coding agents into remote code execution.
Source code on a developer's screen — Plugin4Shell turns a routine git checkout inside AI coding agents into remote code execution.

보안 기업 Air가 목요일 AI 코딩 어시스턴트를 쓰는 개발자의 컴퓨터에서 원격 코드 실행을 가능하게 하는 취약점을 공개했다. 사용자가 아무것도 누르지 않아도 공격이 성립한다. 회사가 공개한 연구 보고서에서 Plugin4Shell로 명명된 이 취약점은 Anthropic의 Claude Code와 OpenAI의 Codex, GitHub Copilot, Google의 Gemini CLI에 영향을 미친다.

네 곳 중 두 곳만 패치를 내놨다. Anthropic은 Claude Code 2.1.179에서, OpenAI는 Codex 0.146.0에서 문제를 고쳤다. 반면 Microsoft는 Copilot용 수정을 내놓지 않았고, Google은 지원 종료된 Gemini CLI를 아예 패치하지 않겠다고 밝혔다.

이 공격은 모델이나 에이전트의 추론 과정을 건드리지 않는다. 한 계층 아래, 애드온을 실제 노트북에 내려주는 마켓플레이스 배관에 자리 잡는다. 그리고 플러그인은 에이전트를 돌리는 엔지니어가 가진 권한을 그대로 물려받는다.

핵심 요약

  • Air의 연구원 오르 네보, 도르 그라나트, 니브 호프만은 Claude Code와 Codex, GitHub Copilot, Gemini CLI에서 똑같이 빠진 검증 단계를 찾아냈다.
  • Anthropic은 Claude Code 2.1.179, OpenAI는 Codex 0.146.0에서 수정했다. Microsoft는 Copilot용 수정을 내놓지 않았고 Google은 지원 종료된 Gemini CLI를 패치하지 않는다.
  • Claude Code와 Codex에서 기본값으로 켜져 있는 백그라운드 플러그인 자동 업데이트가 공격에서 클릭이라는 조건을 지워버린다.

SHA 고정이 끝냈어야 할 문제

커밋 고정이 등장한 이유는 그 대안이 이미 공개적으로 실패했기 때문이다. 근거 상당수는 Air 자신의 앞선 연구가 제공했다. 이 회사가 신뢰받는 마켓플레이스에 일부러 올린 악성 스킬은 2만 6000개가 넘는 에이전트에 도달했고, 후속 연구에서는 이미 사용 중이던 스킬 925개를 탈취해 에이전트 13만 4000개에 닿았다. 업계의 대응은 이름을 믿지 않는 것이었다. 브랜치나 버전 태그는 옮겨갈 수 있지만 40자짜리 커밋 해시는 그럴 수 없다.

논리 자체는 타당하다. 그리고 바로 그 논리가 이번에 무너졌다. 고정은 누군가 결과를 확인할 때만 보장이 된다. 그런데 설치를 수행하는 클라이언트 쪽 코드는 결과 대신 요청을 확인하고 있었다. 가장 멀리 간 기업일수록 피해를 온전히 떠안았다. 플러그인 소스를 검토하고, 검증된 커밋을 고정하고, 해시를 감사 증적으로 다루던 곳일수록 통제 전체가 바로 그 건너뛴 단계에 매달려 있었기 때문이다.

검증은 어디서 사라지나

git은 브랜치 이름으로 무엇을 허용하는지에 유난히 관대하다. 자체 참조 형식 검증기는 16진수 40자로만 이뤄진 이름도 받아들인다. 어떤 문자열이 유효한 참조인 동시에 그럴듯한 객체 ID일 때, git은 참조를 택하고 충돌은 아무도 읽지 않는 경고로 낮춰버린다. 따라서 플러그인 저장소를 손에 쥔 공격자는 고정된 해시와 한 글자도 다르지 않은 이름의 브랜치를 만들고, 그것을 저장소 기본 브랜치로 올린 뒤, 에이전트가 예상한 커밋에서 성공했다고 보고하는 동안 자신이 고른 내용이 설치되는 것을 지켜보면 된다. Claude Code와 Codex, GitHub Copilot이 모두 이 변종에 뚫린다.

Gemini CLI는 다른 이음매에서 갈라진다. 고정된 객체를 제대로 가져와 저장소의 FETCH_HEAD 파일에 기록한 다음, FETCH_HEAD를 이름으로 체크아웃한다. 악의적인 저장소는 그 이름을 자기 기본 브랜치로 얼마든지 선점할 수 있고, 그 순간 제대로 가져온 커밋은 그냥 버려진다.

두 변종을 모두 막는 방법은 단정문 하나다. 체크아웃이 끝난 뒤 HEAD를 해석해 요청했던 해시와 대조하고, 다르면 중단하는 것이다. 중요한 차이는 요청한 참조가 아니라 해석된 결과를 확인한다는 데 있다. Gemini 변종이 빠져나가는 지점이 정확히 여기다.

자동 업데이트라는 증폭기

설치 시점의 버그만으로도 심각하다. 이번 건이 더 나쁜 이유는 에이전트가 같은 체크아웃을 자체 일정에 따라 다시 실행하기 때문이다. Claude Code와 Codex는 설치된 플러그인을 백그라운드에서 갱신하는 것을 기본 동작으로 삼는다. 상류에서 해시가 바뀌면 설치 과정도, 확인 창도, 눈에 띄는 이벤트도 없이 그대로 전파된다. 공격자는 누구에게도 무언가를 추가하라고 설득할 필요가 없다. 필요한 플러그인은 이미 대상 기기에 깔려 있고, 이미 신뢰받고 있다.

여기서 두 가지 침투 경로가 나오는데, 어느 쪽도 마켓플레이스를 뚫을 필요가 없다. 공격자는 진짜로 쓸모 있는 것을 올려 심사를 통과한 뒤 내용을 나중에 바꿀 수 있다. 아니면 남이 만든 플러그인의 저장소를 탈취하면 된다. 커밋 고정이 막으려던 바로 그 시나리오다. 두 절반은 이미 각각 입증됐고, 그래서 이 연결 고리가 이론이 아니라 현실적인 위협이 된다.

두 곳은 고쳤고, 두 곳은 고치지 않았다

Air는 6월 조율된 공개 절차에 따라 네 곳 모두에 통보했고, 반응은 크게 엇갈렸다. Anthropic과 OpenAI는 수정을 배포했다. Google은 거부했다. Gemini CLI는 지원이 종료됐다며 연구진에게 Antigravity 환경으로 옮길 것을 안내했는데, 이 환경에는 무력화할 마켓플레이스 커밋 고정 자체가 없다. 연구진에 따르면 Microsoft는 끝내 답이 없었다.

GitHub는 자사가 노출됐다는 점에 이의를 제기한다. 대변인은 플랫폼이 커밋 해시처럼 생긴 브랜치·태그 이름을 차단하므로 이 기법이 통하지 않는다고 The Register에 밝혔다. Air의 반박은 에이전트가 GitHub에 호스팅된 마켓플레이스만 쓰는 것이 아니라는 점이다. Anthropic 문서는 지원 백엔드로 Bitbucket과 자체 호스팅 git을 함께 나열하는데, 이들은 해시 모양 브랜치 이름을 평범하게 받아들인다. Microsoft가 포천 500대 기업의 약 90%가 Copilot을 쓴다고 밝힌 점을 고려하면, 패치되지 않은 표면은 결코 작지 않다.

플러그인 거버넌스에 남기는 것

불편한 구조적 결론은 어떤 마켓플레이스도 이 문제를 사용자 대신 고쳐줄 수 없다는 점이다. 고정 값은 클라이언트에서 평가되므로, 마켓플레이스가 내세우는 보장은 정작 자기 코드가 돌지 않는 곳에서 집행된다. 승인된 마켓플레이스를 통제 경계로 취급해온 현재 기업 조달의 전제가 여기서 뒤집힌다. 벤더 중립 표준인 Agent Plugins 같은 시도는 검증 동작을 벤더별 재량이 아니라 명세로 규정한다는 점에서 도움이 될 수 있다. 당장의 실무 조언은 좁다. Claude Code와 Codex는 업데이트하고, Copilot과 Gemini CLI는 무엇이 설치돼 있고 어디에 호스팅돼 있는지 목록부터 파악하는 것이다. 유효한 서명을 달고 npm 패키지 444개를 오염시킨 ChainDrop 웜을 지켜본 사람이라면 같은 양상을 알아볼 것이다. 무결성 장치는 분명히 있었고, 있다는 사실이 집행되고 있다는 뜻으로 오해됐다.

자주 묻는 질문

내 AI 코딩 에이전트도 Plugin4Shell의 영향을 받나?

Claude Code나 OpenAI Codex, GitHub Copilot, Gemini CLI를 쓰면서 마켓플레이스에서 받은 플러그인을 설치해 뒀다면 노출돼 있다. Claude Code 2.1.179와 Codex 0.146.0에는 수정이 들어갔으므로 업데이트하면 이 둘은 막힌다. Copilot과 Gemini CLI에는 현재 사용할 수 있는 패치가 없다.

GitHub에 호스팅된 플러그인만 쓰면 안전한가?

부분적으로만 그렇다. GitHub는 커밋 해시 모양의 브랜치·태그 이름을 거부해 해당 플랫폼에서는 주된 변종을 막는다. 다만 Air 연구진은 에이전트가 Bitbucket이나 자체 호스팅 git 서버의 마켓플레이스도 지원하며 그곳에서는 여전히 수법이 통한다고 지적한다. GitHub의 규칙은 별개인 Gemini CLI 변종에는 아무 효과가 없다.

마켓플레이스가 자체적으로 해결할 수 있나?

없다. 고정된 커밋은 에이전트가 체크아웃을 실행하는 시점에 클라이언트 기기에서 해석되므로, 고정이 지켜졌는지는 에이전트 쪽 검증 단계만 보장할 수 있다. 마켓플레이스는 허용할 git 호스트를 제한할 수 있지만, 그것은 지원 구성을 좁힐 뿐 근본 결함을 닫지는 못한다.

이 기사에 대한 반응을 남겨주세요!

SJ
로딩 중...

관련 기사

AI 에이전트가 RubyGems에 패키지 2,000개를 쏟아냈다. 신규 가입은 나흘간 막혔다
Developer Tools

AI 에이전트가 RubyGems에 패키지 2,000개를 쏟아냈다. 신규 가입은 나흘간 막혔다

포렌식 보고서가 5월 GemStuffer 캠페인을 재구성했다. AI 에이전트가 gem 2,000개 이상을 올려 RubyGems가 나흘간 신규 가입을 동결하게 만든 사건이다.

Seung Jung6일 전
GitHub 하이드라퓨전, 모델을 고르지 않는다. 워크플로를 짠다
Developer Tools

GitHub 하이드라퓨전, 모델을 고르지 않는다. 워크플로를 짠다

GitHub의 프로젝트 하이드라퓨전은 Copilot 코딩 요청마다 다중 모델 실행 계획을 짠다. 단일 모델의 단순함을 내주고 비용을 크게 낮췄다.

Seung Jung5일 전
메타, WhatsApp Business 설정을 Claude·Codex에 맡긴다
Developer Tools

메타, WhatsApp Business 설정을 Claude·Codex에 맡긴다

메타가 WhatsApp Business 계정 설정을 AI 코딩 에이전트에 개방했다. 새로 공개한 WhatsApp Business Tools MCP 서버로 Claude Code와 Codex가 전화번호 등록부터 템플릿·웹훅 설정까지 처리한다.

Seung Jung그저께
기업들이 자사 비공개 소스코드를 AI 평가 데이터로 팔기 시작했다
Developer Tools

기업들이 자사 비공개 소스코드를 AI 평가 데이터로 팔기 시작했다

Specific Labs가 소비자 제품 기업과 핀테크 플랫폼의 비공개 저장소를 라이선스해 Real-SWE를 만들었다. 독점 코드가 긁어모을 수 없는 AI 평가 데이터로 바뀌었다.

Seung Jung3일 전
OpenAI "자체 모델이 Jalapeño 설계를 9개월로 줄였다"
Tech & Business

OpenAI "자체 모델이 Jalapeño 설계를 9개월로 줄였다"

AI가 작성한 커널이 OpenAI 전문가의 구현을 최대 1.8배 앞섰다. Jalapeño의 첫 InferenceX 벤치마크 결과가 공개됐다.

Seung Jung23일 전
LLM 버그 수정기, 멀쩡한 코드를 고친 것보다 열 배 더 망가뜨렸다
Developer Tools

LLM 버그 수정기, 멀쩡한 코드를 고친 것보다 열 배 더 망가뜨렸다

arXiv 연구에서 LLM 수리 루프의 정상 코드 손상률은 0.261, 버그 코드 수리율은 0.023으로 나왔다. 연구진은 이를 몰고 가는 내부 방향까지 찾아냈다.

Seung Jung5일 전