Cibersegurança
Copilot Autofix abriu uma injeção de shell no pipeline CI/CD da Snowflake

Uma correção de segurança escrita pelo Copilot Autofix da GitHub e mesclada em um repositório da Snowflake em 18 de junho de 2026 removeu um padrão de entrada sanitizada e deixou o pipeline CI/CD da empresa vulnerável a injeção de comandos, e cinco dias depois, um agente autônomo de pesquisa em IA encontrou a falha, a explorou e extraiu credenciais funcionais do Jira de um runner do GitHub Actions, Wiz Research divulgou em 17 de agosto de 2026.
A vulnerabilidade estava em jira_issue.yml, um workflow do GitHub Actions em snowflakedb/snowflake-connector-net, o repositório público do conector de dados .NET da Snowflake. O workflow era acionado sempre que alguém abria uma issue no GitHub e interpolava o título da issue (texto totalmente controlado pela pessoa que a criava) diretamente em um script de shell. Como o gatilho era issues: opened, qualquer conta do GitHub na internet poderia acioná‑lo sem autenticação.
O “Red Agent” da Wiz, uma ferramenta autônoma de pesquisa em segurança que opera através do programa de bug bounty da Snowflake no HackerOne, sinalizou o workflow, criou um exploit funcional e exfiltrou um token da API do Jira do ambiente do runner. A Snowflake corrigiu o workflow no mesmo dia em que recebeu o relatório, 23 de junho de 2026, rotacionou a credencial um dia depois e informou à Wiz que seus logs de auditoria não mostraram nenhum outro agente acessando os sistemas expostos durante a janela de cinco dias.
O “Autofix” removeu o sanitizador
O commit que introduziu o padrão injetável chegou através do PR #1218, “SNOW-2069227: Update jira workflows”, mesclado em 18 de junho de 2026. O histórico do pull request mostra um autor humano trabalhando na automação do Jira desde agosto de 2025 — e, a meio do caminho, um commit co‑autorado por Copilot Autofix powered by AI, o bot do GitHub Advanced Security que gera correções sugeridas para alertas de varredura de código.
A sugestão da IA alterou a forma como o workflow tratava o título da issue. O código existente passava o título por uma variável env: e construía sua carga JSON com jq --arg, um padrão que mantém texto não confiável fora do shell. A substituição sugerida descartou isso em favor da expansão direta de string:
“ run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\"/g' | sed "s/'/\'/g") “
A escape sed é executada depois que o mecanismo de templates do GitHub já substituiu o título no script. Uma aspas simples no título rompe o wrapper echo '...', e tudo que vem depois é executado como shell. A própria documentação do GitHub para o Copilot Autofix descreve o recurso como gerar “uma única correção sugerida para um alerta, que você revisa e aplica por conta própria” — a etapa de revisão foi onde esta passou.
O workflow também continha uma condição de proteção que parecia restringir quem poderia acioná‑lo:
“ if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]') “
Em eventos de issue, github.event.pull_request é sempre nulo, portanto a comparação sempre resulta em verdadeiro. Todo usuário do GitHub passou pelo filtro.
Um agente em cada lado do exploit
A primeira tentativa de exfiltração do Red Agent falhou. Sua carga utilizou o caractere de comentário # para absorver o resto da linha injetada, mas o comentário também consumiu o parêntese de fechamento de TITLE=$(...), e o runner retornou um erro de sintaxe do bash em vez de executar. Segundo o relato da Wiz, o agente analisou o erro, reescreveu sua carga para fechar o bloco de shell com ; echo ', e tentou novamente.
A carga funcional, entregue como título da issue, codificou em base64 as variáveis de ambiente JIRA_API_TOKEN, JIRA_USER_EMAIL e JIRA_BASE_URL do runner e as enviou a um listener fora de banda via curl. O retorno chegou de um runner do GitHub Actions hospedado na Azure em poucos segundos.
O token recuperado autenticou como [email protected] contra snowflakecomputing.atlassian.net, com acesso de leitura a todos os projetos de engenharia, conformidade de segurança e rastreamento de bug bounty da Snowflake.
A remediação da Snowflake, mesclada no PR #1402 em 23 de junho de 2026, restaurou a segura variável env: e o padrão de análise jq --arg. O token do Jira foi revogado e rotacionado em 24 de junho de 2026. A Wiz afirmou que excluiu com segurança todos os dados acessados durante seus testes de prova de conceito.
“A Snowflake agradece o relato responsável da Wiz e a colaboração em torno dessas descobertas por meio do nosso programa de divulgação de vulnerabilidades e bug bounty, HackerOne”, disse a empresa em comunicado publicado junto ao relatório da Wiz. “A divulgação foi recebida em 23 de junho de 2026, foi imediatamente investigada e remediada, e nossa investigação não encontrou evidências de acesso não autorizado.”
O que a janela de cinco dias demonstra
A divulgação se insere no meio de um padrão documentado: mudanças assistidas por IA avançando na revisão mais rápido do que as suposições de segurança sobre elas. Os próprios logs de auditoria da Snowflake são o que tornam este incidente legível: eles permitem que a empresa afirme, e a Wiz confirme, que a janela de exposição não resultou em acesso de terceiros. A análise dos logs de auditoria da Snowflake confirmou que nenhuma parte externa acessou o endpoint durante a janela de cinco dias.
A linha do tempo também compacta uma sequência que a indústria tratou como hipotética. Um assistente de codificação removeu um padrão defensivo que havia sido implementado especificamente para impedir injeção de shell, porque o assistente não possuía registro do motivo da existência desse padrão. Um agente ofensivo então encontrou e explorou o resultado em dias, auto‑corrigindo seu exploit com base na saída de erro ao vivo. O lado do exploit operou sem um humano no teclado; no lado da codificação, a IA gerou a alteração, mas um humano aplicou a sugestão e a mesclou — exatamente a etapa de revisão que falhou.
O relatório da Wiz recomenda que pull requests gerados por IA passem pela mesma análise estática que o código humano, que as equipes reduzam a vida útil das credenciais para corresponder à velocidade de descoberta automatizada, e que barreiras impeçam agentes de substituir analisadores estruturados por interpolação direta de strings. A Check Point moveu a inspeção de prompts para tráfego de IA para firewalls corporativos no início deste verão, e a Unite.AI abordou escapes de sandbox de agentes e sistemas agenticos alcançando alvos de produção reais à medida que o lado ofensivo amadurece. O incidente da Snowflake é a mesma história contada de dentro de um pipeline CI: a vulnerabilidade ficou ativa por cinco dias, e a única razão de ser apresentado como estudo de caso em vez de notificação de violação é qual agente chegou primeiro.












