Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
safer-dependencies — Automatisierte Sicherheitsschicht für Abhängigkeiten für KI-Programmierassistenten, die Pakete auf CVEs, Typosquatting, Aufgabe, Versionsalter-Probleme und Hash-Integrität in den Ökosystemen npm, PyPI, RubyGems, Maven, Go und Rust prüft. | Kitploit
Tools/GitHubGitHub/robert-auger/safer-dependencies
SchwachstellenscannerDevSecOpsSecret-ErkennungLieferkettensicherheit
GitHubrobert-auger/safer-dependencies

safer-dependencies

Automatisierte Sicherheitsschicht für Abhängigkeiten für KI-Programmierassistenten, die Pakete auf CVEs, Typosquatting, Aufgabe, Versionsalter-Probleme und Hash-Integrität in den Ökosystemen npm, PyPI, RubyGems, Maven, Go und Rust prüft.

Repository anzeigen
3056vor 9 TagenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Sicherere Abhängigkeiten für Claude Code

Wenn KI-Codierungsassistenten wie Claude Pakete zu Ihrem Projekt hinzufügen, wählen sie oft einfach eine Version, die plausibel klingt – ohne zu prüfen, ob diese bekannte Sicherheitslücken aufweist, ob das Paket noch aktiv gepflegt wird oder ob der Name nur einen Tippfehler von einem bösartigen Nachahmer entfernt ist.

safer-dependencies ist eine Sicherheitsebene für Claude Code: Es sitzt zwischen Claude und Ihren Manifest-Dateien und führt seine Sicherheitsprüfungen automatisch aus: Verwundbare Installationen werden abgelehnt, bevor sie ausgeführt werden, und eine riskante Version, die in ein Manifest geschrieben wurde, wird direkt nach dem Schreiben auf der Festplatte korrigiert. Es erkennt und behebt riskante Abhängigkeiten – CVEs, Typosquats, verwaiste Pakete und Probleme mit dem Versionsalter, plus eine Abkühlphase für brandneue Releases – über npm, PyPI, RubyGems, Maven, Go, Rust und PHP (Composer) hinweg. Siehe CAPABILITIES.md für genau das, was abgedeckt ist und was nicht.

Neu hier? GETTING-STARTED.md führt Sie in etwa fünf Minuten von null zu einer funktionierenden Installation.

Sicherheit & Datenschutz: siehe SECURITY.md (Offenlegung von Schwachstellen), PRIVACY.md (Datenabfluss, keine Telemetrie) und CAPABILITIES.md (was das Tool abwehrt und was nicht).

Lizenz (Quellcode verfügbar – NICHT OSI „Open Source"): Kostenlos nutzbar und modifizierbar für eigene Zwecke, einschließlich gewinnorientierter/unternehmensinterner Nutzung und der Entwicklung von Produkten, die Sie verkaufen. Eine separate kostenpflichtige Lizenz ist erforderlich, um die Software zu monetarisieren – sie zu verkaufen, sie in einem Produkt oder Dienst zu liefern, das verkauft wird, oder ihre Funktionalität Dritten gegen Gebühr anzubieten (einschließlich gehostet/SaaS/API). Weiterverbreitung und Derivate müssen die Lizenz beibehalten und dieses Projekt nennen. Siehe (Abschnitt 4 für die kommerzielle Einschränkung); Anfragen für kommerzielle Lizenzen über .

nur
selbst
LICENSE
github.com/robert-auger

Inhalt

  • Erste Schritte – von null zu installiert in etwa fünf Minuten
  • Was es tut
  • Was es auslöst
  • Was in diesem Repository ist
  • Unterstützte Ökosysteme
  • Installation
    • Konfiguration
    • Ändern der Abkühlphase
  • Warnstufen
  • Wie es funktioniert
    • Normaler Modus (Manuell)
    • Abfangmodus (Automatisch)
    • Vorinstallationsmodus (Bash-Hook)
    • Nachinstallationsmodus (Bash-Hook)
    • Post-Agent-Modus (Agent-Hook-Paar)
  • Prüfprotokoll
  • Anforderungen
  • FAQ

Erste Schritte

GETTING-STARTED.md führt Sie in etwa fünf Minuten von null zu einer funktionierenden Installation – Voraussetzungen, die interaktive Installation und die Verifizierung. Für die vollständige Installationsreferenz (globale/Projekt-/manuelle Installationen, Windows-Besonderheiten, die Berechtigungs-Allowlist, Aktualisierung und Deinstallation) siehe INSTALLATION.md.

Tägliche Nutzung: Sobald die Hooks installiert sind, gibt es nichts auszuführen – safer-dependencies arbeitet automatisch im Hintergrund. Wenn Claude Pakete hinzufügt oder installiert, kennzeichnet es riskante Abhängigkeiten und aktualisiert verwundbare Versionen direkt an Ort und Stelle auf eine sichere Version – und blockiert eine bekannte verwundbare Installation, bevor sie überhaupt ausgeführt wird – sodass unsichere Pakete erkannt und korrigiert werden, ohne dass Sie fragen müssen. Sie können es jederzeit direkt aufrufen: „Ist [email protected] sicher?", „prüfe safer-dependencies Setup" oder „zeige safer-dependencies Statistiken".

Was es tut

Wenn Claude kurz davor ist, ein Paket zu Ihrem Projekt hinzuzufügen, greift safer-dependencies ein und führt 5 Prüfungen durch:

  1. Herkunft – offizielles Registry, Typosquat-Erkennung (npm/PyPI/RubyGems/Maven/crates.io), Paketalter
  2. Versionsalter – wählt die neueste stabile Version aus, die vor 7+ Tagen veröffentlicht wurde (Abkühlfenster)
  3. Schwachstellenscan – OSV-API, mit ökosystemeigenen Tools (npm audit, pip-audit, bundle audit), wenn verfügbar
  4. Hash-Pin-Integrität – für PyPI requirements.txt-Zeilen mit --hash=sha256:...-Pins wird der deklarierte Hash gegen die von PyPI veröffentlichten Hashes validiert; eine Abweichung erzeugt eine WARNUNG
  5. Verwaiste & veraltete Pakete – bekannte verwaiste Pakete (z. B. paperclip, request, pycrypto, github.com/dgrijalva/jwt-go) werden sofort hart blockiert mit einem vorgeschlagenen Ersatz; Pakete ohne stabile Veröffentlichung in 2+ Jahren erhalten eine Hinweis-Warnung STALE:. Hart blockierte Pakete werden aus dem Manifest entfernt und Claude fragt, wie fortgefahren werden soll; nur veraltete Pakete bleiben an Ort und Stelle.

Wenn Probleme gefunden werden, gibt Claude Warnungen aus und kann auf eine sicherere Version zurückgehen. Alle Prüfungen werden in ~/.claude/safer-dependencies-audit-YYYY-MM.log protokolliert (eine Datei pro Kalendermonat).

Was es auslöst

Die Skill wird automatisch ausgelöst, wenn Claude:

Manifest-/Installationsoperationen

  • Ein Paket in package.json, requirements.txt, Gemfile, pom.xml, build.gradle, Cargo.toml, go.mod oder einem anderen unterstützten Manifest hinzufügt oder aktualisiert
  • Ein import, require oder use für ein Paket schreibt, das nicht bereits im Manifest deklariert ist
  • Eine Lock-Datei generiert oder aktualisiert (prüft nur neue/geänderte Einträge)
  • Eine Paketmanager-Installation über Bash ausführt (npm install, bundle install, poetry install, uv sync, go mod tidy, usw.) – Pre-Install prüft die Befehlsargumente, Post-Install prüft die resultierende Lock-Datei
  • Ein Dockerfile oder CI-Workflow schreibt (.github/workflows/*.yml, usw.), das gepinnte Paketmanager-Installationsschritte enthält

Auswahl- & Empfehlungsfragen

  • Bibliotheks-/Framework-Vergleiche: „sollte ich axios oder node-fetch verwenden?", „moment vs dayjs?", „welches ist besser X oder Y?"
  • Empfehlungsanfragen: „Was ist ein guter HTTP-Client für Python?", „empfiehl eine Logging-Bibliothek für Go", „welches Paket verarbeitet CSV in Node?"
  • Versionsauswahl: „Welche Version von Django sollte ich verwenden?", „neuestes stabiles Flask?"

Absichtserklärungen zur Nutzung (vor dem Hinzufügen)

  • „Ich möchte FastAPI dafür verwenden", „Ich denke darüber nach, Celery hinzuzufügen", „wir schauen uns Prisma als ORM an", „lass uns Tailwind verwenden"

Fragen zu Paketgesundheit und Vertrauen

  • „Wird moment.js noch gepflegt?", „ist dieses Gem noch aktiv?", „ist X verwaist?", „ist X EOL?", „kann ich diesem Paket vertrauen?", „wann wurde faker zuletzt aktualisiert?"

Scaffolding-Befehle

  • npx create-react-app, npm create vite@latest, django-admin startproject, rails new, cargo new + cargo add, „ein neues FastAPI-Projekt bootstrappen"

Implizite Paket-Hinzufügungen (Feature-Anfragen, die eine neue Abhängigkeit implizieren)

  • „Redis-Caching zur App hinzufügen", „mit Postgres verbinden", „JWT-Auth hinzufügen", „Code zum Senden von E-Mails schreiben" – wird ausgelöst, wenn kein Paket für diese Fähigkeit bereits im Manifest vorhanden ist

Migration und Portierung

  • „Von requests zu httpx migrieren", „von CRA zu Vite wechseln", „von moment zu date-fns portieren" – prüft das eingehende Paket

Es wird nicht ausgelöst für:

  • Standardbibliotheks-Importe (os, fs, java.util.*, usw.)
  • Bereits deklarierte Abhängigkeiten, die nicht geändert werden
  • Akademische Diskussion darüber, wie ein Paket intern funktioniert („erkläre Reacts Reconciler", „wie funktioniert webpacks Modulauflösung?") – Vergleichs- und Auswahlfragen lösen weiterhin aus
  • Installation von Betriebssystem-Apps, Laufzeiten oder IDE-Erweiterungen (Python selbst, Docker, Homebrew, VS-Code-Erweiterungen)

Was in diesem Repository ist

Dies ist ein Skill + Hook-Bundle, keine einzelne Skill-Datei. Eine vollständige Installation stellt diese Komponenten bereit:

DateiRolle
skills/safer-dependencies.mdDie Skill (SKILL.md nach der Installation). Beschreibt Prüfverfahren und enthält den Verwaltungsmodus für Installation/Statistiken.
skills/safer-dependencies-shim.shPostToolUse:Write/Edit-Hook – prüft Manifest- und Lock-Datei-Schreibvorgänge und korrigiert verwundbare Versionen automatisch an Ort und Stelle (Abfangmodus).
skills/safer-dependencies-pretooluse-bash.shPreToolUse:Bash-Hook – Vorab-OSV-Prüfung von Paketmanager-Installationsbefehlen; lehnt verwundbare konkrete Pins ab, bevor die Installation ausgeführt wird (Vorinstallationsmodus).
skills/safer-dependencies-posttooluse-bash.shPostToolUse:Bash-Hook – Nachprüfung nach Bash-Befehlen; erfasst transitive CVEs in frisch geschriebenen Lock-Dateien, Manifesten, die über sed/jq/Skripte bearbeitet wurden, und der aufgelösten Umgebung von einfachem pip install (Nachinstallationsmodus).
skills/safer-dependencies-pretooluse-agent.sh + skills/safer-dependencies-posttooluse-agent.shPreToolUse:Agent + PostToolUse:Agent-Hook-Paar – schließt die Subagent-Abdeckungslücke. Die Modi 2–4 feuern nur für Tool-Aufrufe der Root-Sitzung, sodass jedes Manifest, das ein Subagent schreibt, diese umgeht. Post-Agent prüft, was der Subagent geschrieben hat, nachdem jeder Agent-Tool-Aufruf zurückkehrt (Post-Agent-Modus).
skills/scripts/Gemeinsame Python-Bibliothek (safedep/) und eigenständige Resolver-Skripte, die von allen Hooks verwendet werden.
skills/scripts/safer_dependencies_manager.pyVerwaltungsmodul für interaktive Installation, Nutzungsstatistiken und Setup-Validierung.

Die Skill-Datei allein reicht nicht aus – ohne Hooks hängt die automatische Auslösung davon ab, dass Claude sich entscheidet, die Skill zu verwenden. Installieren Sie alle fünf Komponenten für vollständige Abdeckung; viele Skills und Slash-Befehle starten intern Subagenten, daher ist das Post-Agent-Paar wichtig, selbst wenn Sie nie explizit einen spawnen. (Siehe FAQ.md für den Grund, warum eine Skill allein keine Abdeckung garantieren kann.)

Unterstützte Ökosysteme

ÖkosystemManifestLock-Datei
npmpackage.jsonpackage-lock.json, yarn.lock, pnpm-lock.yaml
PyPIrequirements.txt, pyproject.toml, Pipfile, setup.py, setup.cfgPipfile.lock, poetry.lock, uv.lock
RubyGemsGemfile, *.gemspecGemfile.lock
Mavenpom.xml, build.gradle, libs.versions.toml--
Gogo.modgo.sum
RustCargo.tomlCargo.lock
PHP (Composer)composer.jsoncomposer.lock

Installation

Neu im Projekt? Beginnen Sie mit GETTING-STARTED.md. Die Kurzversion:```bash git clone https://github.com/robert-auger/safer-dependencies /tmp/safer-dependencies python3 /tmp/safer-dependencies/skills/scripts/safer_dependencies_manager.py interactive_install

root@kitploit:~
Der Installer fragt nach dem Umfang (global vs. Projekt) und welche Hooks aktiviert werden sollen, und schreibt dann `settings.json` für dich — sowohl die Hook-Einträge **als auch** die Berechtigungs-Allowlist, die es den Prüfbefehlen des Skills erlaubt, ohne Genehmigungsaufforderung bei jeder Prüfung ausgeführt zu werden.

Alles andere Installationsbezogene findest du in **[INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md)**, der einzigen Referenz für Installationsmechanik: manuelle Datei-für-Datei-Installationen (global und auf Projektebene), Windows-Besonderheiten, Post-Agent-Hooks, die [Berechtigungs-Allowlist](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist), Überprüfung des Setups, Aktualisierung, Festlegen auf einen Release-Tag und Deinstallation.

Nach der Installation erfolgt die tägliche Verwaltung über natürliche Sprache an Claude — `install safer-dependencies` (erneut ausführen / Hooks ändern), `show safer-dependencies stats`, `check safer-dependencies setup` — oder über das `/safer-dependencies`-Menü. Auch die Aktualisierung erfolgt in der Sitzung: `/safer-dependencies update` wendet den neuesten Release an (`update --check` für einen Probelauf, `update --rollback` zum Rückgängigmachen); siehe [INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#in-session-self-updater-safer-dependencies-update) für das Vertrauensmodell.

> **Plattformhinweis:** macOS, Linux und Windows werden unterstützt. Windows benötigt Git für Windows (stellt bash bereit) und Python 3 im `PATH` — kein WSL erforderlich. Praktische Tests konzentrierten sich bisher auf **macOS und Windows**; die Linux-Unterstützung wird durch die automatisierte CI-Matrix abgedeckt.

### Konfiguration

Nach der Installation sind zwei Dinge konfigurierbar:

- **Berechtigungs-Allowlist** — genehmigt die schreibgeschützten Prüfbefehle des Skills vorab (die exakten `npm audit`- / `bundle audit`-Regeln und die eigenen Resolver-Skripte des Skills), sodass Prüfungen ohne Genehmigungsaufforderung jedes Mal ausgeführt werden; `curl` wird niemals vorab genehmigt, und `npm view` / `pip-audit` sind über das Convenience-Profil optional aktivierbar. Der interaktive Installer schreibt die Kerneinträge für dich; manuelle Installationen fügen den vollständigen Block von Hand hinzu. Vollständiger Block und Begründung: [INSTALLATION.md → Berechtigungs-Allowlist](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist).
- **Sicherheitsrichtlinie** — das Abkühlungsfenster/die Abkühlungsart für das Release-Alter und eine `off`/`warn`/`block`-Stufe pro Prüfung für jeden Prüftyp, bearbeitet mit `/safer-dependencies config` und gespeichert in `~/.config/safer-dependencies/config.toml`. Schema und Stufensemantik: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).

### Ändern des Abkühlungszeitraums

Die Abkühlung (in der Konfiguration **cooloff** genannt) ist das Mindestalter, das ein Release erreichen muss, bevor der Skill es auswählt — Standard **7 Tage**. Um sie zu ändern, frag Claude oder führe den Konfigurationsbefehl direkt aus:```
/safer-dependencies config set cooloff.days 14     # require releases to be 14+ days old
/safer-dependencies config set cooloff.mode block  # gate strength: off | warn | block (default: warn)
/safer-dependencies config unset cooloff.days      # revert to the 7-day default
/safer-dependencies config                         # show effective values and where each comes from

Die gleichen Verben funktionieren auch außerhalb einer Claude-Sitzung:```bash python3 skills/scripts/safer_dependencies_manager.py config set cooloff.days 14

root@kitploit:~
Die Einstellung wird in `~/.config/safer-dependencies/config.toml` gespeichert (Abschnitt `[cooloff]`); die Umgebungsvariablen `SAFE_DEP_COOLOFF_DAYS` und `SAFE_DEP_COOLOFF_MODE` überschreiben die Datei pro Sitzung. Drei Verhaltensweisen sind zu beachten: `mode = "off"` entfernt den Altersfilter vollständig aus der Versionsauswahl; eine CVE-gesteuerte Neuschreibung umgeht die Sperre, sodass ein Sicherheitsfix niemals wegen zu großer Neuheit zurückgehalten wird; und die Sperre gilt für npm, PyPI, RubyGems und crates.io — Maven und Go sind bewusst nicht gesperrt. Vollständige Semantik: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).

## Warnstufen

| Stufe | Bedeutung | Beispiel |
|-------|-----------|----------|
| KRITISCH | Stoppen und Benutzer fragen | Typosquatting erkannt, manipulierte Signatur |
| HOCH | Warnen und fortfahren | Bekannte CVE, Paket jünger als 30 Tage |
| MITTEL | Warnen und fortfahren | Version jünger als 7 Tage, fehlende Signatur |
| NIEDRIG | Warnen und fortfahren | Unsigned Ruby-Gem (erwartet) |

## So funktioniert es

Die Fähigkeit arbeitet in fünf Modi (unten zusammengefasst; die tiefste Design-Begründung befindet sich in `skills/safer-dependencies.md`):

### Normaler Modus (Manuell)

Wenn Claude im Begriff ist, ein `import` zu schreiben, ein Paket zu einem Manifest hinzuzufügen oder eine Lock-Datei zu aktualisieren, läuft die Fähigkeit inline in Ihrer Sitzung:

1. Fragt die Paket-Registry nach stabilen Versionen ab
2. Wählt automatisch die neueste Version aus, die vor 7+ Tagen veröffentlicht wurde (deterministisch — kein LLM-Urteil)
3. Prüft auf bekannte Schwachstellen über Ökosystem-Tools und die OSV-API
4. Verifiziert Paketsignaturen, wo verfügbar
5. Gibt Warnungen aus, wenn Probleme gefunden werden, pinnt die exakte Version
6. Protokolliert das Ergebnis im Audit-Trail

Die Versionsauswahl wird von eigenständigen Python-Skripten übernommen, die mit der Fähigkeit gebündelt sind, nicht vom LLM, das Regeln interpretiert. Der Befehl gibt `SELECTED: <version>` aus und Claude verwendet genau diese Version.

### Abfangmodus (Automatisch)

Konfigurieren Sie `.claude/settings.json` mit einem `PostToolUse`-Hook, um eine automatische, transparente Paketverifizierung zu aktivieren:

1. Claude schreibt eine Manifest-Datei (z. B. `package.json`) mit der ursprünglich angeforderten Version — die Datei landet auf der Festplatte
2. Der `PostToolUse`-Hook feuert unmittelbar nach Abschluss des Schreibvorgangs und ruft `safer-dependencies-shim.sh` auf
3. Der Shim liest die Datei, parst die deklarierten Pakete und führt alle Sicherheitsprüfungen durch (Typosquatting, verwaist, CVE, Veralterung, Hash-Pinning)
4. Wenn Korrekturen erforderlich sind, **überschreibt der Shim das Manifest direkt** mit sicheren Versionen (oder entfernt Einträge, für die es keine sichere Version gibt)
5. Der Shim gibt Signale aus (`UPDATED:`, `BLOCKED:`, `WARNING:`, `STALE:`, `MAJOR-UPDATE-CONFIRM:`, `REFACTOR-REQUIRED:`, `REGRESSION:`, `TYPOSQUAT-CONFIRM:`, `VERIFY:`, `CLEAN:`) über `hookSpecificOutput.additionalContext` auf stdout. `REGRESSION:` geht einem `MAJOR-UPDATE-CONFIRM:` voraus, wenn das Audit-Log zeigt, dass dasselbe (Datei, Paket) zuvor auf dasselbe sichere Ziel korrigiert wurde — das heißt, ein Subagent oder ein veralteter Plan hat eine bekannte verwundbare Version erneut eingeführt, und der Orchestrator sollte die zuvor genehmigte Version wiederherstellen, anstatt den Major-Bump neu zu entscheiden.
6. Claude empfängt diese Signale als System-Erinnerung und führt Folgearbeiten durch (betroffene Imports finden, Tests ausführen, für Breaking Changes refaktorieren)

**Design-Hinweis — Form C (Korrektur nach dem Schreiben):** Der Hook blockiert KEINE Schreibvorgänge. Jede verwundbare Version landet zuerst auf der Festplatte und wird dann innerhalb desselben Tool-Use-Zyklus automatisch korrigiert. Dies ist eine bewusste Entscheidung gegenüber einem `PreToolUse`-Blocking-Design — siehe [FAQ.md](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md#why-posttooluse-post-write-corrective-instead-of-pretooluse-pre-write-blocking-for-the-manifest-path) für die Abwägungen.

**Beispielsignal:**```
UPDATED: aiohttp 3.8.5 → 3.9.0 (HIGH: 33 CVEs fixed)

Das übergeordnete Agent verwendet diese Signale, um betroffenen Code zu identifizieren und bei Bedarf zu refaktorieren.

Pre-Install-Modus (Bash-Hook)

Konfigurieren Sie .claude/settings.json mit einem PreToolUse:Bash-Hook, um die Vorab-Prüfung von Paketmanager-Installationsbefehlen zu aktivieren. Dies ergänzt (ersetzt nicht) den Intercept-Modus – zusammen bilden sie eine mehrschichtige Verteidigung.

  1. Claude versucht einen Bash-Toolaufruf (z. B. npm install [email protected])
  2. Der PreToolUse-Hook feuert, bevor der Aufruf ausgeführt wird, und ruft safer-dependencies-pretooluse-bash.sh auf
  3. Ein reiner-Bash-Frühfilter leitet Nicht-PM-Befehle in ca. 115 ms um (kein Python-Aufruf), sodass git status / ls / npm test nur vernachlässigbare Kosten auf dem heißen Pfad verursachen
  4. Für erkannte Paketmanager-Installationen (npm/pnpm/yarn install/i/add) tokenisiert das Hilfsprogramm über shlex, extrahiert jedes pkg@version-Argument und sendet es per POST an OSV
  5. Jeder verwundbare konkrete Pin → der Hook gibt permissionDecision: "deny" zurück, mit einer GHSA-ID pro Befund + CVSS + Zusammenfassung, plus einem Hinweis, die safer-dependencies-Skill aufzurufen
  6. Die Installation wird nie ausgeführt – kein Netzwerkabruf, keine Postinstall-Skripte

Warum dies zusätzlich zum Intercept-Modus existiert: Der Post-Write-Shim ist gegenüber Bash blind. npm install [email protected] läuft vollständig durch (und Postinstall-Skripte werden ausgeführt), bevor eine Prüfung feuert; npm install -g typosquat-pkg schreibt überhaupt kein Projektmanifest. Der Pre-Install-Modus schließt diese Lücken strukturell.

Der Pre-Install-Modus sieht nur, was der Benutzer eingegeben hat (pkg@version-Argumente auf der Befehlszeile). Er kann den transitiven Baum, den der Resolver tatsächlich installieren wird, nicht sehen. Post-Install-Modus (unten) prüft die Lockfile, sobald die Installation abgeschlossen ist – die beiden Modi ergänzen sich, sind nicht redundant.

Umfang: Die hier abgedeckten Paketmanager-CLIs umfassen fünf Ökosysteme (npm/pnpm/yarn/bun/npx/deno, pip/pip3/pipx/pipenv/uv/uvx/poetry, gem/bundle, go, cargo), plus Maven über den Intercept-Modus (Maven-Abhängigkeiten werden typischerweise in pom.xml/build.gradle deklariert, nicht über ein CLI-Verb hinzugefügt).

Bekannte Lücke: Die Maven-CLI unterstützt zwar direkte Downloads über mvn dependency:get -Dartifact=group:art:version und mvn dependency:copy. Dieser Hook erkennt diese Aufrufe noch nicht. Wenn Sie sie regelmäßig verwenden, fängt der bestehende Post-Write-Shim weiterhin alles ab, was in Ihr Manifest gelangt, aber der Vorab-Fetch-Schutz gilt nur für die oben aufgeführten Ökosysteme. Als Folgeaufgabe erfasst.

Pro-Ökosystem erkannte Syntax:

PMVerbenKonkrete-Pin-Syntax
npm, pnpm, yarn, buninstall, i, add (plus yarn/pnpm dlx, bun x, yarn create)[email protected], @scope/[email protected]
npx(verbos – Paket ist erstes Positionsargument)[email protected]
denoadd, installnpm:[email protected] (npm-präfixierte Spezifikationen)
pip, pip3, pipx, pipenv, uv, uvx, poetryinstall (pip/pip3/pipx/pipenv) / add (uv/poetry) / verbos (uvx)pkg==1.2.3 (Extras pkg[extra]==X werden ebenfalls behandelt)
gem, bundleinstall (gem) / add-v 1.2.3, --version 1.2.3, --version=1.2.3 (separates Flag)
goget, install[email protected] (muss das v-Präfix gemäß Go-Modulen enthalten)
cargoadd, install[email protected]

Bereichs-Pins (npm ^4.17, pip >=, poetry ^/~, Go @latest) und nicht spezifizierte Versionen werden nach der Installation an den Intercept-Modus durchgereicht – der Post-Write-Shim prüft, was auch immer der Resolver auswählt. Automatisches Umschreiben auf eine sichere Version ist als Folgeaufgabe geplant.

Fehlermodus: Fail-open. Jeder Fehler (Python fehlt, Netzwerkstörung, fehlerhafte Eingabe) beendet mit 0 und ohne Ausgabe, sodass Bash fortfahren kann. Der Intercept-Modus läuft weiterhin nach der Installation, sodass eine fehlgeschlagene Vorabprüfung auf bestehenden Schutz zurückfällt.

Beispiel für eine Ablehnung:``` safer-dependencies pre-flight audit blocked this install. Vulnerable pinned version(s) detected:

  • [email protected] → GHSA-35jh-r3h4-6jhm (CVSS:7.4): Command Injection in lodash Re-run with a patched version, or invoke the safer-dependencies skill for a recommended pin.
root@kitploit:~
### Post-Install-Modus (Bash-Hook)

Konfiguriere `.claude/settings.json` mit einem `PostToolUse:Bash`-Hook, um
die Prüfung nach der Ausführung von Bash-Befehlen zu aktivieren. Er führt
**drei unabhängige Scans** gegen das `cwd` des Befehls aus, die jeweils eine
Lücke schließen, die die anderen Hooks nicht abdecken können:

- **Scan A — Lockfiles.** Nach einem erfolgreichen Installationsverb (`npm install`,
  `bundle install`, `poetry install`, `uv sync`, `go mod tidy`, usw.) prüft er
  frisch modifizierte Lockfiles (`package-lock.json`, `Gemfile.lock`,
  `poetry.lock`, `uv.lock`, `go.sum`, `yarn.lock`, `pnpm-lock.yaml`,
  `Pipfile.lock`). Dies schließt die **transitive-CVE-Lücke**, die Pre-Install
  nicht sehen kann: Der Benutzer hat `pkg@version` eingegeben, aber der Resolver
  könnte dutzende transitive Abhängigkeiten eingebunden haben, die niemand benannt hat.
- **Scan B — Manifeste.** Nach jedem Bash-Befehl, der *nicht* auf einer
  Read-only-Denylist steht (`ls`, `cat`, `git status`, …), prüft er frisch
  modifizierte Manifeste. Dies ist der **einzige** Fallback für
  Manifest-Änderungen, die über `sed -i`, `jq` oder ein Skript vorgenommen
  wurden — diese umgehen das `Write`/`Edit`-Tool, auf das der Intercept-Modus
  hakt.
- **Scan C — aufgelöste Umgebung.** Ein einfaches `pip install` /
  `pip install -r requirements.txt` schreibt kein Lockfile, daher sieht Scan A
  den aufgelösten Baum nie. Nach einer pip-artigen Installation ruft Scan C
  dasselbe pip erneut mit einem Read-only-`list --format=json` auf und prüft
  die vollständig aufgelöste Umgebung (direkt + transitiv) per OSV.

So läuft ein Scan ab:

1. Claude führt einen Bash-Tool-Aufruf aus
2. Der `PostToolUse`-Hook feuert *nach* Abschluss des Befehls und ruft
   `safer-dependencies-posttooluse-bash.sh` auf
3. Ein reiner-Bash-Frühfilter überspringt Befehle, die kein Scan-Gate erfüllen,
   in ~115 ms (gleiche Fast-Path-Konvention wie Pre-Install), sodass `ls` / `git` / `cat`
   nur vernachlässigbare Kosten verursachen
4. Jeder Scan durchläuft `cwd` mit `find -maxdepth 5` (deckt Monorepo-Layouts ab;
   schließt `node_modules`, `.git`, `.venv`, `venv` aus) nach Dateien, die innerhalb
   der letzten 60 s modifiziert wurden — überschreibbar über `SAFE_DEP_POSTINSTALL_MTIME_WINDOW`
5. Für jede frisch modifizierte Datei (Scan A/B) erzeugt der Hook eine synthetische
   `PostToolUse:Write`-Payload und leitet sie an den bestehenden Shim weiter — die
   Lockfile- und Manifest-Prüfer des Shims laufen unverändert, ohne doppelte Logik
6. Die Signale pro Datei werden verkettet und als ein `hookSpecificOutput`-JSON
   an den übergeordneten Agenten ausgegeben

**Was es abfängt, was Pre-Install nicht abfängt:** transitive Schwachstellen.
Ein sauber aussehendes `bundle install` kann `[email protected]` (CVE-2025-27610)
als transitive Abhängigkeit von `sinatra` einziehen — der Benutzer hat `rack`
nie eingegeben, daher kann Pre-Install es nicht sehen, aber Post-Install liest
das aufgelöste `Gemfile.lock` und meldet die CVE.

**Umfang:** Scan A schreibt aufgelöste Versionen nicht neu — der
Auto-Korrektur-Vertrag gilt nur für Manifeste, die Claude direkt geschrieben hat.
Bei transitiven CVEs besteht die Lösung typischerweise darin, „die direkte
Abhängigkeit zu aktualisieren, die die transitive besitzt", was menschliches
Urteilsvermögen erfordert. Scan B *führt* Auto-Korrekturen durch, da er Manifeste
über denselben Shim-Pfad wie der Intercept-Modus prüft. Scan A wird übersprungen,
wenn die Prüfstufe `transitive` auf `off` gesetzt ist (`config set checks.transitive off`).

**Fehlermodus:** Fail-open, wie bei den anderen Hooks. Jeder Fehler (fehlender
Shim, fehlerhafte Payload, Python nicht verfügbar) endet still mit Exit-Code 0.

**Beispiel-WARNUNG:**```
WARNING: [email protected] in lock file has GHSA-29mw-wpgm-hmr9, GHSA-35jh-r3h4-6jhm

Post-Agent-Modus (Agent-Hook-Paar)

Die vier oben genannten Modi greifen nur bei Tool-Aufrufen der Root-Session. Wenn die Root-Session einen Subagenten auslöst (über das Agent-Tool – viele Skills und Slash-Befehle tun dies intern), umgehen die Write/Edit/Bash-Aufrufe des Subagenten alle diese Modi. Der Post-Agent-Modus ist das reaktive Sicherheitsnetz für diese Lücke.

  1. Ein PreToolUse:Agent-Hook (safer-dependencies-pretooluse-agent.sh) wird unmittelbar vor jeder Agent-Auslösung ausgeführt und erstellt eine Sentinel-Datei unter /tmp/.safer-deps-agent-<PPID>-<session_id>.sentinel (mit Fallback auf einen nur-PPID-Namen, wenn keine Session-ID verfügbar ist)
  2. Der Subagent wird ausgeführt und kann Manifeste oder Lockfiles schreiben
  3. Ein PostToolUse:Agent-Hook (safer-dependencies-posttooluse-agent.sh) wird nach der Rückkehr des Agent-Aufrufs ausgeführt, sucht per find nach jedem Manifest und Lockfile, das neuer als die Sentinel-Datei ist, und prüft jedes über denselben Shim-Pfad
  4. Ergebnisse werden als additionalContext an die nächste Runde der Root-Session übergeben; die Sentinel-Datei wird entfernt

Verschachtelte Subagenten werden automatisch abgedeckt – der PostToolUse:Agent-Hook der Root-Session feuert erst, nachdem die gesamte Arbeit des äußeren Agents (einschließlich allem, was dieser ausgelöst hat) auf der Festplatte liegt. Die eine Lücke ist eine globale Installation, die kein Manifest oder Lockfile schreibt (npm install -g …): Es gibt nichts zu scannen. Wie die anderen Hooks schlägt er offen fehl – jeder Fehler (fehlende Sentinel-Datei, fehlender Shim, unlesbare Nutzlast) wird mit Exit-Code 0 still beendet. Die vollständige Design-Begründung befindet sich in skills/safer-dependencies.md.

Audit-Log

Jede Prüfung wird in ~/.claude/safer-dependencies-audit-YYYY-MM.log protokolliert (eine Datei pro Kalendermonat, wobei YYYY-MM das UTC-Jahr-Monat ist) als einzelne JSON-Zeile. Überschreiben Sie den vollständigen Pfad mit der Umgebungsvariable SAFE_DEP_AUDIT_LOG (wenn gesetzt, wird das Datumssuffix nicht angehängt). Dateien werden außerdem größenbasiert rotiert, wenn sie SAFE_DEP_LOG_MAX_BYTES überschreiten (Standard 10 MiB; auf 0 setzen, um zu deaktivieren). Setzen Sie SAFE_DEP_MODEL, um den Modellwert zu überschreiben, der in source.model in jedem Eintrag geschrieben wird – nützlich für A/B-Vergleiche zwischen Modellversionen.

Alle fünf Modi hängen an dieselbe Datei an. Jeder Eintrag enthält einen source-Block (Schema 2.2), der angibt, welche Komponente ihn geschrieben hat:

source.componentGeschrieben vonAuslöser
shim.posttooluseshim.shManifest- oder Lockfile-Schreiben (Intercept-Modus, Post-Install-Auslösung)
shim.install_errorshim.shShim-Preflight-Installationsfehler
bash.pretoolusepretooluse-bash.shBash-Installationsbefehl (Pre-Install-Modus)
bash.posttooluseposttooluse-bash.shDer Post-Install-Bash-Hook selbst, wenn er offen fehlschlägt, bevor er den Shim erreicht
agent.pretoolusepretooluse-agent.shReserviert für Pre-Agent-Fail-Open-Ereignisse (der Hook selbst ist bei Erfolg derzeit still)
agent.posttooluseposttooluse-agent.shPost-Agent-Hook-Fail-Open-Ereignisse (z. B. Shim fehlt, python_missing)
manual.skillClaude im Normal-ModusManuelle Prüfung inline aufgerufen

source.model zeichnet das in der Session aktive Claude-Code-Modell auf (z. B. "claude-sonnet-4-6"). Vorhanden in Schema 2.1+; Einträge, die von älteren Installationen geschrieben wurden, lassen das Feld aus. Der Statistikbefehl degradiert elegant auf "unknown", wenn es fehlt.

Filtern Sie nach source.component mit jq:```bash jq -r '.source.component' audit.log | sort | uniq -c | sort -rn jq -c 'select(.source.component == "bash.pretooluse")' audit.log

Surface every silent fail-open across all hooks:

jq -c 'select(.source.mode == "fail_open") | {component: .source.component, reason: .fail_open.reason, ts}' audit.log

root@kitploit:~
Für eine einfachere Analyse bitte Claude um Nutzungsstatistiken bitten, anstatt Protokolle manuell zu parsen:```
"Show safer-dependencies stats for the last month"

Dies liefert menschenlesbare Zusammenfassungen von Aktivität, Sicherheitsauswirkungen und Leistungskennzahlen, die aus diesen Audit-Protokollen extrahiert wurden.

Eintragsformen (Schema 2.2). Drei unterschiedliche Formen teilen sich denselben ts / schema / source-Kopf:

FormWann sie geschrieben wirdUnterscheidungsfelder
Audit-EintragManifest- / Lockfile- / Bash-Install-Auditfile, ecosystem, checked, findings, abandoned, stale, typosquat, unknown, signatures, notes, clean
Install-Fehler-EintragShim-Preflight-Install-Fehler (Komponente shim.install_error)install_error, shim_dir, scripts_dir
Fail-Open-EintragJeder Hook-Einstiegspunkt wird vorzeitig beendet wegen helper_missing / shim_missing / python_missing. source.mode ist "fail_open"fail_open: { reason, detail? }

Audit-Einträge: Der Intercept-Modus führt die vollständige Pipeline aus (Provenienz, Versionsalter, OSV, abandoned/stale, Typosquatting, Signaturen), sodass alle Arrays befüllt werden können. Der Pre-Install-Modus führt heute nur OSV aus, daher sind abandoned / stale / typosquat / signatures immer leer. Die Post-Install-Dispatch (Lockfile-Audit) schreibt unter shim.posttooluse, wobei findings durch WARNING:-Zeichenfolgen aus den Lockfile-Auditoren befüllt wird. Das notes-Array trägt informative NOTE:-Signale (z. B. Manifest-übersprungen-weil-nicht-gepinnt).

Schema 2.2 fügte — additiv — vier Felder zu Lockfile-Audit-Einträgen hinzu: lockfile, manifest_ref, relation_summary (eine direkte/transitive/unbekannte Klassifizierung jedes markierten Pakets gegenüber dem zugehörigen Manifest) sowie einen policy-Block, der die geltende transitive-Stufe aufzeichnet. Das Update ist abwärtskompatibel: Leser von 2.1-Einträgen tolerieren die neuen Felder, und das Feld source.model bleibt ab 2.1 vorhanden.```json { "ts": "2026-04-19T12:34:56Z", "schema": "2.2", "source": { "component": "shim.posttooluse", "script": "shim.sh", "hook": "PostToolUse:Write", "tool": "Write", "mode": "intercept", "model": "claude-sonnet-4-6" }, "file": "/path/to/project/package.json", "ecosystem": "npm", "checked": ["[email protected]", "[email protected]"], "findings": ["UPDATED: express 4.18.2 → 4.22.1 (HIGH: 1 CVE fixed)"], "abandoned": [], "stale": [], "typosquat": [], "unknown": [], "signatures": [], "notes": [], "clean": ["[email protected]"] }

root@kitploit:~
Pre-Install-Modus-Beispiel (Bash-Hook, verwundbarer Pin verweigert):```json
{
  "ts": "2026-04-23T06:56:21Z",
  "schema": "2.2",
  "source": {
    "component": "bash.pretooluse",
    "script": "pretooluse-bash.sh",
    "hook": "PreToolUse:Bash",
    "tool": "Bash",
    "mode": "intercept",
    "model": "claude-sonnet-4-6"
  },
  "file": "bash:npm install [email protected] [email protected]",
  "ecosystem": "npm",
  "checked": ["[email protected]", "[email protected]"],
  "findings": [
    "BLOCKED: [email protected] GHSA-35jh-r3h4-6jhm (CVSS:3.1/...): Command Injection in lodash"
  ],
  "abandoned": [],
  "stale": [],
  "typosquat": [],
  "unknown": [],
  "signatures": [],
  "notes": [],
  "clean": ["[email protected]"]
}

Fail-open-Modus-Beispiel (Post-Install-Bash-Hook, der ohne angrenzenden Shim aufgerufen wird — fehlerhafte Installation):```json { "ts": "2026-05-03T07:14:11Z", "schema": "2.2", "source": { "component": "bash.posttooluse", "script": "safer-dependencies-posttooluse-bash.sh", "hook": "PostToolUse", "tool": "Bash", "mode": "fail_open", "model": "claude-sonnet-4-6" }, "fail_open": { "reason": "shim_missing", "detail": "/home/alice/.claude/skills/safer-dependencies" } }

root@kitploit:~
Ein Fail-Open-Eintrag besagt: „Dieser Hook wurde ausgelöst, ist aber frühzeitig ohne Prüfung beendet worden, weil eine Voraussetzung fehlte." Verwenden Sie den obigen jq-Filter (`select(.source.mode == "fail_open")`), um jedes stille Schutzverlust-Ereignis in Ihrem Log sichtbar zu machen.

Wenn der Shim im Dry-Run-Modus ausgeführt wird (`SAFE_DEP_DRY_RUN=1`), enthalten die Einträge außerdem `"mode": "dry_run"`, sodass die nachträgliche Analyse reine Prüfungsaufrufe herausfiltern kann.

## Anforderungen

- Python 3.9+ (die Hooks prüfen dies und schalten bei älteren Interpretern auf Fail-Open um)
- `curl` (für Registry-API-Aufrufe und OSV-Schwachstellenprüfungen)
- Ökosystem-Tools (optional, die Skill-Funktion greift bei Fehlen auf die OSV-API zurück):
  - `npm` für npm-Pakete
  - `pip-audit` für Python-Pakete
  - `bundle` für Ruby-Pakete
  - `dependency-check` für Java-Pakete

## FAQ

Die Begründung für Design-Entscheidungen (warum `PostToolUse` statt `PreToolUse`, warum Signaturen nicht verifiziert werden, warum Skripte und Shim dupliziert sind, Stolperfallen beim Laden von Skills usw.) ist in [`FAQ.md`](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md) dokumentiert.
Tool herunterladen