- A Noma Labs descobriu o GitLost, uma vulnerabilidade de injeção indireta de prompt nos GitHub Agentic Workflows, que permitia expor dados de repositórios privados da mesma organização em comentários públicos usando apenas uma issue em um repositório público
- O recurso compila workflows em Markdown para arquivos YAML do Actions, e sua estrutura faz com que um agente de IA baseado no Claude ou no GitHub Copilot leia issues, chame ferramentas e acesse repositórios dentro da organização
- O workflow vulnerável lia o Title e o Body da issue no evento
issues.assignede respondia comadd-comment, tendo permissões de leitura para repositórios públicos e privados - O atacante só precisava abrir uma issue plausível em um repositório público, sem código, permissões de acesso ou credenciais; nos testes, o conteúdo de
README.mddepocetestlocalfoi publicado em comentários de uma issue pública - As guardrails do GitHub não bloquearam como esperado na variação com “Additionally”, e, em IAs agênticas, a própria janela de contexto deve ser vista como superfície de ataque, separando conteúdo controlado pelo usuário de instruções confiáveis
A fronteira de confiança explorada pelo GitLost
- A Noma Labs descobriu uma vulnerabilidade chamada GitLost nos novos Agentic Workflows do GitHub
- Quando um atacante não autenticado publicava uma GitHub Issue manipulada em um repositório público da mesma organização, era possível induzir o agente a buscar dados de repositórios privados dentro da organização
- O método de ataque corresponde a uma injeção indireta de prompt, em que instruções maliciosas ficam ocultas no conteúdo lido pelo agente de IA
- Se as instruções ocultas pelo atacante fossem processadas com prioridade sobre as instruções pretendidas pelo operador, dados privados poderiam ser expostos em comentários de issues públicas visíveis a qualquer pessoa
Como funcionam os GitHub Agentic Workflows
- Os GitHub Agentic Workflows permitem que equipes escrevam automações de repositório em linguagem natural
- O workflow é escrito em um arquivo Markdown
.mde compilado para um arquivo GitHub Actions.ymlem formato YAML - Na execução, um agente de IA baseado no Claude ou no GitHub Copilot trabalha dentro das permissões configuradas
- Ler GitHub Issues
- Chamar ferramentas
- Acessar outros repositórios dentro da organização
Condições do workflow vulnerável
- A configuração vulnerável identificada pela Noma Labs se tornava problemática quando issues públicas eram combinadas com permissões do agente
- Acionamento do workflow pelo evento
issues.assigneddo GitHub - Leitura do Title e do Body da issue
- Publicação de comentário com a ferramenta
add-comment - Permissão de leitura para outros repositórios dentro da organização
- Repositórios públicos
- Repositórios privados
- Acionamento do workflow pelo evento
- O atacante não precisava escrever código, ter permissões de acesso nem possuir credenciais adicionais
- A única condição necessária era abrir uma issue em um repositório público de uma organização que usa GitHub Agentic Workflow
Fluxo do ataque
- Os pesquisadores criaram uma GitHub Issue plausível, parecendo um pedido do VP de Sales após uma reunião com cliente
- Quando a issue foi atribuída, a action do workflow foi acionada; nos testes, o mesmo comportamento ocorreu também em outra GitHub workflow action
- Depois que a automação do GitHub atribuiu a issue, o workflow executado pelo evento fez o agente buscar o conteúdo dos repositórios
- O agente foi induzido a buscar o conteúdo de
README.mddos seguintes repositórios- Repositório público
poc - Repositório privado
testlocal
- Repositório público
- Em seguida, o agente do GitHub publicou esse conteúdo como comentário na issue do repositório público, deixando-o legível para qualquer pessoa
Contornando guardrails com “Additionally”
- O GitHub tinha guardrails limitadas para impedir esse cenário
- A Noma Labs testou repetidamente diversas variações, como faria um atacante
- Ao adicionar a palavra-chave “Additionally”, ocorreu um comportamento inesperado em que o modelo reestruturou a saída sem recusá-la
- Com esse bypass, as guardrails do GitHub não funcionaram como esperado e não impediram o vazamento de dados
PoC e dados expostos
- A Noma Labs divulgou os resultados verificados, o workflow reproduzível e evidências reais
- Os dados vazados incluíam o conteúdo de
README.mddos seguintes repositóriossasinomalabs/poc: repositório públicosasinomalabs/remote-ping: repositório público, confirmado sem READMEsasinomalabs/testlocal: repositório privado
Premissas de segurança que mudam em IAs agênticas
- A janela de contexto do agente é, ao mesmo tempo, espaço de trabalho e superfície de ataque
- Todo conteúdo lido pelo agente pode ser transformado em arma
- Issues
- Pull Requests
- Comentários
- Arquivos
- Modelos tradicionais de segurança muitas vezes assumem que fronteiras de confiança são impostas por código
- Em sistemas agênticos, parte da fronteira de confiança é imposta pelo comportamento do modelo
- Como o modelo é inerentemente orientado a seguir instruções, a injeção de prompt se torna, para IAs agênticas, uma vulnerabilidade categórica do mesmo tipo que a injeção de SQL foi para aplicações web
- Esse tipo de vulnerabilidade exige estratégias e defesas sistemáticas
Defesas recomendadas e processo de divulgação
- Conteúdo controlado pelo usuário não deve ser tratado como entrada de instruções confiáveis para agentes de IA
- As permissões do agente devem ser limitadas ao menor escopo necessário
- Agentes que podem acessar vários repositórios se tornam alvos de ataque especialmente valiosos
- Deve-se limitar o que o agente pode publicar publicamente, como em respostas a conteúdos de issues
- Antes de passar entradas de usuário ao modelo, elas devem ser sanitizadas ou isoladas do contexto de instruções
- O GitLost foi divulgado de forma responsável ao GitHub, e os detalhes da vulnerabilidade foram compartilhados com ciência do GitHub
1 comentários
Comentários do Hacker News
A analogia de que injeção de prompt ocupa, em IA agentiva, o mesmo lugar que SQL injection ocupava em apps web parece estranha. Dá a impressão de que injeção de prompt é muito mais grave para LLMs do que SQL injection era para SQL
SQL injection surgia porque a entrada do usuário virava parte da string de comando enviada ao mecanismo SQL, e uma entrada maliciosa podia encerrar o comando atual com tokens da sintaxe SQL e anexar seu próprio comando SQL, fazendo o mecanismo executar ambos. A solução foi usar strings de comando fixas, estáticas e pré-compiladas, como prepared statements, e tratar a entrada arbitrária do usuário apenas como dados
Em agentes, uma mitigação parecida seria ter ações fixas como “ler repo 1”, “ler repo 2”, e usar a entrada do usuário apenas como dado para escolher qual ação executar; mas isso é uma técnica que já chamamos de menu. O valor do LLM está justamente em ir além de um menu, enquanto o valor do SQL não precisa ir além de “lógica predefinida aplicada a dados arbitrários”
Permitir apenas ações limitadas ao agente cobre só alguns problemas específicos e também não separa código e dados do usuário, então não é o mesmo problema. Ter só ações limitadas se parece mais com usar permissões mais rígidas no banco de dados. Se só for permitido ao usuário executar SQL que ele já poderia executar de qualquer forma, SQL injection também perde muito do impacto
Fazer o usuário escolher num menu é um caminho, mas a faixa de ações possíveis pode ser projetada de forma mais ampla. Se você der uma ferramenta de e-mail, ela pode enviar spam para clientes; se você travar para permitir apenas respostas, reduz o escopo do dano. Assim como em vulnerabilidades em que dados vazam por renderização de imagem, exfiltração de dados também precisa ser limitada
A solução também é a mesma. Aplique controle de acesso baseado em papéis com privilégio mínimo e exija aprovação de administrador para ações importantes. Aí o pior que o LLM consegue fazer sozinho é gerar alguma saída com palavras inadequadas
Uma mitigação é prepared statements, mas outra é nunca permitir a nenhum usuário acesso total ao banco inteiro. Um usuário somente leitura não deveria conseguir dar
DROP TABLE, independentemente de haver SQL injection ou nãoEste agente tem acesso irrestrito de leitura e não tem conceito de “destinatário” da resposta. Se você incluir as permissões do destinatário, fazer com que o acesso de leitura seja negado automaticamente fica bem simples. Não é a única solução, mas não é difícil imaginar saídas nessa linha
O exemplo do “menu” também significa que nada mudou. Seja um LLM ou um funcionário humano, o que é permitido continua sendo apenas um conjunto controlado e fixo de ações. A liberdade está principalmente na expressão, enquanto a autorização é um conjunto fixo. Não vejo por que precisaria ir além de um menu
Não entendo por que isso seria uma vulnerabilidade do GitHub. Os pesquisadores deram ao agente permissão de acesso a repositórios privados e o fizeram responder perguntas em um repositório público, então obviamente seria possível extrair informações privadas
É o mesmo que criar uma tarefa comum de CI com acesso a segredos e executá-la em um PR público. Se você configura o GitHub para que código público ou instruções para o LLM sejam executados em um contexto com acesso a algo sensível, vai haver vazamento. Isso não é culpa do GitHub, é culpa de quem configurou
Mesmo apertando ao máximo o escopo do token, o acesso a repositórios públicos continua sempre permitido e, por exemplo, permanece um caminho de exfiltração por issues de repositórios públicos. Para fazer isso com segurança, seria preciso complementar com um proxy MITM que implemente controles mais rígidos do que os oferecidos pelo GitHub
Os GitHub Agentic workflows deveriam ser a principal solução oficial para esse tipo de problema, mas ainda parece haver trabalho a fazer, seja no modelo de segurança, seja na usabilidade segura
Mais detalhes: https://haulos.com/blog/do-not-give-your-agent-github-access...
Isso também é compatível com desenvolvimento aberto e permite que pessoas externas abram issues públicas, ao mesmo tempo refletindo o nível de confiança atribuído a cada usuário. Se pensar direito, provavelmente há ainda mais opções
Para isso, é preciso suporte técnico para escopo e permissões bem detalhados, e também investir tempo em avaliar o que se quer alcançar com agentes e quais são as permissões e capacidades mínimas necessárias
O primeiro ponto provavelmente vai chegar. O uso de agentes ainda está em clima de Velho Oeste. É interessante pensar quais abstrações vão reduzir o atrito de o ser humano precisar encontrar e definir escopo e permissões ao projetar agentes, e qual será a interface capaz de equilibrar granularidade e usabilidade ao limitar capacidades de agentes
O segundo ponto sempre foi um dos principais obstáculos à construção de software de alta qualidade. Reservar tempo para pensar direito e implementar direito entra em choque frontal com a abordagem de “agir rápido e quebrar coisas” ao sair jogando agentes em qualquer lugar
Se a resposta para qualquer uma dessas perguntas for “não”, então há um problema. Workflows clássicos do GitHub também estão cheios de elevação de privilégio por meio de workflows disparados por PR, mas isso é outro assunto
A solução real é melhorar a UI de controle de permissões por prompt. Assim como se escolhe “usar busca na web ou não”, deveria ser fácil ligar e desligar uma opção como “incluir meus repositórios privados”
É engraçado ver os pesquisadores burlando as guardrails que o GitHub promovia com uma única palavra como “Additionally”. Isso mostra que tentar erguer uma fronteira de segurança forte dentro da janela de contexto de um LLM está condenado ao fracasso
Como o modelo é feito essencialmente para seguir instruções, quando se misturam regras de sistema com entrada do usuário, a instrução mais recente ou mais insistente tende a vencer
Por que a seção de “divulgação responsável” não diz quando isso foi corrigido, nem se o GitHub reconheceu ou rejeitou o problema? Está escrito que o GitLost foi divulgado de forma responsável ao GitHub e que os detalhes estão sendo compartilhados com o GitHub ciente deles; então isso ainda não foi corrigido?
https://github.github.com/gh-aw/reference/cross-repository/#...
Grandes empresas como a Microsoft, sob pressão de investidores, agora tentam se vender como empresas de IA enfiando IA em todos os produtos. É parecido com o que a Adobe fez
Os consumidores estão ficando cansados dessas integrações de IA meio inacabadas, e parece que em breve isso vai bater no limite
Sério, ao clicar nas coisas aqui e ali, tudo é instantâneo, e o CI com runner conectado também funciona lindamente. A documentação de configuração do runner poderia ser um pouco mais clara, mas fora isso tudo foi extremamente fluido
A receita existe de fato e é impressionante, substituindo receita de consumidores e por assento. O mercado ainda está reduzindo os múltiplos de SaaS, mas acho essa leitura correta. Se você separar a receita nos relatórios trimestrais, há uma grande história de crescimento vinda de eficiência real
Não entendo por que uma action executada no contexto de um repositório público tinha permissão de acesso a repositórios privados. Pelo workflow, parece que estava usando um
github tokenque normalmente não recebe permissões para repositórios privadosOu então o próprio agente tinha, somehow, privilégios mais altos? Se for isso, então o agente foi configurado de forma incorreta. Já sabemos que não dá para confiar que o agente vá impor esse tipo de restrição
Este texto soa como marketing da Noma. Tem nome bonitinho, logo e título caça-cliques, além de um tom dramático que parece mirar leitores não técnicos
A vulnerabilidade real, no fim das contas, é que, se você der dados privados a um LLM e deixar qualquer um interagir com ele, esses dados podem vazar. Isso é óbvio demais
Esse pessoal vai acabar dando ao LLM permissão de escrita no disco inteiro e depois reclamando quando ele fizer algo destrutivo
Se você não quer que um agente de IA leia repositórios privados, basta não dar a ele permissão de acesso a repositórios privados. Isso não é um problema de bypass de permissões, e sim de prompt injection, e não dá para resolver isso de forma confiável na camada do agente
Ou isso já é um problema resolvido, ou o GitHub ainda não conseguiu resolver e, nesse meio-tempo, agentes maliciosos vão tentar explorar vulnerabilidades nos repositórios
Como há muitos repositórios, a chance de haver vazamentos não é zero. Ainda assim, assim como em golpes, quase ninguém vai admitir que teve dados vazados