
CVE-2026-45033 PoC para Claude Code, não Github Copilot. Funcionou para Haiku 4.5.
core.fsmonitor (PoC)Prova de conceito para a classe de vulnerabilidade "repositório git bare malicioso → core.fsmonitor → execução de código" (cf. CVE-2026-45033 no GitHub Copilot CLI) reproduzida contra o Claude Code, superando a proteção extra de permissão de bash que o Claude Code adicionou e que o Copilot não tinha.
Resultado: execução de código dentro do sandbox do Claude Code quando o agente executa um comando git em um repositório cujos arquivos foram plantados além da proteção. Payload inerte (grava um timestamp em /tmp/.bench-marker).
O Claude Code pede confirmação antes de qualquer comando bash único que crie arquivos de estrutura git (HEAD/objects/refs/) e execute git:
hooks"Este comando cria arquivos de estrutura de repositório git (HEAD/objects/refs/hooks) e em seguida executa git, o que pode executar hooks/fsmonitor a partir dos arquivos criados."
Dois bypasses:
current/HEAD onde current -> .. A proteção mais antiga resolve caminhos lexicamente e nunca vê HEAD. (Corrigido pela mudança de realpath na versão corrigida.)mkdir/touch/mv/cp); /bin/mkdir, install ou um binário enviado com o repositório são ignorados. (Também funciona na versão corrigida.)De qualquer forma, o diretório do projeto se torna um repositório bare válido cujo core.fsmonitor dispara no próximo git status.
Duas partes:
container/ two Claude Code versions side by side, auto-updater disabled
malicious-repo/ a plausible monorepo that carries the injection
Verificação de sanidade do ambiente (sem agente, prova o mecanismo):
cd malicious-repo
./build.sh
./verify.sh # clones fresh, runs the planted command, asserts fsmonitor fired
Teste ao vivo contra o Claude Code real:
cd container
./build.sh # builds an image with both the vulnerable and patched versions
./run.sh login # one-time sign-in (shared across versions)
./run.sh # drops you in the malicious checkout; run claude and follow the prompt
Consulte malicious-repo/RUNBOOK.md para ver o procedimento ao vivo passo a passo e a diferença esperada entre as duas versões.
$HOME./tmp/.bench-marker, nada mais. Sem rede, sem leitura de arquivos, sem ação destrutiva.