
# Schreibgeschützter Scanner für Git-Einstellungen Schreibgeschützter Scanner für Git-Einstellungen, die es einem Repository ermöglichen, Code in Coding-Agenten (Claude Code, Codex, Cursor, Copilot) auszuführen. Deckt die GitSpawn-Klasse und CVE-2026-45033 ab. Keine Abhängigkeiten, kein Netzwerk, keine Telemetrie.
Ein Repository, das dafür sorgen kann, dass Ihr Coding-Agent Code ausführt, sobald er den Ordner öffnet. GuardSkill prüft das, bevor Sie es tun.
npx guardskill .
Nur lesend. Keine Netzwerkaufrufe, keine Telemetrie, keine Konfiguration, kein Konto. Es liest die Git-Konfiguration und Hook-Skripte, gibt aus, was es gefunden hat, und beendet sich.
Coding-Agenten sammeln Kontext, indem sie gewöhnliche Git-Befehle ausführen — git status, git diff — sobald sie ein Projekt öffnen. Git liest seine Einstellungen aus der eigenen .git/config des Repositorys, und mehrere dieser Einstellungen benennen ein Programm, das Git ausführen soll. Setzen Sie einen Befehl in core.fsmonitor ein, und er wird mit Ihren Rechten, außerhalb jeder Sandbox, ausgeführt, bevor Sie irgendetwas eingegeben haben.
Zwei öffentliche Forschungsarbeiten machen das konkret:
.git/config.git-Verzeichnis ankommen@github/copilot 1.0.43 durch Erzwingen von safe.bareRepository=explicit. (GitHub Advisory)Die in beiden Beiträgen empfohlene Abhilfe auf Nutzerseite ist dieselbe: Prüfen Sie die Git-Konfiguration, bevor Sie das Verzeichnis mit einem Agenten öffnen. Das ist von Hand über einen Baum hinweg mühsam. Dieses Tool erledigt es in einer Sekunde.
GuardSkill durchläuft den Baum und findet jede Git-Konfiguration, die ein Agent aufgreifen könnte: das eigene .git des Projekts, jedes verschachtelte .git, das als Inhalt angekommen ist, jedes in einem Unterverzeichnis versteckte Bare-Repository, die .git-Datei, die ein Submodul oder verknüpftes Worktree hinterlässt, sowie die Konfigurationen, die Git neben der Hauptkonfiguration aufbewahrt — config.worktree und jede .git/modules/<name>/config. Jede davon wird untersucht.
| Klasse | Prüfungen |
|---|---|
| Direkte Ausführungsschlüssel | core.fsmonitor, core.sshCommand, core.gitProxy, core.pager, core.editor, sequence.editor, diff.external, uploadpack.packObjectsHook |
| Indirekte Ausführungsschlüssel | filter.*.clean / .smudge / .process, diff.*.textconv, merge.*.driver, mergetool.*.cmd, difftool.*.cmd, credential.helper |
| Shell-Aliase | jedes alias.*, dessen Wert mit ! beginnt |
| Von anderswo geladene Konfiguration | include.path, includeIf.*.path |
| Hooks | core.hooksPath-Überschreibungen, aktive (Nicht-.sample)-Skripte in .git/hooks sowie Hook-Skripte, die einen Download in eine Shell leiten oder vor der Ausführung Base64 dekodieren |
| Transporte | protocol.allow und protocol.<name>.allow, die auf always zurückgesetzt wurden, sowie jede Remote- oder Submodul-URL, die den ext::-Transport verwendet, der den Rest der Zeile an eine Shell übergibt |
| Struktur | Bare-Repositories innerhalb des Baums (der CVE-2026-45033-Vektor), verschachtelte .git-Verzeichnisse, die keine registrierten Submodule sind, .git-Dateien, die auf ein Git-Verzeichnis innerhalb des Baums zeigen |
npx guardskill . # aktuelles Projekt scannen
npx guardskill ~/code/some-project # einen bestimmten Pfad scannen
npx guardskill . --json # maschinenlesbar
npx guardskill . --out report.md # zusätzlich einen Markdown-Bericht schreiben
npx guardskill . --fail-on critical # Build nur bei kritischen Befunden fehlschlagen lassen
npx guardskill . --exclude test/fixtures # ein Verzeichnis überspringen
Exit-Codes: 0 nichts auf oder über der Schwelle, 1 Befunde auf oder über der Schwelle (Standard-Schwelle: high), 2 der Scan selbst ist fehlgeschlagen.
In CI:
- name: Check for git execution vectors
run: npx guardskill . --fail-on high
Beispielausgabe:
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.
Ein Sicherheitstool, das ständig falschen Alarm schlägt, wird deinstalliert. Die Suite läuft gegen 29 realistische, saubere Repositories — git-lfs, git-crypt, husky, die .githooks-Konvention, registrierte Submodule, Credential-Helper, benutzerdefinierte Editoren und Pager, Signierungskonfiguration — und der Build schlägt fehl, wenn eines davon einen Befund über der informativen Stufe erzeugt. Sie läuft gegen 22 Repositories, die um ein bekanntes Angriffsmuster herum aufgebaut sind, und schlägt fehl, wenn eines übersehen oder von der falschen Regel erfasst wird.
Darüber hinaus gibt es eine Evasion-Suite: Jeder Fall darin wurde gefunden, indem eine Version von GuardSkill angegriffen wurde, die ihre eigenen Tests bereits bestanden hatte, und sie läuft bei jedem Commit, damit eine zukünftige Änderung nicht stillschweigend einen davon wieder öffnet. Sie deckt denselben Schlüssel ab, der auf jede Art geschrieben ist, die Git noch akzeptiert (Groß-/Kleinschreibung, Anführungszeichen, Zeilenfortsetzungen, CRLF, ein Byte-Order-Mark, ein Schlüssel in der Abschnittszeile), Payloads, die nach vertrauten Tools benannt sind, Hook-Verzeichnisse namens .husky, um routinemäßig auszusehen, und Konfigurationen, die dort versteckt sind, wo die erste Version nie gesucht hat. Eine Robustheits-Suite füttert sie mit binären, leeren, abgeschnittenen und 200.000 Zeilen langen Konfigurationen, nicht lesbaren Verzeichnissen, Symlink-Schleifen und Zeigern, die aus dem Baum herausführen, und verlangt einen Bericht statt eines Stack-Traces.
Zwei bewusste Designentscheidungen:
.githooks-Verzeichnis werden als informativ (low) gemeldet und nicht als Risiko — aber GuardSkill liest die Skripte trotzdem und stuft auf critical hoch, wenn eines davon Code abruft oder dekodiert, bevor es ihn ausführt.include / includeIf wird immer gemeldet. Ein Include kann später jeden Schlüssel auf dieser Liste einführen, was genau die Art ist, wie man einen verstecken würde. Eine gemeinsam genutzte ~/.gitconfig, die Sie selbst geschrieben haben, ist ein normaler Befund, den man verwerfen kann..husky, das npm test ausführt, ist informativ, und der Befund listet auf, was ausgeführt wird. Dasselbe Verzeichnis, das etwas aus /tmp ausführt, ist es nicht.Es ändert niemals etwas. Es führt nichts aus, was es findet. Es tätigt keine Netzwerkaufrufe und sammelt keine Telemetrie — führen Sie es offline aus, und es verhält sich identisch. Es scannt noch keine npm-Abhängigkeiten, .claude/settings.json, .vscode/tasks.json oder MCP-Serverdefinitionen; das ist die nächste Klasse, nicht diese. Und es ist ein Signal, kein Urteil: Lesen Sie den Befund, sehen Sie sich die Beweise an, entscheiden Sie selbst.
SKILL.md in diesem Repository ermöglicht es einem Coding-Agenten, den Scan selbst auszuführen, bevor er ein unbekanntes Projekt öffnet. Kopieren Sie das Verzeichnis in Ihren Skills-Ordner oder weisen Sie Ihren Agenten auf das Repository hin.
npm test # regeneriert die Fixtures und führt dann die Suite aus
Fixtures werden von Code generiert (test/fixtures/generate.js), nicht von Hand committet, sodass die Erweiterung des sauberen oder verwundbaren Satzes nur wenige Zeilen umfasst. Neue Erkennungsregeln kommen in rules/git-exec-keys.json — eine Regel ohne Fixture auf beiden Seiten wird nicht gemergt.
Kontinuierliche Überwachung, Slack/Teams-Benachrichtigungen und Auto-Fix-Pull-Requests sind als kostenpflichtige Ebene geplant. Der Scanner selbst bleibt kostenlos und MIT-lizenziert. Erkennungsregeln bleiben im offenen Repository — ein Sicherheitstool, dessen Regeln Sie nicht lesen können, ist keins, dem Sie vertrauen sollten.
MIT. Entwickelt und gepflegt von Helios IT Solutions, einem niederländischen IT-Dienstleister. Sicherheitsprobleme: siehe SECURITY.md.