
Scanner in sola lettura per le impostazioni git che consentono a un repository di eseguire codice negli agenti di codifica (Claude Code, Codex, Cursor, Copilot). Copre la classe GitSpawn e la CVE-2026-45033. Nessuna dipendenza, nessuna rete, nessuna telemetria.
Un repository che può far eseguire codice al tuo agente di coding nel momento in cui apre la cartella. GuardSkill lo verifica prima che tu lo faccia.
npx guardskill .
Sola lettura. Nessuna chiamata di rete, nessuna telemetria, nessuna configurazione, nessun account. Legge la configurazione git e gli script hook, stampa ciò che trova ed esce.
Gli agenti di coding raccolgono contesto eseguendo comandi git ordinari — git status, git diff — non appena aprono un progetto. Git legge le sue impostazioni dal .git/config del repository stesso, e diverse di queste impostazioni indicano un programma che git deve eseguire. Metti un comando in core.fsmonitor e viene eseguito, con i tuoi privilegi, fuori da qualsiasi sandbox, prima che tu abbia digitato qualsiasi cosa.
Due ricerche pubbliche rendono tutto ciò concreto:
.git/config.git già al suo interno@github/copilot 1.0.43 forzando safe.bareRepository=explicit. (GitHub Advisory)La mitigazione consigliata lato utente in entrambi i documenti è la stessa: ispeziona la configurazione git prima di aprire la directory con un agente. È un'operazione noiosa da fare manualmente su un intero albero. Questo strumento la fa in un secondo.
GuardSkill attraversa l'albero e trova ogni configurazione git che un agente potrebbe intercettare: il .git del progetto stesso, qualsiasi .git annidato arrivato come contenuto, qualsiasi bare repository nascosto in una sottodirectory, il file .git che un sottomodulo o una worktree collegata lascia dietro di sé, e le configurazioni che git conserva accanto a quella principale — config.worktree e ogni .git/modules/<nome>/config. Ognuna di esse viene ispezionata.
| Classe | Controlli |
|---|---|
| Chiavi di esecuzione diretta | core.fsmonitor, core.sshCommand, core.gitProxy, core.pager, core.editor, sequence.editor, diff.external, uploadpack.packObjectsHook |
| Chiavi di esecuzione indiretta | filter.*.clean / .smudge / .process, diff.*.textconv, merge.*.driver, mergetool.*.cmd, difftool.*.cmd, credential.helper |
| Alias di shell | qualsiasi alias.* il cui valore inizia con ! |
| Configurazione caricata da altrove | include.path, includeIf.*.path |
| Hook | override di core.hooksPath, script attivi (non .sample) in .git/hooks, e script hook che convogliano un download in una shell o decodificano base64 prima di eseguirlo |
| Trasporti | protocol.allow e protocol.<nome>.allow reimpostati su always, e qualsiasi URL remoto o di sottomodulo che usa il trasporto ext::, che passa il resto della riga a una shell |
| Struttura | bare repository all'interno dell'albero (il vettore di CVE-2026-45033), directory .git annidate che non sono sottomoduli registrati, file .git che puntano a una directory git all'interno dell'albero |
npx guardskill . # scansiona il progetto corrente
npx guardskill ~/code/some-project # scansiona un percorso specifico
npx guardskill . --json # leggibile da macchina
npx guardskill . --out report.md # scrive anche un report Markdown
npx guardskill . --fail-on critical # fallisce la build solo su risultati critici
npx guardskill . --exclude test/fixtures # salta una directory
Codici di uscita: 0 nessun risultato pari o superiore alla soglia, 1 risultati pari o superiori alla soglia (soglia predefinita: high), 2 la scansione stessa è fallita.
In CI:
- name: Check for git execution vectors
run: npx guardskill . --fail-on high
Esempio di output:
GuardSkill - git execution-vector scan (read-only)
Path: /Users/dev/projects/inherited-project
Git configurations inspected: 2 Directories walked: 148
[CRITICAL] vendor/payload.git - Bare git repository found inside the project tree
what Git discovers bare repositories while walking directories and applies their
configuration, including keys that execute commands.
found bare repository at vendor/payload.git
do Do not open this project with a coding agent until you have inspected the directory.
[CRITICAL] vendor/payload.git/config:3 - core.fsmonitor runs an external command
found core.fsmonitor = /tmp/.x/run.sh
2 critical, 0 high, 0 medium, 0 low.
Nothing was changed - this scan only reads.
Uno strumento di sicurezza che grida al lupo viene disinstallato. La suite viene eseguita su 29 repository puliti realistici — git-lfs, git-crypt, husky, la convenzione .githooks, sottomoduli registrati, credential helper, editor e pager personalizzati, configurazione di firma — e la build fallisce se uno di essi produce un risultato superiore al livello informativo. Viene eseguita su 22 repository costruiti attorno a un pattern di attacco noto e fallisce se uno viene mancato o viene intercettato dalla regola sbagliata.
In aggiunta c'è una suite di evasione: ogni caso in essa è stato trovato attaccando una versione di GuardSkill che aveva già superato i propri test, e viene eseguita a ogni commit così un futuro cambiamento non può riaprire silenziosamente una falla. Copre la stessa chiave scritta in ogni modo che git accetta ancora (maiuscole/minuscole, virgolette, continuazioni di riga, CRLF, un byte-order mark, una chiave sulla riga della sezione), payload con nomi di strumenti familiari, directory hook chiamate .husky per sembrare di routine, e configurazioni nascoste dove la prima versione non ha mai guardato. Una suite di robustezza le fornisce configurazioni binarie, vuote, troncate e da 200.000 righe, directory illeggibili, loop di symlink e puntatori diretti fuori dall'albero, e richiede un report piuttosto che una stack trace.
Due scelte progettuali deliberate:
.githooks vengono riportati come informativi (low) piuttosto che come rischio — ma GuardSkill legge comunque gli script e alza a critical se uno di essi scarica o decodifica codice prima di eseguirlo.include / includeIf viene sempre segnalato. Un include può introdurre in seguito qualsiasi chiave di questa lista, che è esattamente il modo in cui la nasconderesti. Un ~/.gitconfig condiviso scritto da te è un risultato normale da ignorare..husky che esegue npm test è informativo, e il risultato elenca cosa verrà eseguito. La stessa directory che esegue qualcosa da /tmp non lo è.Non modifica nulla, mai. Non esegue nulla di ciò che trova. Non effettua chiamate di rete e non raccoglie telemetria — eseguilo offline e si comporta in modo identico. Non scansiona ancora le dipendenze npm, .claude/settings.json, .vscode/tasks.json o le definizioni dei server MCP; quelle sono la classe successiva, non questa. Ed è un segnale, non un verdetto: leggi il risultato, guarda le prove, decidi tu.
SKILL.md in questo repository permette a un agente di coding di eseguire la scansione da solo prima di aprire un progetto sconosciuto. Copia la directory nella tua cartella delle skill, oppure punta il tuo agente al repository.
npm test # rigenera i fixture, poi esegue la suite
I fixture vengono generati dal codice (test/fixtures/generate.js), non committati a mano, quindi estendere il set pulito o vulnerabile richiede poche righe. Le nuove regole di rilevamento vanno in rules/git-exec-keys.json — una regola senza un fixture su entrambi i lati non verrà unita.
Il monitoraggio continuo, gli avvisi Slack/Teams e le pull request di auto-correzione sono previsti come livello a pagamento. Lo scanner stesso rimane gratuito e con licenza MIT. Le regole di rilevamento restano nel repository aperto — uno strumento di sicurezza le cui regole non puoi leggere non è uno di cui dovresti fidarti.
MIT. Creato e mantenuto da Helios IT Solutions, un fornitore di servizi IT olandese. Problemi di sicurezza: vedi SECURITY.md.