jq${{ github.event.issue.title }}run:Essa diferença foi decisiva. O GitHub expande a expressão antes de o shell executar o comando. Assim, um título malicioso contendo aspas simples poderia encerrar a string prevista e acrescentar comandos escolhidos pelo atacante. A tentativa de higienizar o valor depois, com sed, não conseguia desfazer a interpretação já realizada pelo shell.
O gatilho issues: opened também não tornava o título confiável. Qualquer usuário capaz de abrir uma issue no repositório público podia controlar esse conteúdo. Além disso, uma condição restrita ao evento da issue não impedia a interpolação de dados fornecidos pelo usuário dentro do comando.
O commit creditou “Copilot Autofix powered by AI” como coautor, e a revisão assistida por IA não identificou o problema. No entanto, as evidências disponíveis não determinam se o Copilot gerou a alteração insegura ou se apenas participou da autoria e da revisão de uma mudança feita por uma pessoa. A conclusão mais precisa é que o Copilot esteve associado à alteração e não detectou a injeção — não que a autoria do modelo esteja comprovada.
O Red Agent analisou a organização pública da Snowflake em busca de padrões de risco em pipelines de CI/CD. Ele identificou que o workflow do Jira usava dados não confiáveis dentro de um bloco run: e inferiu que um título de issue especialmente criado poderia resultar na execução arbitrária de comandos no runner hospedado pelo GitHub Actions.
Em 23 de junho — cinco dias após a entrada em produção da mudança vulnerável — o agente abriu uma issue preparada como parte do programa de divulgação de vulnerabilidades da Snowflake no HackerOne. O título escapou da string do shell e fez o workflow enviar as credenciais do Jira para um callback fora de banda controlado pela Wiz para a prova de conceito autorizada.
Portanto, não se tratou de uma invasão clandestina: foi um teste de segurança autorizado. Ainda assim, o risco demonstrado era real. Uma simples issue pública podia alcançar uma etapa do workflow que manipulava credenciais e converter a criação de texto em execução de comandos.
O workflow comprometido tinha acesso à configuração do Jira interno da Snowflake, incluindo a URL do serviço, o e-mail do usuário e um token de API. O token recuperado estava associado a qa@snowflake.net; a Wiz o utilizou para autenticar no portal interno e avaliar a possível exposição.
As reportagens indicaram acesso de leitura a projetos do Jira relacionados a engenharia, conformidade de segurança e atividades de bug bounty. As evidências fornecidas, porém, não estabelecem todo o conjunto de permissões do token nem apresentam um inventário definitivo de todos os registros que poderiam ser alcançados. A conclusão mais segura é que a credencial permitia acessar conteúdo interno sensível do Jira — não que oferecesse acesso irrestrito aos sistemas da Snowflake.
O ativo vulnerável era a automação de CI/CD do repositório. Não foi identificada uma versão distribuída do Snowflake Connector para .NET afetada, porque a falha estava no workflow do GitHub Actions, e não no código de execução do conector.
A Wiz comunicou o problema em 23 de junho. A Snowflake corrigiu o workflow no mesmo dia e rotacionou a credencial do Jira exposta no dia seguinte.
Depois, a empresa revisou os registros de auditoria e concluiu que a Wiz foi a única agente durante a janela de exposição. A Wiz também afirmou ter excluído com segurança os dados obtidos na prova de conceito.
Não foi reportado acesso não autorizado por terceiros, não houve atribuição de um CVE e nenhuma versão afetada do conector foi identificada. Esses limites definem o impacto confirmado do caso, mas não tornam seguro o desenho original: um título de issue público jamais deveria ter sido transformado em parte de um comando de shell em um workflow que lidava com credenciais internas.
A principal lição vai além da Snowflake e do Copilot. Títulos de issues e pull requests, nomes de branches, comentários e outros valores vindos de expressões do GitHub devem ser tratados como entrada hostil sempre que chegarem a um comando de shell.
Práticas mais seguras incluem:
run:.jq, para montar JSON, evitando a composição de strings de shell.O episódio resume um risco emergente: um sistema de programação assistida por IA pode não perceber uma alteração perigosa em CI/CD, enquanto um agente autônomo de segurança ofensiva consegue encontrá-la e validá-la em poucos dias. A automação pode acelerar tanto a correção quanto a exploração — mas não substitui uma revisão independente.
jq${{ github.event.issue.title }}run:Essa diferença foi decisiva. O GitHub expande a expressão antes de o shell executar o comando. Assim, um título malicioso contendo aspas simples poderia encerrar a string prevista e acrescentar comandos escolhidos pelo atacante. A tentativa de higienizar o valor depois, com sed, não conseguia desfazer a interpretação já realizada pelo shell.
O gatilho issues: opened também não tornava o título confiável. Qualquer usuário capaz de abrir uma issue no repositório público podia controlar esse conteúdo. Além disso, uma condição restrita ao evento da issue não impedia a interpolação de dados fornecidos pelo usuário dentro do comando.
O commit creditou “Copilot Autofix powered by AI” como coautor, e a revisão assistida por IA não identificou o problema. No entanto, as evidências disponíveis não determinam se o Copilot gerou a alteração insegura ou se apenas participou da autoria e da revisão de uma mudança feita por uma pessoa. A conclusão mais precisa é que o Copilot esteve associado à alteração e não detectou a injeção — não que a autoria do modelo esteja comprovada.
O Red Agent analisou a organização pública da Snowflake em busca de padrões de risco em pipelines de CI/CD. Ele identificou que o workflow do Jira usava dados não confiáveis dentro de um bloco run: e inferiu que um título de issue especialmente criado poderia resultar na execução arbitrária de comandos no runner hospedado pelo GitHub Actions.
Em 23 de junho — cinco dias após a entrada em produção da mudança vulnerável — o agente abriu uma issue preparada como parte do programa de divulgação de vulnerabilidades da Snowflake no HackerOne. O título escapou da string do shell e fez o workflow enviar as credenciais do Jira para um callback fora de banda controlado pela Wiz para a prova de conceito autorizada.
Portanto, não se tratou de uma invasão clandestina: foi um teste de segurança autorizado. Ainda assim, o risco demonstrado era real. Uma simples issue pública podia alcançar uma etapa do workflow que manipulava credenciais e converter a criação de texto em execução de comandos.
O workflow comprometido tinha acesso à configuração do Jira interno da Snowflake, incluindo a URL do serviço, o e-mail do usuário e um token de API. O token recuperado estava associado a qa@snowflake.net; a Wiz o utilizou para autenticar no portal interno e avaliar a possível exposição.
As reportagens indicaram acesso de leitura a projetos do Jira relacionados a engenharia, conformidade de segurança e atividades de bug bounty. As evidências fornecidas, porém, não estabelecem todo o conjunto de permissões do token nem apresentam um inventário definitivo de todos os registros que poderiam ser alcançados. A conclusão mais segura é que a credencial permitia acessar conteúdo interno sensível do Jira — não que oferecesse acesso irrestrito aos sistemas da Snowflake.
O ativo vulnerável era a automação de CI/CD do repositório. Não foi identificada uma versão distribuída do Snowflake Connector para .NET afetada, porque a falha estava no workflow do GitHub Actions, e não no código de execução do conector.
A Wiz comunicou o problema em 23 de junho. A Snowflake corrigiu o workflow no mesmo dia e rotacionou a credencial do Jira exposta no dia seguinte.
Depois, a empresa revisou os registros de auditoria e concluiu que a Wiz foi a única agente durante a janela de exposição. A Wiz também afirmou ter excluído com segurança os dados obtidos na prova de conceito.
Não foi reportado acesso não autorizado por terceiros, não houve atribuição de um CVE e nenhuma versão afetada do conector foi identificada. Esses limites definem o impacto confirmado do caso, mas não tornam seguro o desenho original: um título de issue público jamais deveria ter sido transformado em parte de um comando de shell em um workflow que lidava com credenciais internas.
A principal lição vai além da Snowflake e do Copilot. Títulos de issues e pull requests, nomes de branches, comentários e outros valores vindos de expressões do GitHub devem ser tratados como entrada hostil sempre que chegarem a um comando de shell.
Práticas mais seguras incluem:
run:.jq, para montar JSON, evitando a composição de strings de shell.O episódio resume um risco emergente: um sistema de programação assistida por IA pode não perceber uma alteração perigosa em CI/CD, enquanto um agente autônomo de segurança ofensiva consegue encontrá-la e validá-la em poucos dias. A automação pode acelerar tanto a correção quanto a exploração — mas não substitui uma revisão independente.