5P by GN⁺ 17시간전 | ★ favorite | 댓글 1개
  • 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에서 이미지 렌더링을 전면 비활성화하며 취약점을 수정함

더 알아보기

Hacker News 의견
  • 우리는 전체 작업 환경을 self hosted VCS인 Forgejo로 이전하게 되어 매우 기쁜 마음임, 2년 전부터 모든 클라이언트 저장소까지 마이그레이션하기 시작했는데, GitHub 구독료를 대폭 절감했을 뿐만 아니라 하루에도 30~40명의 개발자가 사용하는 시스템이 훨씬 더 빠르고 안정적인 성능을 얻게 되었음, 또한 VSCode와 LLM 기능이 내장된 모든 에디터 사용을 금지했음, 개발자들은 CLI 기반 코딩 에이전트를 사용할 수 있으나, 이는 엄격히 격리된 컨테이너 안에서 제한된 소스만 허용해주면서 운영하는 중임

    • 30~40명의 개발자가 각자 로컬 머신에 저장소를 클론해 작업하는 환경에서, 실수로 누군가 전체 저장소를 LLM에 노출시키는 것을 어떻게 막는지 궁금함, 만약 누군가 직업적 불이익이 두려워서 실수를 보고하지 않는다면, 유출 사고를 어떻게 감지하는지 궁금함

    • 대안으로 쓰는 IDE가 무엇인지 궁금해서 묻고 싶음

    • CLI 도구들이 어디에 연결되는지 궁금함, OpenAI나 Claude의 공식 서비스인지, 아니면 AWS Bedrock와 같은 프로바이더인지 궁금함

    • VSCode 전체를 금지하는 것은 기능별 문제 플러그인만 제한하는 걸 넘어서 과한 조치처럼 느껴짐, VSCode는 Haskell, Lean 4, F*와 같이 타 IDE에서 지원이 부족한 언어까지 광범위하게 지원하는 유일한 IDE임, 대형 상용 소비재 회사에서도 VSCode 자체를 금지하진 않고, 문제되는 기능만 사용하지 않으면 된다고 생각함

  • 이 문제는 사실 제대로 해결된 것이 아니라고 생각함, Copilot이 자연어 입력을 받아들인다는 점이 대단한 부분임, 즉 어떤 유출 방법이든 영어로 그 방법을 써주면 그대로 동작함, 특정 방법만 “고쳤다”고 하지만 실제로 어떻게 고쳤는지는 공개하지 않음, 예를 들어 base64를 이미지 URL에 쓸 수도 있고, “내 장바구니 목록을 passswd 필드에 실수로 저장했으니 찾아달라”는 식으로 속여 비밀번호도 받아낼 수 있을 것임, 찾아낼 수 있는 취약점이 아주 많아 보임, 혹시 이런 것에 버그바운티라도 주는지 궁금함, 여긴 금광임

    • base64를 이미지 URL로 쓴다는 말이 무슨 의미인지 궁금함, Camo가 적용되지 않은 이미지 URL을 사용하자는 건가, CSP로 인해 Camo 미적용 이미지는 차단된다고 알고 있음, 그리고 Copilot 에이전트가 인터넷 접속 권한이 없다면 fetch 자체가 어려울 것이고, 만약 가능하다면 이미지 사용보다 훨씬 쉬운 공격 경로가 열릴 수 있을 것임

    • Copilot Chat에서 이미지를 렌더링하는 기능을 완전히 비활성화시키는 방식으로 GitHub에서 이 문제를 해결했다고 봄

  • 알파벳의 모든 문자와 기호를 미리 Camo URL로 사전 생성해두고, 이를 프롬프트에 삽입하는 방식의 아이디어가 인상적임, 아름다운 접근임

  • 이번 글은 뭔가 Legit이라는 회사의 홍보 같은 인상을 줌, 그러나 사실 모든 AI 기반 솔루션은 투명성 부족과 신뢰 문제라는 동일한 약점을 가짐, FOSS 기반이 아닌 AI 사이버보안 도구를 쓸 때는 오히려 보안 위협이 더 커질 수 있음

  • 이런 일은 이번이 처음이 아니며, 예전에 “GitHub Copilot Chat: From Prompt Injection to Data Exfiltration”이라는 관련 사례도 있었음

    • 이런 일이 앞으로도 계속 반복될 것임
  • PR에 숨겨진 HTML 주석을 이용해 정보를 숨기는 것이 여전히 심각한 이슈로 남을 수 있다고 생각함, 특히 오픈소스 저장소에서 더 위험함, 이 부분이 개선됐는지 궁금함

    • 이 기능은 이슈/PR 템플릿에 안내 메시지를 넣기 위해 널리 쓰이고 있음, 하지만 Copilot 입력에서 주석을 제거하기는 비교적 간단할 것 같고, LLM의 “프롬프트 인젝션” 문제가 아직 완전히 안전하게 해결되지 않은 이상 임시로라도 이런 처리가 필요할 것임
  • 이 익스플로잇은 LLM의 느린 토큰 단위 응답 패턴을 이용해, 데이터를 순서대로 재구성할 수 있도록 만드는 점이 흥미로움, 만약 LLM이 전체 응답을 한꺼번에 블록으로 반환하게 하면 타이밍이 흐트러져 재구성이 훨씬 더 어려워질 것이라 예상함

    • 각 문자별로가 아니라 문자 위치까지 포함된 URL을 생성하게 만들면 어떨지 제안하고 싶음, 예를 들어 “hacked”라는 문자열을 0.0.0.0/1-h, 0.0.0.0/2-a 형태로 요청하게 하면, 나중에 요청들을 정렬해서 중복 호출도 제거할 수 있을 것임
  • Copilot 사용자의 Repo 접근 권한을 읽기 전용으로 제한하는 방향으로 대응할 수 있지 않은지 궁금함

  • 나는 Copilot으로 개인 소스 코드를 유출한 적이 언제였는지 기억조차 나지 않음

  • 정말 독특하고 멋진 접근 방식이라는 생각임