어두운 네이비 바탕 위의 추상 기술 일러스트: 왼쪽 가장자리에는 높은 반투명 경계 평면이 서 있는데, 얇고 옅은 윤곽선과 반투명 유리질 채움으로 그려져 있다. 하나의 흰색 선이 그 평면을 가로질러 오른쪽으로 뻗어 나가며, 얕은 호를 따라 배열된 네 개의 동일한 빛나는 시안색 모듈을 통과한다. 각 모듈 위에는 동일한 흰색 육각형 배지가 떠 있다. 세 번째 모듈은 왼쪽으로 반 칸 이동해 있어, 이전에 있던 자리에는 희미하고 옅은 고스트 윤곽이 남아 있으며, 그 위의 육각형 배지는 호박색으로 빛난다. 텍스트, 사람, 조직 로고는 나타나지 않는다. OrcaRouter 로고가 오른쪽 아래 모서리에 합성되어 있다.
AI Safety Incidents

Plugin4Shell: 네 개의 AI 코딩 에이전트가 한 번도 확인하지 않은 핀을 신뢰했다

작성자

Alistair Wren

게시일

최신 모델 · 20모든 모델 보기 →
벤치마크: Artificial Analysis · 매일 업데이트
모든 게시물로 돌아가기

2026년 9월 17일, 기업용 AI 에이전트를 위한 보안 도구를 개발하는 스타트업 AIR Security는 네 가지 AI 코딩 에이전트인 Anthropic의 Claude Code, OpenAI의 Codex, GitHub Copilot, Google의 Gemini CLI에 존재하는 제로 클릭 원격 코드 실행 취약점 Plugin4Shell을 설명하는 연구 결과를 발표했다. 이 버그는 어떤 모델에도 존재하지 않는다. 이 버그는 각 에이전트가 플러그인을 설치할 때 수행하는 git 체크아웃과, 네 에이전트 모두 수신한 코드가 자신이 고정한 코드인지 검증하지 않았다는 점에 있다. 연구가 공개될 당시 네 가지 중 두 가지에는 패치가 있었고, 두 가지에는 없었다. 이 사건은 Orca AI Incident Archive에 기록된 항목 중 하나로, 해당 아카이브는 이를 악용 사례가 보고되지 않은 고위험 공급망 취약점으로 기록한다.

에이전트들이 실제로 무엇을 잘못했는가

영향을 받는 각 에이전트는 마켓플레이스에서 플러그인을 설치하며, 각 마켓플레이스는 플러그인이 검토된 후 해당 플러그인을 특정 git commit, 즉 40자리 SHA에 고정합니다. 이 고정이 보안 모델의 전부입니다. 검토자는 변경 불가능한 한 버전을 승인하고, 에이전트는 나중에 그 뒤의 저장소가 바뀌더라도 계속 그 버전을 실행해야 합니다. AIR는 이 결함을 플러그인 SHA 고정 우회라고 설명합니다. 에이전트는 마켓플레이스가 고정한 정확한 commit을 체크아웃하지만, 최종적으로 얻게 되는 작업 트리가 바로 그 commit인지 검증하지 않습니다. 연구진의 표현대로, 에이전트는 "마켓플레이스가 고정한 정확한 commit을 체크아웃하지만 그것이 실제로 그곳에 안착했는지는 결코 검증하지 않으므로, 플러그인의 저장소를 통제하는 공격자는 고정이 여전히 지켜진 것처럼 보이게 하면서 체크아웃이 악성 코드로 귀결되게 만든다."

Git이 그 틈을 제공한다. 어떤 이름이 유효한 브랜치이자 커밋 객체일 때, git은 브랜치를 우선하고 모호성 경고만 출력한다. 플러그인의 저장소를 제어하는 공격자는 이름이 정확히 40자리 16진수로 고정된 SHA인 브랜치를 만들고, 이를 악성 코드를 가리키게 한 뒤 저장소의 기본 브랜치로 만든다. 그러면 일반적인 클론은 해당 브랜치를 SHA 형태의 이름으로 로컬에 가져오고, 이어지는 체크아웃은 그 브랜치로 해석된다. 고정된 커밋 자체는 그대로 둘 수 있으므로, 검토된 버전에 대해 잘못된 점은 전혀 없어 보인다. AIR에 따르면 두 가지 조건이 충족되어야 한다. SHA 이름의 브랜치가 기본 브랜치여야 하는데, 기본 브랜치가 아닌 브랜치는 원격 추적 ref로만 페치되며 체크아웃은 실제 커밋으로 폴백되기 때문이다. 그리고 git 호스트가 40자리 16진수 브랜치 이름을 허용해야 한다. GitHub은 그러한 이름을 즉시 거부한다. Bitbucket과 자체 호스팅 git 서버는 그렇지 않다.

Gemini CLI는 다른 경로로 실패했다. 고정된 커밋을 가져와 저장소의 FETCH_HEAD 파일에 기록한 다음 FETCH_HEAD를 체크아웃했는데, 이 체크아웃은 해당 파일을 반드시 읽을 필요가 없다. 기본 브랜치 자체가 FETCH_HEAD라는 이름인 저장소는 체크아웃을 공격자가 제어하는 콘텐츠로 리디렉션하고 가져온 커밋을 조용히 폐기한다. 이 메커니즘에 대한 Cybersecurity News의 설명은 두 변형 간의 차이를 포함해 AIR의 설명과 일치한다.

아무도 아무것도 클릭할 필요가 없었던 이유

동일한 체크아웃이 백그라운드 플러그인 자동 업데이트 중에 다시 실행되며, 이는 Claude Code와 Codex의 기본값입니다. 바로 이것이 이 공격을 단순히 조용한 수준이 아니라 제로 클릭으로 만드는 이유입니다. 마켓플레이스가 고정된 SHA를 일상적인 새 버전으로 올리면, 해당 플러그인을 이미 설치한 모든 에이전트가 프롬프트도 사용자 조작도 없이 체크아웃을 다시 실행합니다. AIR의 요점은 피해자가 부주의하게 무엇인가를 설치할 필요가 없다는 것입니다. 피해자는 자신이 신뢰하는 마켓플레이스에서, 설계 의도대로 정확히 검토되고 고정된 플러그인 하나를 설치했을 뿐이면 됩니다.

그 위치에 도달하는 방법은 두 가지이며, 어느 쪽도 마켓플레이스를 통제할 필요는 없습니다. 첫 번째는 공격자가 검토를 통과하는 진짜 무해한 플러그인을 게시하고, 설치 기반을 구축하고, 정상 업데이트를 배포한 다음에야 악의적인 이름이 붙은 브랜치를 만드는 것입니다. 두 번째는 공격자가 다른 사람이 작성했고 마켓플레이스가 이미 신뢰하는 플러그인의 저장소를 장악한 뒤, 악성 버전을 설치한 모든 사람에게 푸시하는 것입니다.

그 두 경로 뒤에 있는 수치는 Plugin4Shell이 아니라 AIR의 이전 작업에서 나온 것입니다. 회사가 The Story of Skills라고 부르는 캠페인에서 AIR는 자사가 만든 플러그인이 철회되기 전에 26,000개 이상의 에이전트로 퍼졌다고 말합니다. SkillJacking에서는 이미 활발히 사용 중이던 925개의 스킬이 원래 유지관리자로부터 탈취되어 134,000개의 에이전트에 도달했다고 보고했습니다. Plugin4Shell 게시물에 대한 AIR의 헤드라인은 "수백만 개의 에이전트가 영향을 받았다"고 주장하지만, 해당 연구는 노출된 설치 건수에 대한 수치를 제시하지 않으며, 제3자도 이를 발표한 적이 없습니다.

타임라인 및 수정 사항이 적용된 위치

HTML card headed 'Six weeks from proof of concept to public' with kicker 'Plugin4Shell · AIR Security · disclosure sequence'. A vertical timeline in cyan lists six dated entries: May 2026, working proof-of-concept against all four agents; June 2026, coordinated disclosure to Anthropic, OpenAI, Google and Microsoft; 17 June 2026, Anthropic confirms the fix in Claude Code 2.1.179; 4 August 2026, Google confirms no fix will ship because Gemini CLI is being deprecated; 12 August 2026, Codex 0.146.0 verified fixed; 17 September 2026, AIR Security publishes the research. A seventh entry in amber marks 18 September 2026, when The Register, Help Net Security, InfoWorld and Cybersecurity News reported it. An amber box headed 'Still open at publication' records that no CVE identifier had been assigned, no vendor security advisory had been published, and no source answers whether updating an affected agent removes a plugin that has already been swapped. A footer cites the AIR Security disclosure timeline and the outlets that reported it. The OrcaRouter logo is composited in the bottom-right corner.

AIR는 2026년 5월에 네 가지 에이전트 모두에 대한 실제 동작하는 개념 증명 익스플로잇과 함께 해당 결함을 발견했으며, 조정된 공개(coordination disclosure) 방식에 따라 다음 달에 각 공급업체에 이를 알렸다고 밝혔다. Anthropic은 6월 17일 Claude Code 2.1.179에서 수정 사항을 확인했다. Google은 Gemini CLI가 단종될 예정이므로 수정 버전을 출시하지 않겠다고 8월 4일 AIR에 전했다. Codex 0.146.0은 8월 12일 수정된 것이 검증되었다. Microsoft는 GitHub Copilot에 대한 수정 사항을 아직 출시하지 않았다.

패치 버전은 그 결함이 이를 수정한 두 제품에서 실제로 존재했음을 보여주는 유일한 공개 확인 자료다. Anthropic이 공개한 2.1.179 변경 로그 항목에는 연결 끊김 처리, WSL2 스크롤링, 샌드박스 glob 및 인터페이스 수정이 나열되어 있으며, 피닝, 플러그인 검증 또는 어떤 종류의 보안 수정도 언급하지 않는다. The Next Web의 보도에 따르면 The Hacker News도 같은 점을 지적했다. 해당 연구가 발표된 시점까지 CVE 식별자는 부여되지 않았으며, Cloud Security Alliance의 이 결함에 관한 연구 노트는 공급업체에 통보된 지 3개월 후에도 식별자가 존재하지 않았다는 점을 거듭 밝힌다.

네 업체, 세 가지 다른 답변

HTML card headed 'One flaw, four agents, two patches' with kicker 'Plugin4Shell · vendor status at disclosure · 17 September 2026'. A four-row table gives agent, vendor, status and mechanism variant: Claude Code from Anthropic, fixed in 2.1.179 on 17 June 2026, branch named as the pinned SHA; Codex from OpenAI, fixed in 0.146.0 and verified on 12 August 2026, same branch variant; GitHub Copilot from Microsoft, no fix shipped at disclosure, same branch variant; Gemini CLI from Google, no fix and the product deprecated as of 4 August 2026, separate FETCH_HEAD variant. A note beneath reads that the branch-named-as-a-hash variant needs a git host that accepts a 40-character branch name, which GitHub does not and Bitbucket and self-hosted git do, that background auto-update is on by default only for Claude Code and Codex, and that Antigravity, the replacement Google points to, has no marketplace plugin SHA pinning to bypass. A footer cites AIR Security, The Register and Help Net Security. The OrcaRouter logo is composited in the bottom-right corner.

Google은 패치를 거부하는 데 그치지 않고 더 나아갔습니다. Gemini CLI를 폐기했는데, 이는 기존 설치가 사람들이 계속 실행하는 한 계속 노출된 상태로 남는다는 뜻입니다. 권장 사항은 더 새로운 에이전트형 개발 환경인 Antigravity로 마이그레이션하는 것이며, AIR에 따르면 이 환경은 우회할 마켓플레이스 플러그인 SHA 피닝이 없기 때문에 해당 공격이 미치지 않는다고 합니다.

GitHub의 입장은 다시 다릅니다. GitHub 대변인은 The Register에 이 플랫폼이 사용자가 커밋 SHA와 유사한 브랜치 또는 태그 이름을 만들도록 허용하지 않으며, "이 완화 조치를 통해 보고된 취약점이 GitHub에서 악용될 수 없음을 보장한다"고 말했습니다. AIR는 그 완화 조치의 존재 여부가 아니라 범위에 이의를 제기합니다. 연구진은 The Register에 마켓플레이스가 Bitbucket 같은 다른 플랫폼에서 호스팅될 수 있고, GitHub Copilot이 여전히 그러한 플랫폼의 마켓플레이스를 지원하므로 브랜치 이름 변형은 Copilot 사용자에게 여전히 접근 가능한 상태로 남아 있다고 말했습니다. AIR는 또한 Anthropic 자체 문서가 Bitbucket과 자체 호스팅 git을 유효한 마켓플레이스 백엔드로 나열한다고 말합니다. Anthropic의 현재 마켓플레이스 문서는 GitHub에서만이 아니라 git 저장소 URL에서 마켓플레이스를 추가하는 방법을 설명합니다. Microsoft는 The Register의 논평 요청에 응답하지 않았고, AIR는 6월에 이 문제를 보고한 이후 Microsoft로부터 응답을 받지 못했다고 밝혔으며, Microsoft가 처리하고 있는 공개 건수의 규모를 그 이유로 들었습니다.

이것은 노출 범위의 폭에 관한 의견 불일치이며, 버그가 존재하는지 여부에 관한 것이 아닙니다. GitHub의 완화 조치는 호스트 수준의 제한이고, AIR의 발견은 핀이 클라이언트에서 해석되기 때문에 검사가 에이전트 내부에서 이루어져야 한다는 것입니다.

무엇이 확립되었으며, 무엇이 그렇지 않은가

• 확립: 해당 메커니즘. AIR의 글에는 정확한 git 명령, ref-over-object 해석 규칙, 브랜치 트릭에 필요한 두 가지 조건, 그리고 Gemini CLI용 별도의 FETCH_HEAD 변형이 나와 있습니다. The Register, Help Net Security, Cybersecurity News, InfoWorld, The Next Web은 모두 같은 방식으로 보도합니다.

• 확인된 사항:두 개의 패치된 버전. AIR의 공개 타임라인에 따르면, Anthropic은 2026년 6월 17일 Claude Code 2.1.179를 확인했고 OpenAI의 Codex 0.146.0은 2026년 8월 12일 수정된 것으로 검증되었습니다.

• 확인된 사실: 두 제품은 공개 시점에 패치가 없었습니다. Google은 Gemini CLI를 패치하지 않고 단종할 예정이며, Microsoft는 Copilot 수정 사항을 아직 출시하지 않았습니다.

• 확인되지 않음: 독립적 재현. 공개된 모든 기록은 AIR 자체의 블로그 게시물로 거슬러 올라가며, Cloud Security Alliance의 연구 노트는 제3자 기술 검증이나 해당 취약점 공격의 독립적 재현을 명시적으로 기술하고 있지 않습니다. 그런 이유로 아카이브는 이 기록의 신뢰도를 B로 평가합니다.

• 확인되지 않음:실제로 몇 개의 설치가 노출되었는지. "수백만"은 AIR가 헤드라인에서 사용한 표현일 뿐, 측정된 수치가 아닙니다.

• 확인되지 않음: 영향을 받은 에이전트를 업데이트하면 이미 교체된 플러그인이 제거되는지, 아니면 다음 교체만 방지하는지 여부. 이를 해결하는 공개된 출처는 없다.

• 확인되지 않음: 실제 환경에서의 사용 여부. 기록상 어떤 출처도 악용, 프로빙 또는 공격자 인프라를 보고하지 않으며, 아카이브는 실제 피해를 거짓으로 기록합니다. 이는 보고가 없었다는 뜻이지, 아무 일도 일어나지 않았다는 증거는 아닙니다.

제3자 검증 하나는 실무적 상황을 좁혀 준다. The Next Web은 The Hacker News의 검증을 요약하면서, Anthropic 커뮤니티 카탈로그와 기본 Claude Code 및 Copilot 카탈로그의 플러그인이 GitHub 저장소를 가리키며, 자동 업데이트가 주로 이러한 내장 마켓플레이스에 대해 기본적으로 켜져 있다고 보도한다. GitHub은 SHA 형태의 브랜치 이름을 거부하므로, 기본 카탈로그에 머무는 사용자에게는 브랜치 이름 변형에 도달하기가 더 어렵다. 그 추론은 Gemini CLI의 FETCH_HEAD 변형은 다루지 않는다. 이 변형은 호스트가 브랜치 이름을 지정하는 방식에 의존하지 않는다.

수정이 어떤 모습이어야 하는지

Abstract technical illustration on a dark navy field: a white hexagonal badge floats at the top centre, and from it a single white line descends through three translucent horizontal planes, passing through the middle of each. At the lowest plane the line passes a small hollow white ring, then splits — one branch continues straight down to a filled white dot on the plane, the other turns amber and runs off to the left, ending at a small dark unlit block that sits outside the stack. A faint pale outline of that block is drawn on the plane where it should have sat. No text, people or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.

AIR의 권장 수정은 단 하나의 어서션입니다. 체크아웃 후 작업 트리에 실제로 존재하는 커밋을 확인하고, 고정된 SHA와 같지 않으면 중단하는 것입니다. 연구진은 요청된 ref가 아니라 해석된 HEAD를 확인해야 한다고 강조합니다. 그 차이가 바로 Gemini CLI 변형이 빠져나가는 지점이기 때문입니다. 또한 이는 에이전트 내부에서 실행되어야 합니다. 핀은 클라이언트에서 해석되며, 어떤 마켓플레이스도 자신이 광고하는 보장을 강제할 수 없기 때문입니다.

이러한 에이전트를 운영하는 팀을 위한 실용적인 조언으로, AIR, Cybersecurity News 및 InfoWorld의 분석가 논평에서 가져온 내용:

• Claude Code를 2.1.179 이상으로, Codex를 0.146.0 이상으로 업데이트하세요. 패치가 존재하는 경우 업데이트가 유일한 완전한 완화 방법입니다.

• 패치가 없는 에이전트에서는 자동 플러그인 업데이트를 비활성화하십시오. 그러면 해당 결함이 제로클릭에서 수동 재설치로 바뀌는데, 이는 수정이 아니라 노출을 줄이는 것에 불과합니다.

• Google이 제공되지 않을 것이라고 밝힌 패치를 기다리지 말고 Gemini CLI에서 마이그레이션하세요.

• 플러그인 인벤토리를 점검하고 가능한 경우 마켓플레이스 소스를 제한하세요. AIR는 마켓플레이스가 SHA 형태의 이름을 거부하는 호스트만 허용하도록 함으로써 브랜치 이름 변형을 약화시킬 수 있으며, 사실상 GitHub 전용이 되지만, 이는 에이전트가 공식적으로 지원하는 호스트를 차단하고 Gemini 변형에는 아무 효과도 없다고 지적합니다.

{{1}}워크스테이션을 노출 경계로{{/1}} 간주하십시오. 플러그인은 에이전트의 권한을 상속하므로, 성공적인 익스플로잇은 개발자 자신의 권한으로 소스 코드, SSH 키, 클라우드 자격 증명, CI/CD 토큰 및 내부 리포지토리에 도달합니다. Pareekh Consulting의 수석 애널리스트인 Pareekh Jain은 InfoWorld에 보안 팀이 비정상적인 프로세스, 예상치 못한 플러그인 파일, 변경된 리포지토리, 의심스러운 git 활동을 찾기 위해 EDR, git, CI/CD, 클라우드 IAM 및 인증 로그를 살펴봐야 한다고 말했으며, 이러한 조치는 근본적인 결함을 수정하지 않으면서 위험을 줄여 준다고 덧붙였습니다. 그는 이 결함을 벤더 코드 탓으로 돌렸습니다. 그는 InfoWorld에 "기업은 플러그인 사용에 대한 통제를 마련할 수 있지만, 코딩 에이전트가 체크아웃하는 코드를 검증하는 방식의 결함은 수정할 수 없다"고 말했습니다.

왜 핀닝 버그가 중요했던 바로 그 버그인가

SHA 고정(pinning)은 AIR가 이미 입증했던 바로 그런 종류의 장악에 대한 업계의 대응이었다. 공개 저장소가 침해되더라도 에이전트는 공격자가 푸시한 무엇이든 가져오는 대신 감사된 해시를 계속 실행한다. Plugin4Shell은 해시를 깨뜨리지 않는다. 그것은 에이전트들이 고정값을 해시처럼 보이기만 하는 브랜치 이름으로 해석했고, 그 결과를 결코 비교하지 않았다는 점을 보여준다. 그 가정의 하류에 있는 모든 것 — 검토 프로세스, 내부 허용 목록, 개발자들이 고정된 버전에 두는 신뢰 — 은 그 실패를 물려받는다.

기록이 뒷받침하지 않는 것은 무언가가 탈취되었다는 주장이다. 이것은 발견되었고 네 사례 중 두 사례에서 수정된 취약점이다. 그 안의 어떤 출처도 침입을 보고하지 않았으며, 패치를 배포하지 않은 제품들은 여전히 기다리고 있다. 남은 질문은 가장 만족스럽지 않은 질문이다. 패치되지 않은 에이전트에서 플러그인을 실행한 사람이라면 누구든, 실행된 코드가 자신이 승인한 코드였는지 알 수 있는 공개된 방법이 없다.