
Scanner somente leitura para configurações do git que permitem que um repositório execute código em agentes de codificação (Claude Code, Codex, Cursor, Copilot). Abrange a classe GitSpawn e o CVE-2026-45033. Sem dependências, sem rede, sem telemetria.
Um repositório pode fazer seu agente de codificação executar código no momento em que abre a pasta. GuardSkill verifica isso antes de você fazer.
npx guardskill .
Somente leitura. Sem chamadas de rede, sem telemetria, sem configuração, sem conta. Ele lê a configuração do git e os scripts de hook, imprime o que encontrou e encerra.
Agentes de codificação coletam contexto executando comandos git comuns — git status, git diff — assim que abrem um projeto. O Git lê suas configurações do próprio .git/config do repositório, e várias dessas configurações nomeiam um programa para o git executar. Coloque um comando em core.fsmonitor e ele será executado, com seus privilégios, fora de qualquer sandbox, antes que você digite qualquer coisa.
Duas pesquisas públicas tornam isso concreto:
.git/config.git já dentro@github/copilot 1.0.43 ao forçar safe.bareRepository=explicit. (GitHub Advisory)A mitigação recomendada no lado do usuário em ambos os artigos é a mesma: inspecione a configuração do git antes de abrir o diretório com um agente. Isso é tedioso de fazer manualmente em uma árvore. Esta ferramenta faz isso em um segundo.
GuardSkill percorre a árvore e encontra toda configuração git que um agente poderia captar: o .git do próprio projeto, qualquer .git aninhado que chegou como conteúdo, qualquer repositório bare escondido em um subdiretório, o arquivo .git que um submódulo ou worktree vinculado deixa para trás, e as configurações que o git mantém ao lado da principal — config.worktree e cada .git/modules/<nome>/config. Cada uma delas é inspecionada.
| Classe | Verificações |
|---|---|
| Chaves de execução direta | core.fsmonitor, core.sshCommand, core.gitProxy, core.pager, core.editor, sequence.editor, diff.external, uploadpack.packObjectsHook |
| Chaves de execução indireta | filter.*.clean / .smudge / .process, diff.*.textconv, merge.*.driver, mergetool.*.cmd, difftool.*.cmd, credential.helper |
| Aliases de shell | qualquer alias.* cujo valor comece com ! |
| Configuração carregada de outro lugar | include.path, includeIf.*.path |
| Hooks | substituições de core.hooksPath, scripts ativos (não .sample) em .git/hooks, e scripts de hook que canalizam um download para um shell ou decodificam base64 antes de executá-lo |
| Transportes | protocol.allow e protocol.<nome>.allow redefinidos para always, e qualquer URL de remote ou submódulo usando o transporte ext::, que entrega o restante da linha a um shell |
| Estrutura | repositórios bare dentro da árvore (o vetor da CVE-2026-45033), diretórios .git aninhados que não são submódulos registrados, arquivos .git apontando para um diretório git dentro da árvore |
npx guardskill . # verifica o projeto atual
npx guardskill ~/code/algum-projeto # verifica um caminho específico
npx guardskill . --json # legível por máquina
npx guardskill . --out report.md # também grava um relatório Markdown
npx guardskill . --fail-on critical # falha o build apenas em descobertas críticas
npx guardskill . --exclude test/fixtures # pula um diretório
Códigos de saída: 0 nada no limite ou acima dele, 1 descobertas no limite ou acima dele (limite padrão: high), 2 a própria verificação falhou.
Em CI:
- name: Verificar vetores de execução do git
run: npx guardskill . --fail-on high
Exemplo de saída:
GuardSkill - verificação de vetores de execução do git (somente leitura)
Caminho: /Users/dev/projects/projeto-herdado
Configurações git inspecionadas: 2 Diretórios percorridos: 148
[CRITICAL] vendor/payload.git - Repositório git bare encontrado dentro da árvore do projeto
o que O Git descobre repositórios bare ao percorrer diretórios e aplica sua
configuração, incluindo chaves que executam comandos.
encontrado repositório bare em vendor/payload.git
faça Não abra este projeto com um agente de codificação até inspecionar o diretório.
[CRITICAL] vendor/payload.git/config:3 - core.fsmonitor executa um comando externo
encontrado core.fsmonitor = /tmp/.x/run.sh
2 críticas, 0 altas, 0 médias, 0 baixas.
Nada foi alterado - esta verificação apenas lê.
Uma ferramenta de segurança que grita "lobo!" é desinstalada. A suíte é executada contra 29 repositórios limpos e realistas — git-lfs, git-crypt, husky, a convenção .githooks, submódulos registrados, helpers de credenciais, editores e pagers personalizados, configuração de assinatura — e o build falha se qualquer um deles produzir uma descoberta acima do nível informativo. Ela é executada contra 22 repositórios construídos em torno de um padrão de ataque conhecido e falha se algum for perdido, ou for capturado pela regra errada.
Acima disso há uma suíte de evasão: cada caso nela foi encontrado atacando uma versão do GuardSkill que já havia passado em seus próprios testes, e ela é executada em cada commit para que uma mudança futura não possa reabrir silenciosamente um caso. Ela cobre a mesma chave escrita de todas as formas que o git ainda aceita (maiúsculas/minúsculas, aspas, continuações de linha, CRLF, uma marca de ordem de byte, uma chave na linha da seção), payloads nomeados após ferramentas familiares, diretórios de hooks nomeados .husky para parecerem rotineiros, e configurações escondidas onde a primeira versão nunca procurou. Uma suíte de robustez alimenta-a com configurações binárias, vazias, truncadas e de 200.000 linhas, diretórios ilegíveis, loops de symlink e ponteiros direcionados para fora da árvore, e exige um relatório em vez de um stack trace.
Duas escolhas de design deliberadas:
.githooks são relatados como informativos (low) em vez de um risco — mas GuardSkill ainda lê os scripts e eleva para critical se um deles buscar ou decodificar código antes de executá-lo.include / includeIf é sempre relatado. Um include pode introduzir qualquer chave desta lista posteriormente, que é exatamente como você esconderia uma. Um ~/.gitconfig compartilhado que você mesmo escreveu é uma descoberta normal para descartar..husky executando npm test é informativo, e a descoberta lista o que será executado. O mesmo diretório executando algo de /tmp não é.Ela não modifica nada, nunca. Ela não executa nada que encontra. Ela não faz chamadas de rede e não coleta telemetria — execute-a offline e ela se comporta de forma idêntica. Ela ainda não verifica dependências npm, .claude/settings.json, .vscode/tasks.json ou definições de servidor MCP; essas são a próxima classe, não esta. E ela é um sinal, não um veredito: leia a descoberta, olhe a evidência, decida por si mesmo.
SKILL.md neste repositório permite que um agente de codificação execute a verificação por conta própria antes de abrir um projeto desconhecido. Copie o diretório para sua pasta de habilidades, ou aponte seu agente para o repositório.
npm test # regenera os fixtures e depois executa a suíte
Os fixtures são gerados por código (test/fixtures/generate.js), não commitados manualmente, então estender o conjunto limpo ou vulnerável é algumas linhas. Novas regras de detecção vão em rules/git-exec-keys.json — uma regra sem um fixture em ambos os lados não será mesclada.
Monitoramento contínuo, alertas Slack/Teams e pull requests de correção automática estão planejados como uma camada paga. O scanner em si permanece gratuito e licenciado sob MIT. As regras de detecção permanecem no repositório aberto — uma ferramenta de segurança cujas regras você não pode ler não é uma em que você deveria confiar.
MIT. Construída e mantida pela Helios IT Solutions, um provedor holandês de serviços de TI. Problemas de segurança: veja SECURITY.md.