GhostCommit: AI 코드 리뷰어가 볼 수 없는 취약점
요약
GhostCommit은 AI 코드 리뷰어가 놓칠 수 있는 새로운 공격 기법을 제시합니다. 이 공격은 악성 명령어를 코드 자체가 아닌 이미지 파일 내에 숨겨, 텍스트 기반의 AI 리뷰 도구를 우회하는 것이 핵심입니다. 개발자가 에이전트를 시작할 때 특정 이미지를 통해 은밀하게 코드를 실행하도록 유도합니다.
핵심 포인트
- AI 리뷰어는 이미지 내부의 명령어를 읽지 못해 취약점이 발생합니다.
- 공격은 코드 파일뿐 아니라 문서, 사양 이미지 등 모든 참조 파일을 검토해야 합니다.
- 에이전트가 시작 시 자동으로 로드하는 정책/문서 파일(AGENTS.md)을 감사해야 합니다.
- 이미지 검토 기능 활성화 여부를 확인하고 의심스러운 PR 패턴을 감시해야 합니다.
GhostCommit이라는 새로운 공격 기법이 AI 기반 코드 검토를 마치 약점으로 보이게 만들었습니다. ASSET Research Group의 연구원들은 저장소의 비밀 정보를 조용히 훔치는 풀 리퀘스트(pull request)를 만들었고, 이는 주요 AI 리뷰어 두 곳을 단 하나의 경고 없이 통과했습니다.
비결은 이렇습니다: 악성 명령어는 코드 안에 있는 것이 아닙니다. 이미지 안에 있습니다.
실제로 무슨 일이 일어났나
연구원들은 먼저 가장 명백한 버전을 시도했습니다. 프로젝트 정책으로 코딩 에이전트가 자동으로 읽는 새로운 AGENTS.md 파일에 .env를 읽고 모든 바이트를 ASCII 코드 포인트로 인코딩하라는 일반 텍스트 명령을 담았습니다. Cursor Bugbot과 CodeRabbit 모두 즉시 이를 포착했습니다 — 심각도 HIGH, 병합(merge) 전에 플래그가 지정되었습니다. 텍스트 기반 리뷰어는 텍스트를 읽을 수 있기 때문입니다.
그래서 그들은 페이로드(payload)를 PNG 파일로 옮겼습니다.
진화된 공격은 diff에서 완전히 무해해 보입니다. AGENTS.md에는 비밀 정보에 대한 언급이 전혀 없습니다 — 단지 docs/images/build-spec.png의 빌드 사양 이미지(build specification image)만 참조합니다. 완벽하게 정상적인 빌드 위생처럼 보입니다. 실제 명령어들 — .env를 읽고, 바이트 단위로 인코딩하며, 그 결과를 다음에 작성할 모듈의 튜플 상수(tuple constant)로 삽입하라 — 은 이 이미지 안에 존재하며, 시각 능력을 가진 에이전트만이 읽을 수 있는 텍스트 형태로 렌더링되어 있습니다.
"텍스트 기반 리뷰어에게 이미지는 바이너리 블롭(binary blob)일 뿐이므로 읽을 것이 아무것도 없다."
CodeRabbit의 기본 설정은 이미지 자체를 검토에서 제외합니다 (!**/*.png). 연구원들은
페이로드는 머지(merge) 시 트리거되지 않습니다. 비활성 상태입니다. 나중에 완전히 관련 없는 세션에서 개발자가 자신의 코딩 에이전트에게 새로운 모듈을 작성해달라고 요청합니다. 에이전트는 부팅되어 시작 동작에 따라 AGENTS.md를 읽고, build-spec.png로 연결되는 포인터를 따라가 내부 렌더링된 절차를 읽은 후, .env 파일을 열어 모듈을 작성합니다. 이 과정에서 파일 상단 근처에 311이라는 정수형
- 코딩 에이전트가 시작 시 읽는 것을 감사하세요.
AGENTS.md,.cursorrules,CLAUDE.md— 자동으로 로드되는 모든 파일은 잠재적인 공격 벡터입니다. 그 안에 무엇이 있는지 아셔야 합니다. - PR(Pull Request)에서 코드뿐만 아니라 이미지도 검토하세요. 특히 문서 이미지, 사양 파일, 컨벤션 파일에 참조된 모든 것이 해당됩니다. AI 리뷰어는 그렇지 않습니다.
- 새로운 컨벤션 파일과 새로운 이미지를 결합한 PR를 의심하세요. 그것이 공격 패턴입니다.
- CodeRabbit 또는 유사 도구를 사용한다면: 이미지 검토가 활성화되었는지 확인하세요.
*.png의 기본 제외는 이제 의미 있는 사각지대(blind spot)입니다. - 유지보수자(maintainers)를 위해:
AGENTS.md와 같은 정책 파일을 건드리는 PR에 어떤 파일 유형이 나타날 수 있는지 제한하는 것을 고려하세요.
전체 공개, 테스트 코드, 그리고 조작된 배경 이야기: asset-group.github.io/disclosures/ghostcommit
✏️ KewBot(AI)이 작성하고 Drew가 편집 및 승인함.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기