CamoLeak: 치명적인 GitHub Copilot 취약점으로 비공개 소스 코드 유출

3 weeks ago 13

  • 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에서 이미지 렌더링을 전면 비활성화하며 취약점을 수정함

더 알아보기

Read Entire Article