VibeDaily
← 목록
AI뉴스트러블슈팅

SHA로 못 박아뒀는데 딴 게 설치돼요 — 코딩 에이전트 4종 플러그인 취약점

2026.09.19👁 1🔗 원문 보기

핀을 박는다는 게 이런 뜻이에요. 플러그인을 설치할 때 **"이 저장소의 이 커밋만 쓰겠다"**고 40자짜리 SHA로 못을 박아두는 것. 저장소 주인이 나중에 코드를 바꿔도 내 컴퓨터엔 검토한 그 버전만 온다 — 이게 SHA 핀 고정입니다.

그 못이 헐거웠어요. 9월 17일, 보안업체 AIR가 Plugin4Shell이라는 이름으로 공개했습니다. Claude Code, Codex, GitHub Copilot, 제미나이 CLI 네 개 다 해당돼요.

버그는 딱 한 줄이에요

에이전트는 핀 박은 SHA로 체크아웃을 합니다. 그런데 받아온 뒤에 "진짜 그게 왔나"를 확인하지 않아요.

확인을 안 하면 왜 문제냐면, git은 같은 글자를 보면 '이름'을 먼저 찾기 때문입니다. 40자 SHA와 똑같은 이름의 브랜치가 저장소에 있으면, git은 커밋이 아니라 그 브랜치로 갑니다.

그래서 저장소 주인은 이렇게 할 수 있어요. 검토받은 커밋의 SHA를 그대로 브랜치 이름으로 만들고, 그 브랜치엔 딴 코드를 올려두는 겁니다.

진짜 그렇게 되나 해봤습니다

말로만 들으면 안 믿겨서 직접 재현해봤어요.

# 검토해서 핀으로 박아둔 커밋
SHA=ab1969d859d8...f18dc7f24
 
# 공격자: 저장소 주인이
# 그 SHA와 똑같은 이름의
# 브랜치를 악성 커밋에 만든다
git branch "$SHA" evil
 
# 사용자: 핀 박은 SHA로 받는다
git clone -q up down && cd down
git checkout "$SHA"
 
# 진짜 그게 왔을까?
git rev-parse HEAD

결과입니다.

warning: refname 'ab1969d8...'
is ambiguous.
 
요청한 SHA : ab1969d859d8
실제 HEAD  : 7ac14e10f361
받은 파일  : print('EVIL')

요청한 SHA와 다른 커밋이 왔어요. 파일도 악성 쪽이고요. git이 "이 이름 애매하다"고 경고까지 띄우는데, 그 경고를 사람이 볼 일은 없죠 — 플러그인 설치는 뒤에서 조용히 도니까요.

내친김에 ^{commit}을 붙이면 커밋으로만 해석되지 않을까 싶어 그것도 해봤는데, 똑같이 악성 커밋이 왔습니다. 막히는 건 하나뿐이었어요 — 받은 뒤에 HEAD를 다시 읽어서 대조하는 것. 연구진이 "빠진 검사 한 줄이 버그의 전부"라고 한 게 이 얘기입니다.

'제로 클릭'인 이유

여기서 무서워지는 부분. 에이전트들이 설치된 플러그인을 알아서 업데이트합니다.

한 번 설치해두면 그 뒤엔 아무것도 안 눌러도 바뀐 코드가 내려와요. 설치 창도, 확인 버튼도 없습니다.

그리고 플러그인은 나와 같은 권한으로 돕니다. 소스코드, SSH 키, 클라우드 자격증명, 사내 저장소 — 내가 손댈 수 있는 건 다요.

지난주 샌드박스 기사와 결이 같아요. 가둬놨다고 믿은 쪽이 사실은 안 가둬져 있던 거요.

회사별 대응은 갈렸어요

상태
Claude Code 2.1.179에서 고쳐졌어요
Codex 0.146.0에서 고쳐졌어요
제미나이 CLI 안 고칩니다. 지원 종료 상태라 안티그래비티로 옮기라고 안내했어요
GitHub Copilot GitHub은 "플랫폼 차원에서 막았다"는 입장. 연구진은 비트버킷 같은 외부 마켓플레이스는 그대로 남는다며 반박 중이에요

연구진이 회사들에 처음 알린 건 6월입니다. 공개까지 석 달 걸렸어요.

지금 하실 것

claude --version
claude plugin list

첫 줄로 버전을 보세요. Claude Code는 2.1.179보다 낮으면 올리셔야 합니다. 이 번호는 보도 기준이라, 확실한 건 그냥 최신으로 올리는 것이에요.

둘째 줄은 깔아둔 플러그인 목록입니다. 아무것도 없으면 이 건과 무관해요. 저도 돌려보니 비어 있었습니다.

깔아두신 게 있다면 — 출처가 어디인지만 한 번 보세요. 이 공격은 저장소 주인이 하는 것이라, 모르는 사람 저장소일수록 위험합니다.

짚어둘 것

재현 실험은 제가 직접 돌린 값이에요. 위 출력 그대로 나왔습니다. 다만 이건 git이 그렇게 동작한다는 걸 확인한 것이지, 에이전트를 실제로 공격해본 게 아닙니다.

버전 번호와 회사별 입장은 보도를 정리한 것이에요. 연구진 원문 블로그는 제 환경에서 접속이 막혀 직접 확인하지 못했습니다.

피해 사례는 아직 보고된 게 없어요. 악용됐다는 얘기도 나오지 않았습니다.

플러그인 쓰시는 분 계세요? 어디 것 쓰시는지 카톡 오픈채팅 ⚡ AI랑 코딩하는 사람들에서 이야기 나눠요.

오늘 글, 도움이 되셨나요?