- GitHub 계정에 연결된 MCP 에이전트가 공개 Issue를 읽는 것만으로 비공개 저장소 데이터 유출 경로가 열릴 수 있음
- 공격은 공개 저장소 Issue에 심은 간접 프롬프트 인젝션이 에이전트의 도구 사용 흐름을 바꾸면서 시작됨
- 데모에서는
ukend0464/pacman의 악성 Issue가 Claude 4 Opus와 GitHub MCP 연동을 거쳐 비공개 저장소 정보를 공개 PR로 내보냄 - 문제의 핵심은 GitHub MCP server 코드 결함보다, 신뢰된 도구가 신뢰할 수 없는 외부 콘텐츠와 함께 쓰이는 구조에 있음
- 저장소별 최소 권한, 세션 단위 접근 제한, MCP-scan 같은 런타임 보안 모니터링이 에이전트 시스템에 필요함
악성 Issue로 시작되는 GitHub MCP 공격
- Invariant는 널리 쓰이는 GitHub MCP integration에서 공격자가 사용자의 에이전트를 탈취해 비공개 저장소 데이터를 유출시킬 수 있는 취약점을 발견함
- 해당 GitHub MCP server는 GitHub에서 14k stars를 받은 프로젝트임
- 취약점은 Invariant의 보안 분석기가 탐지한 초기 Toxic Agent Flows 사례 중 하나임
- Toxic Agent Flow는 간접 프롬프트 인젝션으로 에이전트가 의도하지 않은 도구 사용 순서를 수행하게 되는 흐름임
- 데이터 유출이나 악성 코드 실행 같은 행위로 이어질 수 있음
- 코딩 에이전트와 IDE가 빠르게 배포되는 상황에서, 유사한 공격이 핵심 소프트웨어 개발 도구 사용자에게 노출될 수 있음
공격 구성
- 사용자는 Claude Desktop 같은 MCP 클라이언트를 쓰고, GitHub MCP server를 자신의 GitHub 계정에 연결한 상태임
- 공격 시나리오는 두 종류의 저장소를 가정함
<user>/public-repo: 누구나 Issue와 버그 리포트를 만들 수 있는 공개 저장소<user>/private-repo: 독점 코드나 회사 내부 데이터가 들어 있는 비공개 저장소
- 공격자는 GitHub의 일반 권한 규칙에 따라 공개 저장소에 악성 Issue를 만들 수 있음
- 사용자가 에이전트에
Have a look at the open issues in <user>/public-repo같은 정상 요청을 보내면, 에이전트가 공개 저장소 Issue를 가져오며 프롬프트 인젝션에 노출됨 - 이후 에이전트는 비공개 저장소 데이터를 컨텍스트로 가져오고, 공개 저장소에 자동 생성한 PR로 데이터를 유출할 수 있음
데모에서 확인된 유출 흐름
- 데모는 공개 저장소
ukend0464/pacman과 여러 비공개 저장소를 사용함ukend0464/pacman: 간단한 Pacman 게임 구현이 들어 있는 공개 저장소이며 GitHub에서 확인 가능- 비공개 저장소들에는 사용자의 개인 프로젝트와 민감 정보가 들어 있음
- 공격자는 공개 저장소에 악성 Issue를 배치함
- 해당 Issue는 에이전트가 공개 저장소 Issue 목록을 조회하는 순간 실행될 페이로드를 포함함
- 사용자는 Claude 4 Opus에 요청을 보내 공격을 트리거함
- Claude Desktop은 기본적으로 개별 도구 호출에 사용자 확인을 요구함
- 많은 사용자는 에이전트를 사용할 때 “Always Allow” 확인 정책을 선택하고 개별 동작 감시를 중단함
- 에이전트는 Issue 목록을 순회하다가 공격 페이로드를 발견하고, 비공개 저장소 데이터를 컨텍스트로 가져온 뒤
pacman저장소의 pull request에 유출함 - 공개 PR에는 사용자
ukend0464의 비공개 정보가 포함됨Jupiter Star같은 비공개 저장소 정보- 남미로 이주하려는 계획
- 급여 정보
- 전체 에이전트 추론과 도구 사용 순서는 Invariant Explorer의 전체 trace에서 확인 가능함
신뢰된 도구에서도 생기는 Toxic Agent Flow
- 이 취약점은 MCP 도구 자체가 손상되어야 하는 기존 도구 오염 공격과 다름
- GitHub 같은 외부 플랫폼에 연결된 에이전트가 신뢰할 수 없는 정보에 노출되면, 도구가 완전히 신뢰된 상태여도 문제가 생길 수 있음
- 에이전트 시스템에서 이런 흐름을 이해하고 분석하며 완화하는 작업은 수동으로 대규모 수행하기 어려움
- Invariant는 조직이 악의적 행위자에게 악용되기 전에 잠재 위협을 식별하고 모델링할 수 있도록 Toxic Agent Flow 탐지 자동화 방법을 개발함
적용 범위와 완화책
- 실험은 Claude Desktop에 초점을 맞췄지만, 취약점은 특정 에이전트나 MCP 클라이언트에 한정되지 않음
- GitHub MCP server를 사용하는 모든 에이전트가 기본 모델이나 구현과 무관하게 영향을 받을 수 있음
- 중요한 점은 이 문제가 GitHub MCP server 코드 자체의 결함이 아니라는 것임
- 서버 측 패치만으로 GitHub가 단독 해결할 수 있는 취약점이 아님
- 에이전트 시스템 수준에서 다뤄야 하는 구조적 문제임
-
세분화된 권한 제어
- GitHub 같은 MCP 연동을 사용할 때 에이전트 접근 권한을 필요한 저장소로 제한해야 함
- 전통적인 토큰 기반 권한은 일부 보호를 제공하지만, 에이전트 기능을 제한하는 경직된 제약을 만들 수 있음
- Invariant는 에이전트 시스템에 맞춘 동적 런타임 보안 계층을 권장함
- Invariant Guardrails는 에이전트 워크플로에 맞춰 적응하는 컨텍스트 인식 접근 제어를 제공함
- 예시 정책은 한 세션에서 하나의 저장소만 접근하도록 제한해 저장소 간 정보 유출을 막음
- 서로 다른
repo또는owner에 대한 저장소 관련 도구 호출이 이어지면 위반으로 처리함 - 전체 정책은 github_policy.txt에서 확인 가능함
- 적용 방법은 MCP-scan documentation에 있음
- Guardrails Playground에서 배포 전 정책을 테스트할 수 있음
-
지속적인 보안 모니터링
- 예방 조치와 함께 실시간 위협 탐지와 대응을 위한 모니터링이 필요함
- Invariant는 에이전트와 MCP 시스템 간 상호작용을 지속적으로 감사하기 위해 MCP-scan 같은 전용 보안 스캐너 배포를 권장함
- MCP-scan의 proxy mode는 기존 에이전트 인프라 수정 없이 MCP 연결을 실시간 스캔할 수 있게 함
- MCP 트래픽을 프록시로 라우팅하면 가시성과 실시간 보안 위반 스캔을 얻을 수 있음
- 포괄적 모니터링은 감사 추적을 만들어 잠재 취약점, 악용 시도, 새로운 공격에 대한 보호 상태 확인에 도움이 됨
모델 정렬만으로는 충분하지 않음
- 실험에는 최신의 정렬 및 보안 훈련이 적용된 Claude 4 Opus가 사용됨
- 강한 안전 훈련에도 에이전트는 비교적 단순한 프롬프트 인젝션에 조작될 수 있었음
- 많은 기성 프롬프트 인젝션 탐지 방어도 이 공격을 잡지 못함
- 에이전트 시스템 보안은 컨텍스트와 환경에 의존함
- 일반적인 모델 정렬 훈련은 모든 배포 시나리오나 조직별 보안 요구를 예측할 수 없음
- 시스템 수준 보안 조치가 모델 수준 보호 장치를 보완해야 함
에이전트 보안에서 남는 과제
- GitHub MCP server를 사용하는 에이전트는 악성 GitHub Issue를 통해 조작되어 비공개 저장소 데이터를 공개 저장소로 유출할 수 있음
- 이번 취약점은 GitHub MCP에 특화되어 있지만, 유사한 공격은 다른 환경에서도 계속 나타나고 있음
- Legit Security는 최근 GitLab Duo의 원격 프롬프트 인젝션 취약점을 보고함
- 대규모 책임 배포를 위해 MCP 연동과 에이전트 시스템에는 MCP-scan과 Guardrails 같은 전용 보안 스캐너와 정책 제어가 필요함