보안
네 개의 AI 코딩 에이전트가 플러그인을 커밋 해시에 고정했다. 실제로 무엇이 왔는지는 아무도 확인하지 않았다
Claude Code, Codex, GitHub Copilot, Gemini CLI 모두 git에 고정된 커밋을 요청하고도 그것을 실제로 받았는지 검증하지 않았다. Anthropic과 OpenAI는 수정을 배포했지만 Microsoft는 아직 내놓지 않았고 Google은 내놓지 않을 예정이며, GitHub는 고칠 곳이 에이전트가 아니라고 말한다.
MAI
주요 AI 코딩 에이전트는 모두 같은 방식으로 플러그인을 설치한다. 마켓플레이스가 플러그인을 게시하고, 에이전트가 특정 git 커밋에 고정(pin)하며, 그 고정이 곧 보증이 된다. 커밋 해시는 콘텐츠 주소 방식이라 조용히 바꿔치기할 수 없다. 고정은 패키지 생태계에서 공급망 위험에 대한 표준적인 해답이었고, 그래서 코딩 에이전트의 플러그인 마켓플레이스는 이미 해결된 문제로 취급돼 왔다.
그런데 AIR Security 연구진이 공개한 보고에 따르면, 주요 네 제품 — Anthropic의 Claude Code, OpenAI의 Codex, GitHub Copilot, Google의 Gemini CLI — 이 모두 git에 고정된 커밋을 요청한 뒤, 돌아온 것이 정말 그 커밋인지는 확인하지 않았다. 연구진은 이를 Plugin4Shell이라 부른다. 넷 중 둘은 수정을 배포했다. 나머지 둘은 아직이고, 그중 하나는 앞으로도 고쳐지지 않는다.
고정은 확인했지만, 결과는 확인하지 않았다
결함은 해시 자체에 있지 않다. 커밋을 요청하는 일과, 그 뒤 작업 트리에 실제로 무엇이 들어 있는지 검증하는 일 사이의 빈틈에 있다. OpenAI의 수정 노트는 이 동작을 그대로 설명한다. git은 "요청된 커밋 SHA를 브랜치 이름으로 해석할 수 있"으며, 그 결과 에이전트는 "고정한 것과 다른 커밋"을 갖게 될 수 있다는 것이다. 플러그인 저장소가 모호한 참조 이름을 허용하는 곳에 호스팅돼 있다면, 그 저장소 소유자는 마켓플레이스가 한 번도 검토한 적 없는 코드로 고정이 해석되게 만들 수 있다.
AIR이 정리한 결함의 요약은 더 짧다.
에이전트는 마켓플레이스가 고정한 바로 그 커밋을 체크아웃하지만, 실제로 거기에 도달했는지는 전혀 검증하지 않는다.
심각성은 그다음에 무엇이 실행되는지에서 온다. 코딩 에이전트는 개발자의 셸, 자격 증명, 소스 트리를 쥐고 있다. 플러그인 안으로 들어온 코드는 그 모든 것 안으로 들어온다.
백그라운드 자동 업데이트가 이를 제로클릭으로 만든다
플러그인 설치는 개발자가 한 번 내리는 결정이다. 그러나 최신 상태로 유지하는 것은 에이전트가 계속해서 내리는 결정이다. 플러그인은 기본값으로 백그라운드에서 자동 업데이트되기 때문이다. 방어자가 가장 경계해야 할 대목이 바로 이 지점이고, 연구진도 그렇게 못박는다.
이것은 설치 시점에만 해당하는 버그가 아니다. 그래서 제로클릭이다. 같은 git 체크아웃이 백그라운드 자동 업데이트에서 다시 실행된다.
3월에 검증해 설치한 플러그인이 개발자가 아무것도 건드리지 않은 채 9월에 교체될 수 있다는 뜻이다. 확인 창도, 설치 절차도, 새 코드를 사람이 승인하는 순간도 없다.
패치 현황
| 에이전트 | 수정 버전 | 9월 18일 기준 상태 |
|---|---|---|
| Claude Code (Anthropic) | 2.1.179 | 수정 완료, 2026년 6월 17일 확인 |
| Codex (OpenAI) | 0.146.0 | 수정 완료, 2026년 8월 12일 검증 |
| GitHub Copilot (Microsoft) | — | 수정 미배포 |
| Gemini CLI (Google) | — | 수정 예정 없음. 제품 종료 예정이며 Antigravity로 이전 권고 |
AIR은 5월에 이 문제를 발견해 6월에 네 곳 모두에 보고했다고 밝혔다. 9월 18일 기준으로 CVE 식별자는 부여되지 않았고, 네 곳 중 어디도 보안 권고를 내지 않았다. 보안팀이 평소 주시하는 경로로는 이 사안이 전혀 드러나지 않았다는 뜻이다. 연구진은 실제 악용 정황은 확인되지 않았다고 보고했다.
GitHub은 자사는 노출되지 않는다고 말한다. 그것은 호스팅에 대한 주장이지 에이전트에 대한 주장이 아니다
GitHub의 입장은, 자사 플랫폼의 저장소에 붙일 수 있는 이름을 제한하고 있으므로 이 문제가 자사 사용자에게 닿지 않는다는 것이다.
GitHub은 커밋 SHA와 유사한 브랜치나 태그 이름을 사용자가 만들도록 허용하지 않는다… 따라서 보고된 취약점은 GitHub에서 악용될 수 없다.
그 범위 안에서는 정확한 말이며, GitHub에 호스팅된 플러그인이 이 변종으로부터 보호되는 이유이기도 하다. 연구진의 반박은 그것이 수정을 엉뚱한 계층에 두는 일이라는 것이다. Copilot을 비롯한 에이전트는 다른 곳에 호스팅된 마켓플레이스 — Bitbucket, 자체 운영 git 서버, 사내 미러 — 에서도 설치할 수 있고, 그 어느 것도 GitHub의 이름 규칙을 물려받지 않는다. AIR의 표현으로는 "수정은 에이전트에 실려야 하며, 업데이트만이 유일한 완전한 완화책"이다.
이 이견은 이 버그 하나를 넘어선다. 플랫폼 측의 제한은 그 플랫폼 사용자를 보호한다. 반면 에이전트는 무엇을 실행할지 결정하는 구성요소이자, 모든 출처의 모든 설치에 빠짐없이 관여하는 유일한 구성요소다. Microsoft에 따르면 포춘 500대 기업의 약 90%가 Copilot을 사용하며, 그 기업용 매력의 일부는 사내 마켓플레이스 지원에 있다 — 바로 GitHub의 이름 규칙이 포괄하지 못하는 구성이다.
지금 할 일
Claude Code는 2.1.179 이상으로, Codex는 0.146.0 이상으로 업데이트한다. 둘 다 그것으로 조치가 끝난다. Copilot에는 패치가 없으므로 가능한 통제는 조직적인 것이 된다. 개발자가 설치할 수 있는 플러그인 마켓플레이스를 제한하고, Microsoft가 클라이언트 변경을 내놓을 때까지 GitHub 호스팅 마켓플레이스를 우선하는 것이다. Gemini CLI는 수정이 아예 제공되지 않으므로, 이전은 로드맵상의 결정이 아니라 보안상의 결정이 된다.
더 넓게 보면, 코딩 에이전트를 둘러싼 플러그인 계층이 그것을 검토할 장치보다 빠르게 자랐다는 것이 문제다. AIR이 같은 생태계에서 앞서 수행한 연구에서는, 보안 검토를 통과한 뒤 외부에서 가져오는 리소스를 바꿔치기한 가짜 스킬이 삭제되기 전까지 약 26,000개 에이전트에 도달했다. Plugin4Shell은 같은 형태의 실패가 한 계층 아래에서 일어난 것이다. 검토는 이뤄졌고, 고정은 기록됐으며, 기록된 의도와 기계가 실제로 실행한 것 사이에 틈이 있었다.
Sources: AIR Security: Plugin4Shell · Help Net Security · The Register · The Hacker News