- 2025년 6월, GitHub Copilot Chat에서 치명적인 취약점(CVSS 9.6) 이 발견됨
-
CSP 우회와 원격 프롬프트 인젝션 기법을 활용해 비밀 정보와 비공개 코드 유출 가능성 확인됨
- GitHub의 숨김 주석 기능을 악용해 다른 사용자의 Copilot 응답 결과를 조작할 수 있음
- GitHub의 Camo 프록시 이용 구조를 정교하게 분석해 CSP 우회를 성공시킴
- Github는 이미지 렌더링을 비활성화하는 방식으로 2025년 8월 해당 취약점을 긴급 수정함
TL;DR 요약
- 2025년 6월, GitHub Copilot Chat에서 비공개 저장소의 소스 코드 및 비밀 정보 유출이 가능한 치명적 취약점이 발견됨
- 발견자는 원격 프롬프트 인젝션과 GitHub CSP(Content Security Policy) 우회를 활용해, Copilot 응답을 완전히 조작 및 제어하고 악성 코드 또는 링크 제안을 유도함
- 이 공격의 핵심은 GitHub의 숨김 주석 공식 기능과 Copilot의 컨텍스트 민감성을 이용해, 아무도 볼 수 없는 방식으로 프롬프트를 삽입하는 점에 있음
- GitHub에서 이미지 외부 링크를 Camo 프록시로 자동 변환하는 동작을 분석하여, 해당 구조를 문자 단위로 역이용해서 유출 정보를 구성하게 설계함
- 해당 취약점은 HackerOne을 통한 제보 후, GitHub에서 Copilot Chat의 이미지 렌더링 기능 차단 조치로 패치됨
배경
- GitHub Copilot Chat은 개발자가 질문을 하거나 코드 설명, 구현 제안을 받을 수 있게 도와주는 통합형 AI 도우미임
- Copilot Chat은 저장소 내 코드, 커밋, PR(풀 리퀘스트) 등 다양한 컨텍스트 정보를 참조함
- 컨텍스트 정보가 많아질수록 공격 표면도 확대되는 상황임
프롬프트 인젝션과 숨김 주석 기능 활용
- GitHub Copilot의 컨텍스트 민감성을 공격하는 실험으로, PR(풀 리퀘스트) 설명란에 특정 프롬프트를 삽입함
- 단, 일반적으로 삽입한 프롬프트나 메시지는 모든 사용자가 확인할 수 있음
- 여기서 GitHub의 공식 숨김 주석 기능(<!-- 숨김 내용 -->)을 사용해, 눈에 보이지 않는 방식으로 Copilot에게만 명령 전달이 가능함을 발견함
- 숨김 주석 안에 프롬프트를 넣을 경우, 알림(Notifications)에는 노출되지만 구체적 내용은 보이지 않아 Server-Side Injection 효과 발생
악성 프롬프트의 파급력
- 숨김 주석 프롬프트는 다른 사용자가 PR 페이지에 접근할 때도 동일하게 Copilot에 영향 미침
- 단순 문구 대신 코드 제안, 마크다운, 악성 URL, Copilotevil과 같은 악성 패키지 추천 등 복합 명령 삽입이 가능함
- Copilot은 해당 요청을 보낸 사용자와 동일 권한을 사용하므로, 비공개 저장소 접근 및 정보를 활용할 수 있음
- 의도적으로 base16 인코드 데이터를 URL에 추가하여, 사용자가 클릭 시 해커에게 정보가 유출되는 시나리오 구현 가능
핵심 영향 정리
-
타 사용자 Copilot 응답 내용 조작 및 제어
-
Markdown, 이미지, 코드, URL 등 맞춤형 프롬프트 인젝션 가능
-
피해 사용자의 권한 범위 내 정보 유출 공격 시도 실현
GitHub CSP 우회의 구조적 해석
- GitHub는 강력한 CSP 적용으로 외부 도메인에서의 이미지 및 리소스 로딩을 제한함
- README나 마크다운에 이미지가 삽입될 때, GitHub Camo Proxy가 외부 URL을 HMAC 서명 기반의 프록시 URL로 변환 처리함
- 브라우저에서 이미지를 불러오기 위해서는 사전에 GitHub에서 생성된 Camo URL과 서명 값이 필요함
- 사용자가 임의로 동적 데이터를 포함하는 URL을 만들어도 Camo 프록시를 거치지 않으면 차단됨
Camo 구조 악용 방법
- 발견자는 알파벳/특수문자 집합 전체의 Camo 프록시 URL 사전을 미리 생성해, 숨김 프롬프트에 포함함
- Copilot에게 "ASCII Art 게임"을 요청해, 유출 정보(예: 소스 코드, 키)를 Camo 프록시 이미지들의 나열로 변환하도록 설계함
- 각 이미지 요청을 통해 브라우저에서 1x1 투명 픽셀만 응답 받아 사용자에게는 아무 변화 없음
- 마지막으로, 랜덤 파라미터를 추가해 캐싱 문제를 방지함
실제 공격 구현 및 시도
- 대상은 비공개 프로젝트 이슈 내 zero-day 취약점 설명 정보로 설정
- PoC(증명 코드)로 실제 유출 공격 과정을 입증함
- Copilot로 하여금, 예시로 "AWS_KEY" 키워드 탐색 및 결과 유출까지 자동화함
GitHub의 대응 및 패치
- GitHub는 2025년 8월 14일부로 Copilot Chat에서 이미지 렌더링을 전면 비활성화하며 취약점을 수정함
더 알아보기