8 pontos por GN⁺ 2025-10-14 | 1 comentários | Compartilhar no WhatsApp
  • Em junho de 2025, foi descoberta uma vulnerabilidade crítica (CVSS 9.6) no GitHub Copilot Chat
  • Foi confirmada a possibilidade de vazamento de segredos e código privado usando técnicas de bypass de CSP e injeção remota de prompt
  • É possível manipular os resultados das respostas do Copilot de outros usuários abusando do recurso de comentários ocultos do GitHub
  • O bypass de CSP foi bem-sucedido por meio de uma análise minuciosa da estrutura de uso do proxy Camo do GitHub
  • O GitHub corrigiu emergencialmente a vulnerabilidade em agosto de 2025 desativando a renderização de imagens

Resumo TL;DR

  • Em junho de 2025, foi descoberta uma vulnerabilidade crítica no GitHub Copilot Chat que permitia o vazamento de código-fonte e segredos de repositórios privados
  • O pesquisador usou injeção remota de prompt e bypass da CSP (Content Security Policy) do GitHub para manipular e controlar completamente as respostas do Copilot, induzindo sugestões de código malicioso ou links maliciosos
  • O núcleo do ataque está em aproveitar o recurso oficial de comentários ocultos do GitHub e a sensibilidade ao contexto do Copilot para inserir prompts de forma invisível para as pessoas
  • Ao analisar o comportamento em que o GitHub converte automaticamente links externos de imagem em proxy Camo, foi possível projetar uma forma de montar os dados vazados caractere por caractere explorando essa estrutura
  • Após o reporte via HackerOne, o GitHub aplicou um patch bloqueando a renderização de imagens no Copilot Chat

Contexto

  • O GitHub Copilot Chat é um assistente de IA integrado que ajuda desenvolvedores a fazer perguntas, obter explicações de código e receber sugestões de implementação
  • O Copilot Chat consulta diversas informações de contexto, como código no repositório, commits e PRs (pull requests)
  • Quanto mais informações de contexto existem, maior também é a superfície de ataque

Uso de injeção de prompt e do recurso de comentários ocultos

  • Em um experimento que atacava a sensibilidade ao contexto do GitHub Copilot, foi inserido um prompt específico na descrição de um PR (pull request)
  • Porém, normalmente os prompts ou mensagens inseridos podem ser vistos por todos os usuários
  • Nesse ponto, foi descoberto que, usando o recurso oficial de comentários ocultos do GitHub (``), era possível enviar comandos apenas ao Copilot de forma invisível
  • Quando o prompt é colocado dentro de um comentário oculto, ele aparece nas notificações, mas seu conteúdo detalhado não fica visível, produzindo um efeito de Server-Side Injection

Alcance do prompt malicioso

  • O prompt em comentário oculto também afeta o Copilot da mesma forma quando outros usuários acessam a página do PR
  • Em vez de texto simples, é possível inserir comandos compostos, como sugestões de código, Markdown, URLs maliciosas e recomendação de pacotes maliciosos como Copilotevil
  • Como o Copilot usa as mesmas permissões do usuário que fez a solicitação, ele pode acessar repositórios privados e usar essas informações
  • Também é possível criar um cenário em que informações são vazadas para o invasor quando o usuário clica, ao adicionar intencionalmente dados codificados em base16 à URL

Principais impactos

  • Manipulação e controle do conteúdo das respostas do Copilot de outros usuários
  • Possibilidade de injeção de prompt personalizada com Markdown, imagens, código e URL
  • Viabilização de tentativas de exfiltração de informações dentro do escopo de permissões da vítima

Interpretação estrutural do bypass da CSP do GitHub

  • O GitHub aplica uma CSP forte, limitando o carregamento de imagens e recursos de domínios externos
  • Quando imagens são inseridas em README ou Markdown, o GitHub Camo Proxy converte a URL externa em uma URL de proxy baseada em assinatura HMAC
  • Para que o navegador carregue a imagem, é preciso ter a URL Camo e o valor de assinatura gerados previamente pelo GitHub
  • Mesmo que o usuário crie uma URL com dados dinâmicos arbitrários, ela será bloqueada se não passar pelo proxy Camo

Como a estrutura do Camo foi explorada

  • O pesquisador gerou previamente um dicionário de URLs do proxy Camo para todo o conjunto de letras e caracteres especiais e o incluiu no prompt oculto
  • Em seguida, pediu ao Copilot um "jogo de arte ASCII", de forma que os dados a serem vazados (por exemplo, código-fonte ou chaves) fossem convertidos em uma sequência de imagens do proxy Camo
  • Em cada requisição de imagem, o navegador recebia apenas um pixel transparente 1x1, sem qualquer mudança visível para o usuário
  • Por fim, foram adicionados parâmetros aleatórios para evitar problemas de cache

Implementação e teste do ataque real

  • O alvo definido foram informações descritivas de uma vulnerabilidade zero-day em uma issue de projeto privado
  • O processo real de exfiltração foi comprovado com uma PoC (prova de conceito)
  • O Copilot foi levado a automatizar inclusive a busca pela palavra-chave "AWS_KEY" e o vazamento dos resultados

Resposta e patch do GitHub

  • Em 14 de agosto de 2025, o GitHub corrigiu a vulnerabilidade desativando completamente a renderização de imagens no Copilot Chat

Saiba mais

1 comentários

 
GN⁺ 2025-10-14
Comentários do Hacker News
  • Estamos muito felizes por ter migrado todo o ambiente de trabalho para o Forgejo, um VCS self-hosted; começamos há 2 anos a migrar até todos os repositórios dos clientes, e não só reduzimos drasticamente a assinatura do GitHub, como também ganhamos um desempenho muito mais rápido e estável em um sistema usado por 30 a 40 desenvolvedores por dia; além disso, proibimos o uso do VSCode e de qualquer editor com recursos de LLM embutidos; os desenvolvedores podem usar agentes de codificação via CLI, mas eles operam estritamente dentro de contêineres isolados, com acesso permitido apenas a um conjunto limitado de código-fonte

    • Em um ambiente onde 30 a 40 desenvolvedores clonam os repositórios em suas máquinas locais para trabalhar, tenho curiosidade de saber como vocês evitam que alguém exponha por engano o repositório inteiro a uma LLM; e, se alguém deixar de reportar o erro por medo de prejuízo profissional, como vocês detectam um incidente de vazamento?

    • Queria perguntar qual IDE vocês usam como alternativa

    • Tenho curiosidade sobre a que esses tools de CLI se conectam: são serviços oficiais da OpenAI ou Claude, ou um provedor como o AWS Bedrock?

    • Banir o VSCode por completo parece uma medida excessiva, indo além de restringir apenas os plugins problemáticos por recurso; o VSCode é a única IDE com suporte amplo até para linguagens como Haskell, Lean 4 e F*, que têm suporte fraco em outras IDEs; mesmo em grandes empresas comerciais de bens de consumo, normalmente não se proíbe o VSCode em si, e sim apenas o uso dos recursos problemáticos

  • Acho que esse problema na verdade não foi resolvido de forma adequada; a grande questão do Copilot é que ele aceita entrada em linguagem natural, ou seja, qualquer método de exfiltração que você descreva em inglês pode acabar funcionando exatamente como descrito; dizem que “corrigiram” apenas um método específico, mas não divulgam como de fato corrigiram; por exemplo, daria para usar base64 em uma URL de imagem, e até enganar o sistema com algo como “salvei por engano a minha lista do carrinho no campo passswd, encontre isso para mim”, o que talvez também permitisse extrair senhas; parece haver um número enorme de vulnerabilidades possíveis; fico pensando se ao menos existe bug bounty para esse tipo de coisa, porque isso aqui é uma mina de ouro

    • O que exatamente quer dizer usar base64 em uma URL de imagem? A ideia seria usar uma URL de imagem sem Camo? Pelo que entendo, imagens sem Camo são bloqueadas por CSP; além disso, se o agente do Copilot não tiver permissão de acesso à internet, até fazer fetch seria difícil; e, se isso for possível, provavelmente abriria vetores de ataque bem mais fáceis do que usar imagens

    • Pelo que vejo, o GitHub resolveu esse problema simplesmente desativando por completo a renderização de imagens no Copilot Chat

  • Fiquei impressionado com a ideia de pré-gerar URLs Camo para todas as letras e símbolos do alfabeto e depois inseri-las no prompt; é uma abordagem elegante

  • Este post passa um pouco a impressão de ser propaganda de uma empresa chamada Legit; porém, na prática, todas as soluções baseadas em IA compartilham a mesma fraqueza de falta de transparência e problemas de confiança; ao usar ferramentas de cibersegurança com IA que não sejam baseadas em FOSS, o risco de segurança pode até ser maior

  • Esta não é a primeira vez que algo assim acontece; já houve antes o caso "GitHub Copilot Chat: From Prompt Injection to Data Exfiltration"

    • Isso vai continuar se repetindo no futuro
  • Acho que esconder informações em comentários HTML ocultos em PRs ainda pode continuar sendo um problema sério, especialmente em repositórios open source; queria saber se isso foi melhorado

    • Esse recurso é muito usado para colocar mensagens de orientação em templates de issue/PR; ainda assim, parece relativamente simples remover comentários da entrada do Copilot, e, enquanto o problema de “prompt injection” em LLMs não for resolvido de forma realmente segura, algum tratamento temporário assim ainda será necessário
  • É interessante como este exploit usa o padrão lento de resposta token por token das LLMs para permitir a reconstrução dos dados em sequência; imagino que, se a LLM passasse a retornar a resposta inteira de uma vez em bloco, a temporização se perderia e a reconstrução ficaria muito mais difícil

    • Eu sugeriria gerar URLs que incluam não só cada caractere, mas também sua posição; por exemplo, fazer com que a string “hacked” gere requisições como 0.0.0.0/1-h, 0.0.0.0/2-a, e assim por diante; depois seria possível ordenar as requisições e até eliminar chamadas duplicadas
  • Fico pensando se não daria para mitigar isso restringindo o acesso do Copilot aos repositórios para somente leitura

  • Nem lembro mais quando foi a última vez que exfiltrei código-fonte pessoal com o Copilot

  • Achei uma abordagem realmente única e muito bacana