Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
safer-dependencies — Couche de sécurité automatisée des dépendances pour les assistants de codage IA qui audite les packages pour les CVEs, les typosquats, l'abandon, les problèmes d'âge de version et l'intégrité des hachages dans les écosystèmes npm, PyPI, RubyGems, Maven, Go et Rust. | Kitploit
Outils/GitHubGitHub/robert-auger/safer-dependencies
Scanners de VulnérabilitésDevSecOpsDétection de SecretsSécurité de la Chaîne Logistique
GitHubrobert-auger/safer-dependencies

safer-dependencies

Couche de sécurité automatisée des dépendances pour les assistants de codage IA qui audite les packages pour les CVEs, les typosquats, l'abandon, les problèmes d'âge de version et l'intégrité des hachages dans les écosystèmes npm, PyPI, RubyGems, Maven, Go et Rust.

Voir le dépôt
3055il y a 9 joursVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Dépendances plus sûres pour Claude Code

Lorsque des assistants de codage IA comme Claude ajoutent des paquets à votre projet, ils choisissent souvent la version qui semble appropriée — sans vérifier si elle présente des vulnérabilités de sécurité connues, si le paquet est toujours activement maintenu, ou si le nom est à une faute de frappe près d'un imitateur malveillant.

safer-dependencies est une couche de sécurité pour Claude Code : elle se place entre Claude et vos fichiers manifestes et exécute automatiquement ses contrôles de sécurité : les installations vulnérables sont refusées avant même de s'exécuter, et une version risquée écrite dans un manifeste est corrigée sur le disque immédiatement après l'écriture. Elle détecte et corrige les dépendances risquées — CVE, typosquatting, paquets abandonnés et problèmes d'ancienneté de version, plus une période de refroidissement pour les nouvelles versions — sur npm, PyPI, RubyGems, Maven, Go, Rust et PHP (Composer). Consultez CAPABILITIES.md pour savoir exactement ce qui est couvert et ce qui ne l'est pas.

Nouveau ici ? GETTING-STARTED.md vous fait passer de zéro à une installation fonctionnelle en environ cinq minutes.

Sécurité et confidentialité : consultez SECURITY.md (divulgation des vulnérabilités), PRIVACY.md (sortie de données, aucune télémétrie) et CAPABILITIES.md (ce contre quoi l'outil vous défend et ce qu'il ne couvre pas).

Licence (source disponible — PAS « open source » OSI) : Libre d'utilisation et de modification pour vos propres besoins, . Une licence payante distincte est requise pour monétiser le logiciel — le vendre, l'intégrer dans un produit ou service vendu, ou proposer ses fonctionnalités à des tiers contre rémunération (y compris hébergé/SaaS/API). La redistribution et les dérivés doivent conserver la licence et créditer ce projet. Voir (Section 4 pour la restriction commerciale) ; demandes de licence commerciale via .

y compris l'utilisation interne à but lucratif/entreprise et la création de produits que vous vendez
uniquement
lui-même
LICENSE
github.com/robert-auger

Sommaire

  • Pour commencer — de zéro à installé en environ cinq minutes
  • Ce qu'il fait
  • Ce qui le déclenche
  • Contenu de ce dépôt
  • Écosystèmes pris en charge
  • Installation
    • Configuration
    • Modification de la période de refroidissement
  • Niveaux d'avertissement
  • Comment ça fonctionne
    • Mode normal (manuel)
    • Mode interception (automatique)
    • Mode pré-installation (hook Bash)
    • Mode post-installation (hook Bash)
    • Mode post-agent (paire de hooks Agent)
  • Journal d'audit
  • Prérequis
  • FAQ

Pour commencer

GETTING-STARTED.md vous fait passer de zéro à une installation fonctionnelle en environ cinq minutes — prérequis, installation interactive et vérification. Pour la référence complète d'installation (installations globales/projet/manuelles, spécificités Windows, la liste blanche des autorisations, la mise à jour et la désinstallation), consultez INSTALLATION.md.

Utilisation quotidienne : une fois les hooks installés, il n'y a rien à exécuter — safer-dependencies fonctionne automatiquement en arrière-plan. Lorsque Claude ajoute ou installe des paquets, il signale les dépendances risquées et met à niveau les versions vulnérables vers une version sûre sur place — et bloque une installation connue comme vulnérable avant même qu'elle ne s'exécute — afin que les paquets non sûrs soient détectés et corrigés sans que vous ayez à le demander. Vous pouvez toujours l'invoquer directement à tout moment : « est-ce que [email protected] est sûr ? », « vérifier la configuration de safer-dependencies », ou « afficher les statistiques de safer-dependencies ».

Ce qu'il fait

Lorsque Claude s'apprête à ajouter un paquet à votre projet, safer-dependencies intercepte et exécute 5 contrôles :

  1. Provenance — registre officiel, détection de typosquatting (npm/PyPI/RubyGems/Maven/crates.io), ancienneté du paquet
  2. Ancienneté de version — sélectionne la version stable la plus récente publiée il y a plus de 7 jours (fenêtre de refroidissement)
  3. Analyse des vulnérabilités — API OSV, avec les outils natifs de l'écosystème (npm audit, pip-audit, bundle audit) lorsqu'ils sont disponibles
  4. Intégrité des épingles de hachage — pour les lignes PyPI requirements.txt avec des épingles --hash=sha256:..., le hachage déclaré est validé par rapport aux hachages publiés par PyPI ; une discordance émet un AVERTISSEMENT
  5. Paquets abandonnés et obsolètes — les paquets connus comme abandonnés (par ex. paperclip, request, pycrypto, github.com/dgrijalva/jwt-go) sont bloqués immédiatement avec un remplacement suggéré ; les paquets sans version stable depuis plus de 2 ans reçoivent un avertissement consultatif STALE:. Les paquets bloqués sont retirés du manifeste et Claude demandera comment procéder ; les paquets uniquement obsolètes sont laissés en place.

Si des problèmes sont détectés, Claude émet des avertissements et peut revenir à une version plus sûre. Tous les contrôles sont journalisés dans ~/.claude/safer-dependencies-audit-YYYY-MM.log (un fichier par mois calendaire).

Ce qui le déclenche

La compétence se déclenche automatiquement lorsque Claude :

Opérations sur les manifestes / installations

  • Ajoute ou met à jour un paquet dans package.json, requirements.txt, Gemfile, pom.xml, build.gradle, Cargo.toml, go.mod ou tout autre manifeste pris en charge
  • Écrit un import, require ou use pour un paquet non encore déclaré dans le manifeste
  • Génère ou met à jour un fichier de verrouillage (vérifie uniquement les entrées nouvelles/modifiées)
  • Exécute une installation via le gestionnaire de paquets en Bash (npm install, bundle install, poetry install, uv sync, go mod tidy, etc.) — la pré-installation audite les arguments de la commande, la post-installation audite le fichier de verrouillage résultant
  • Écrit un Dockerfile ou un workflow CI (.github/workflows/*.yml, etc.) qui intègre des étapes d'installation épinglées du gestionnaire de paquets

Questions de sélection et de recommandation

  • Comparaisons de bibliothèques/frameworks : « devrais-je utiliser axios ou node-fetch ? », « moment vs dayjs ? », « lequel est meilleur X ou Y ? »
  • Demandes de recommandation : « quel est un bon client HTTP pour Python ? », « recommande une bibliothèque de journalisation pour Go », « quel paquet gère le CSV dans Node ? »
  • Sélection de version : « quelle version de Django devrais-je utiliser ? », « dernier Flask stable ? »

Expressions d'intention d'utilisation (pré-ajout)

  • « Je veux utiliser FastAPI pour ça », « je pense à ajouter Celery », « nous envisageons Prisma comme ORM », « utilisons Tailwind »

Questions sur la santé et la fiabilité des paquets

  • « moment.js est-il toujours maintenu ? », « cette gemme est-elle toujours active ? », « X est-il abandonné ? », « X est-il en fin de vie ? », « puis-je faire confiance à ce paquet ? », « quand faker a-t-il été mis à jour pour la dernière fois ? »

Commandes de génération de projet

  • npx create-react-app, npm create vite@latest, django-admin startproject, rails new, cargo new + cargo add, « initialiser un nouveau projet FastAPI »

Ajouts implicites de paquets (demandes de fonctionnalités impliquant une nouvelle dépendance)

  • « Ajouter la mise en cache Redis à l'application », « se connecter à Postgres », « ajouter l'authentification JWT », « écrire du code pour envoyer des e-mails » — se déclenche lorsqu'aucun paquet pour cette capacité n'est déjà dans le manifeste

Migration et portage

  • « Migrer de requests vers httpx », « passer de CRA à Vite », « porter de moment vers date-fns » — audite le paquet entrant

Il ne se déclenche pas pour :

  • Les imports de la bibliothèque standard (os, fs, java.util.*, etc.)
  • Les dépendances déjà déclarées qui ne sont pas modifiées
  • Les discussions académiques sur le fonctionnement interne d'un paquet (« expliquer le reconciler de React », « comment fonctionne la résolution de modules de webpack ? ») — les questions de comparaison et de sélection déclenchent toujours l'outil
  • L'installation d'applications au niveau du système, de runtimes ou d'extensions IDE (Python lui-même, Docker, Homebrew, extensions VS Code)

Contenu de ce dépôt

Il s'agit d'un ensemble compétence + hooks, pas d'un simple fichier de compétence. Une installation complète déploie ces éléments :

FichierRôle
skills/safer-dependencies.mdLa compétence (SKILL.md une fois installée). Décrit les procédures d'audit et inclut le mode de gestion pour l'installation/les statistiques.
skills/safer-dependencies-shim.shHook PostToolUse:Write/Edit — audite les écritures de manifestes et de fichiers de verrouillage et corrige automatiquement les versions vulnérables sur place (mode interception).
skills/safer-dependencies-pretooluse-bash.shHook PreToolUse:Bash — audit OSV pré-vol des commandes d'installation du gestionnaire de paquets ; refuse les épingles concrètes vulnérables avant que l'installation ne s'exécute (mode pré-installation).
skills/safer-dependencies-posttooluse-bash.shHook PostToolUse:Bash — audit post-vol après les commandes Bash ; détecte les CVE transitives dans les fichiers de verrouillage fraîchement écrits, les manifestes modifiés via sed/jq/scripts, et l'environnement résolu des pip install simples (mode post-installation).
skills/safer-dependencies-pretooluse-agent.sh + skills/safer-dependencies-posttooluse-agent.shPaire de hooks PreToolUse:Agent + PostToolUse:Agent — comble la lacune de couverture des sous-agents. Les modes 2 à 4 ne se déclenchent que pour les appels d'outils de la session racine, donc tout manifeste écrit par un sous-agent les contourne. La post-agent audite ce que le sous-agent a écrit après chaque retour d'appel d'outil Agent (mode post-agent).
skills/scripts/Bibliothèque Python partagée (safedep/) et scripts de résolution autonomes utilisés par tous les hooks.
skills/scripts/safer_dependencies_manager.pyModule de gestion pour l'installation interactive, les statistiques d'utilisation et la validation de la configuration.

Le fichier de compétence seul ne suffit pas — sans hooks, l'invocation automatique dépend de la décision de Claude d'utiliser la compétence. Installez les cinq éléments pour une couverture complète ; de nombreuses compétences et commandes slash répartissent des sous-agents en interne, donc la paire post-agent est importante même si vous n'en générez jamais explicitement un. (Voir FAQ.md pour savoir pourquoi une compétence seule ne peut pas garantir la couverture.)

Écosystèmes pris en charge

ÉcosystèmeManifesteFichier de verrouillage
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

Nouveau sur le projet ? Commencez par GETTING-STARTED.md. La version courte :```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:~
L'installateur demande la portée (globale vs projet) et les hooks à activer, puis écrit `settings.json` pour vous — à la fois les entrées de hooks **et** la liste d'autorisations qui permet aux commandes de vérification de la compétence de s'exécuter sans invite d'approbation à chaque audit.

Tout le reste lié à l'installation se trouve dans **[INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md)**, la référence unique pour les mécanismes d'installation : installations manuelles fichier par fichier (niveau global et projet), spécificités Windows, hooks Post-Agent, la [liste d'autorisations](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist), la vérification de la configuration, la mise à jour, l'épinglage à une version de publication, et la désinstallation.

Après l'installation, la gestion quotidienne se fait en langage naturel via Claude — `install safer-dependencies` (ré-exécuter / modifier les hooks), `show safer-dependencies stats`, `check safer-dependencies setup` — ou via le menu `/safer-dependencies`. La mise à jour se fait aussi en session : `/safer-dependencies update` applique la dernière version (`update --check` pour un essai à blanc, `update --rollback` pour annuler) ; voir [INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#in-session-self-updater-safer-dependencies-update) pour le modèle de confiance.

> **Note de plateforme :** macOS, Linux et Windows sont pris en charge. Windows nécessite Git for Windows (fournit bash) et Python 3 dans le `PATH` — pas besoin de WSL. Les tests pratiques à ce jour se sont concentrés sur **macOS et Windows** ; la prise en charge de Linux est exercée par la matrice CI automatisée.

### Configuration

Deux éléments sont configurables après l'installation :

- **Liste d'autorisations** — pré-approuve les commandes de vérification en lecture seule de la compétence (les règles `npm audit` / `bundle audit` sous forme exacte et les scripts de résolution propres à la compétence) afin que les audits s'exécutent sans invite d'approbation à chaque fois ; `curl` n'est jamais pré-approuvé, et `npm view` / `pip-audit` sont en opt-in via le profil Convenience. L'installateur interactif écrit les entrées principales pour vous ; les installations manuelles ajoutent le bloc complet à la main. Bloc complet et justification : [INSTALLATION.md → Liste d'autorisations](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist).
- **Politique de sécurité** — la fenêtre/mode de refroidissement selon l'âge de la version et un niveau `off`/`warn`/`block` par vérification pour chaque type de vérification, modifiés avec `/safer-dependencies config` et stockés dans `~/.config/safer-dependencies/config.toml`. Schéma et sémantique des niveaux : [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).

### Modification de la période de refroidissement

Le refroidissement (appelé **cooloff** dans la configuration) est l'âge minimum qu'une version doit atteindre avant que la compétence ne la sélectionne — par défaut **7 jours**. Pour le modifier, demandez à Claude ou exécutez directement la commande de configuration :```
/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

Les mêmes verbes fonctionnent en dehors d’une session Claude :```bash python3 skills/scripts/safer_dependencies_manager.py config set cooloff.days 14

root@kitploit:~
Le réglage persiste dans `~/.config/safer-dependencies/config.toml` (section `[cooloff]`) ; les variables d’environnement `SAFE_DEP_COOLOFF_DAYS` et `SAFE_DEP_COOLOFF_MODE` remplacent le fichier par session. Trois comportements à connaître : `mode = "off"` supprime entièrement le filtre d’âge de la sélection de versions ; une réécriture pilotée par CVE contourne la barrière, donc un correctif de sécurité n’est jamais retenu parce qu’il est trop récent ; et la barrière couvre npm, PyPI, RubyGems et crates.io — Maven et Go ne sont volontairement pas soumis à la barrière. Sémantique complète : [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).

## Niveaux d’avertissement

| Niveau | Signification | Exemple |
|-------|---------|---------|
| CRITIQUE | Arrêter et demander à l’utilisateur | Typosquat détecté, signature falsifiée |
| ÉLEVÉ | Avertir et continuer | CVE connue, paquet de moins de 30 jours |
| MOYEN | Avertir et continuer | Version de moins de 7 jours, signature manquante |
| FAIBLE | Avertir et continuer | Gem Ruby non signée (attendu) |

## Comment cela fonctionne

La compétence fonctionne selon cinq modes (résumés ci-dessous ; la justification de conception la plus approfondie se trouve dans `skills/safer-dependencies.md`) :

### Mode normal (manuel)

Lorsque Claude s’apprête à écrire un `import`, à ajouter un paquet à un manifeste ou à mettre à jour un fichier de verrouillage, la compétence s’exécute en ligne dans votre session :

1. Interroge le registre de paquets pour les versions stables
2. Sélectionne automatiquement la version la plus récente publiée il y a 7 jours ou plus (déterministe — aucun jugement LLM)
3. Vérifie les vulnérabilités connues via les outils de l’écosystème et l’API OSV
4. Vérifie les signatures de paquets lorsque disponibles
5. Émet des avertissements si des problèmes sont détectés, épingle la version exacte
6. Consigne le résultat dans la piste d’audit

La sélection de version est gérée par des scripts Python autonomes fournis avec la compétence, et non par le LLM interprétant des règles. La commande génère `SELECTED: <version>` et Claude utilise exactement cette version.

### Mode interception (automatique)

Configurez `.claude/settings.json` avec un hook `PostToolUse` pour activer la vérification automatique et transparente des paquets :

1. Claude écrit un fichier manifeste (par ex. `package.json`) avec la version initialement demandée — le fichier est enregistré sur le disque
2. Le hook `PostToolUse` se déclenche immédiatement après la fin de l’écriture et invoque `safer-dependencies-shim.sh`
3. Le shim lit le fichier, analyse les paquets déclarés et exécute toutes les vérifications de sécurité (typosquat, abandon, CVE, obsolescence, épinglage de hachage)
4. Si des corrections sont nécessaires, le shim **réécrit le manifeste en place** avec des versions sûres (ou supprime les entrées qui n’ont pas de version sûre)
5. Le shim émet des signaux (`UPDATED:`, `BLOCKED:`, `WARNING:`, `STALE:`, `MAJOR-UPDATE-CONFIRM:`, `REFACTOR-REQUIRED:`, `REGRESSION:`, `TYPOSQUAT-CONFIRM:`, `VERIFY:`, `CLEAN:`) via `hookSpecificOutput.additionalContext` sur la sortie standard. `REGRESSION:` précède un `MAJOR-UPDATE-CONFIRM:` lorsque le journal d’audit montre que le même (fichier, paquet) a déjà été corrigé vers la même cible sûre — c’est-à-dire qu’un sous-agent ou un plan obsolète a réintroduit une version connue comme vulnérable, et l’orchestrateur doit restaurer la version précédemment approuvée plutôt que de re-décider la montée de version majeure.
6. Claude reçoit ces signaux sous forme de rappel système et effectue le travail de suivi (trouver les imports affectés, exécuter les tests, refactoriser pour les changements cassants)

**Note de conception — Forme C (corrective après écriture) :** le hook ne bloque PAS les écritures. Chaque version vulnérable est d’abord enregistrée sur le disque puis automatiquement corrigée dans le même cycle d’utilisation d’outil. C’est un choix délibéré par rapport à une conception bloquante `PreToolUse` — voir [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) pour les compromis.

**Exemple de signal :**```
UPDATED: aiohttp 3.8.5 → 3.9.0 (HIGH: 33 CVEs fixed)

L'agent parent utilise ces signaux pour identifier le code affecté et le refactoriser si nécessaire.

Mode Pré-installation (Hook Bash)

Configurez .claude/settings.json avec un hook PreToolUse:Bash pour activer l'audit pré-vol des commandes d'installation de gestionnaires de paquets. Cela complète (ne remplace pas) le Mode Interception — ensemble, ils forment une défense en couches.

  1. Claude tente un appel d'outil Bash (par ex. npm install [email protected])
  2. Le hook PreToolUse se déclenche avant l'exécution de l'appel et invoque safer-dependencies-pretooluse-bash.sh
  3. Un filtre précoce en bash pur court-circuite les commandes non-PM en ~115 ms (sans invocation Python), donc git status / ls / npm test ne paient qu'un coût négligeable sur le chemin critique
  4. Pour les installations reconnues de gestionnaires de paquets (npm/pnpm/yarn install/i/add), l'assistant tokenise via shlex, extrait chaque argument pkg@version, et les POSTe vers OSV
  5. Toute épingle concrète vulnérable → le hook renvoie permissionDecision: "deny" avec un ID GHSA par constatation + CVSS + résumé, plus une indication pour invoquer la compétence safer-dependencies
  6. L'installation ne s'exécute jamais — aucun téléchargement réseau, aucun script postinstall

Pourquoi cela existe en plus du Mode Interception : le shim post-écriture est aveugle à Bash. npm install [email protected] s'exécute jusqu'au bout (et les scripts postinstall s'exécutent) avant qu'un audit ne se déclenche ; npm install -g typosquat-pkg n'écrit aucun manifeste de projet du tout. Le Mode Pré-installation comble ces lacunes structurellement.

Le Mode Pré-installation ne voit que ce que l'utilisateur a saisi (arguments pkg@version sur la ligne de commande). Il ne peut pas voir l'arbre transitif que le résolveur va réellement installer. Le Mode Post-installation (ci-dessous) audite le fichier de verrouillage une fois l'installation terminée — les deux modes sont complémentaires, pas redondants.

Portée : les CLI de gestionnaires de paquets couverts ici s'étendent sur cinq écosystèmes (npm/pnpm/yarn/bun/npx/deno, pip/pip3/pipx/pipenv/uv/uvx/poetry, gem/bundle, go, cargo), plus Maven via le Mode Interception (les dépendances Maven sont généralement déclarées dans pom.xml/build.gradle, pas ajoutées via un verbe CLI).

Lacune connue : la CLI Maven prend en charge les téléchargements directs via mvn dependency:get -Dartifact=group:art:version et mvn dependency:copy. Ce hook ne reconnaît pas encore ces invocations. Si vous les utilisez régulièrement, le shim post-écriture existant capture toujours ce qui atterrit dans votre manifeste, mais la protection pré-récupération ne s'applique qu'aux écosystèmes listés ci-dessus. Suivi en cours.

Syntaxe reconnue par écosystème :

PMVerbesSyntaxe d'épingle concrète
npm, pnpm, yarn, buninstall, i, add (plus yarn/pnpm dlx, bun x, yarn create)[email protected], @scope/[email protected]
npx(sans verbe — le paquet est le premier argument positionnel)[email protected]
denoadd, installnpm:[email protected] (spécifications préfixées npm)
pip, pip3, pipx, pipenv, uv, uvx, poetryinstall (pip/pip3/pipx/pipenv) / add (uv/poetry) / sans verbe (uvx)pkg==1.2.3 (les extras pkg[extra]==X sont également gérés)
gem, bundleinstall (gem) / add-v 1.2.3, --version 1.2.3, --version=1.2.3 (drapeau séparé)
goget, install[email protected] (doit inclure le préfixe v selon les modules Go)
cargoadd, install[email protected]

Les épingles de plage (npm ^4.17, pip >=, poetry ^/~, Go @latest) et les versions non spécifiées passent au Mode Interception après l'installation — le shim post-écriture audite ce que le résolveur choisit. La réécriture automatique vers une version sûre est planifiée comme suivi.

Mode de défaillance : fail-open. Toute erreur (Python manquant, coupure réseau, entrée malformée) se termine avec le code 0 et sans sortie, permettant à bash de continuer. Le Mode Interception s'exécute toujours après l'installation, donc un pré-vol échoué se dégrade élégamment vers la protection existante.

Exemple de refus :``` 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:~
### Mode Post-Installation (Hook Bash)

Configurez `.claude/settings.json` avec un hook `PostToolUse:Bash` pour activer
l’audit post-exécution après les commandes Bash. Il exécute **trois analyses indépendantes**
sur le `cwd` de la commande, chacune comblant une lacune que les autres hooks ne peuvent pas traiter :

- **Analyse A — fichiers de verrouillage.** Après un verbe d’installation réussi (`npm install`,
  `bundle install`, `poetry install`, `uv sync`, `go mod tidy`, etc.), audite
  les fichiers de verrouillage fraîchement modifiés (`package-lock.json`, `Gemfile.lock`,
  `poetry.lock`, `uv.lock`, `go.sum`, `yarn.lock`, `pnpm-lock.yaml`,
  `Pipfile.lock`). Cela comble la **lacune des CVE transitives** que Pre-Install ne peut pas
  voir : l’utilisateur a saisi `pkg@version`, mais le résolveur a pu tirer
  des dizaines de dépendances transitives que personne n’a nommées.
- **Analyse B — manifestes.** Après toute commande Bash *non* sur une
  liste de blocage en lecture seule (`ls`, `cat`, `git status`, …), audite
  les manifestes fraîchement modifiés. C’est le **seul** recours pour les modifications de manifestes effectuées via `sed -i`, `jq`, ou
  un script — celles-ci contournent l’outil `Write`/`Edit` sur lequel le Mode Interception se branche.
- **Analyse C — environnement résolu.** Un simple `pip install` /
  `pip install -r requirements.txt` n’écrit aucun fichier de verrouillage, donc l’Analyse A ne voit jamais
  l’arbre résolu. Après une installation de type pip, l’Analyse C ré-invoque le même
  pip avec un `list --format=json` en lecture seule et vérifie via OSV l’ensemble de l’environnement
  résolu (direct + transitif).

Comment une analyse s’exécute :

1. Claude lance un appel d’outil Bash
2. Le hook `PostToolUse` se déclenche *après* la fin de la commande et invoque
   `safer-dependencies-posttooluse-bash.sh`
3. Un filtre précoce en pur Bash court-circuite les commandes qui ne correspondent à aucune porte d’analyse en
   ~115 ms (même convention de chemin rapide que Pre-Install), donc `ls` / `git` / `cat`
   ont un coût négligeable
4. Chaque analyse parcourt `cwd` avec `find -maxdepth 5` (couvre les structures monorepo ;
   exclut `node_modules`, `.git`, `.venv`, `venv`) pour les fichiers modifiés au cours des
   60 dernières secondes — remplaçable via `SAFE_DEP_POSTINSTALL_MTIME_WINDOW`
5. Pour chaque fichier fraîchement modifié (Analyse A/B), le hook forge une charge utile
   synthétique `PostToolUse:Write` et la transmet au shim existant — les auditeurs de fichiers de verrouillage
   et de manifestes du shim s’exécutent inchangés, sans logique dupliquée
6. Les signaux par fichier sont concaténés et émis comme un seul JSON `hookSpecificOutput`
   à l’agent parent

**Ce qu’il détecte que Pre-Install ne détecte pas :** les vulnérabilités transitives.
Un `bundle install` d’apparence propre peut tirer `[email protected]` (CVE-2025-27610)
comme dépendance transitive de `sinatra` — l’utilisateur n’a jamais saisi `rack`, donc
Pre-Install ne peut pas le voir, mais Post-Install lit le
`Gemfile.lock` résolu et signale la CVE.

**Portée :** L’Analyse A ne réécrit pas les versions résolues — le contrat
d’auto-correction ne s’applique qu’aux manifestes que Claude a écrits directement. Pour les CVE transitives,
le correctif consiste généralement à « mettre à jour la dépendance directe qui possède la transitive », ce qui
nécessite un jugement humain. L’Analyse B *fait* de l’auto-correction, car elle audite les manifestes
via le même chemin de shim que le Mode Interception. L’Analyse A est ignorée lorsque le
niveau de vérification `transitive` est défini sur `off` (`config set checks.transitive off`).

**Mode de défaillance :** fail-open, comme les autres hooks. Toute erreur (shim
manquant, charge utile malformée, Python indisponible) se termine par 0 en silence.

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

Mode Post-Agent (Paire de Hooks d'Agent)

Les quatre modes ci-dessus ne se déclenchent que pour les appels d'outils de la session racine. Lorsque la session racine délègue un sous-agent (via l'outil Agent — de nombreuses compétences et commandes slash le font en interne), les appels Write/Edit/Bash du sous-agent contournent tous ces modes. Le Mode Post-Agent est le filet de sécurité réactif pour cette lacune.

  1. Un hook PreToolUse:Agent (safer-dependencies-pretooluse-agent.sh) s'exécute immédiatement avant chaque envoi d'Agent et touche un fichier sentinelle à /tmp/.safer-deps-agent-<PPID>-<session_id>.sentinel (avec repli sur un nom basé uniquement sur le PPID lorsqu'aucun identifiant de session n'est disponible)
  2. Le sous-agent s'exécute et peut écrire des manifests ou des lockfiles
  3. Un hook PostToolUse:Agent (safer-dependencies-posttooluse-agent.sh) s'exécute après le retour de l'appel Agent, find chaque manifest et lockfile plus récent que la sentinelle, et audite chacun via le même chemin de shim
  4. Les résultats apparaissent comme additionalContext au tour suivant de la session racine ; la sentinelle est supprimée

Les sous-agents imbriqués sont couverts automatiquement — le PostToolUse:Agent de la racine ne se déclenche qu'après que tout le travail de l'agent externe (y compris tout ce qu'il a délégué) soit sur disque. La seule lacune est une installation globale qui n'écrit aucun manifest ni lockfile (npm install -g …) : il n'y a rien à analyser. Comme les autres hooks, il échoue ouvertement — toute erreur (sentinelle manquante, shim manquant, payload illisible) se termine par 0 en silence. La justification complète du design se trouve dans skills/safer-dependencies.md.

Journal d'audit

Chaque vérification est journalisée dans ~/.claude/safer-dependencies-audit-YYYY-MM.log (un fichier par mois calendaire, où YYYY-MM est le mois-année UTC) sous forme d'une seule ligne JSON. Remplacez le chemin complet avec la variable d'environnement SAFE_DEP_AUDIT_LOG (lorsqu'elle est définie, le suffixe de date n'est pas ajouté). Les fichiers sont également soumis à une rotation par taille lorsqu'ils dépassent SAFE_DEP_LOG_MAX_BYTES (10 Mio par défaut ; définissez à 0 pour désactiver). Définissez SAFE_DEP_MODEL pour remplacer la valeur du modèle écrite dans source.model de chaque entrée — utile pour les comparaisons A/B entre versions de modèles.

Les cinq modes ajoutent au même fichier. Chaque entrée porte un bloc source (schéma 2.2) identifiant quel composant l'a écrite :

source.componentÉcrit parDéclencheur
shim.posttooluseshim.shÉcriture de manifest ou lockfile (Mode Interception, envoi Post-Installation)
shim.install_errorshim.shÉchec d'installation de pré-vérification du shim
bash.pretoolusepretooluse-bash.shCommande d'installation Bash (Mode Pré-Installation)
bash.posttooluseposttooluse-bash.shLe hook Bash Post-Installation lui-même, lorsqu'il échoue ouvertement avant d'atteindre le shim
agent.pretoolusepretooluse-agent.shRéservé aux événements d'échec ouvert Pré-Agent (le hook lui-même est actuellement silencieux en cas de succès)
agent.posttooluseposttooluse-agent.shÉvénements d'échec ouvert du hook Post-Agent (par ex. shim manquant, python_missing)
manual.skillClaude exécutant le Mode NormalAudit manuel invoqué en ligne

source.model enregistre le modèle Claude Code actif dans la session (par ex. "claude-sonnet-4-6"). Présent dans le schéma 2.1+ ; les entrées écrites par des installations plus anciennes omettent le champ. La commande de statistiques se dégrade gracieusement en "unknown" lorsqu'il est absent.

Filtrez par source.component avec 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:~
Pour une analyse plus facile, demandez à Claude les statistiques d'utilisation au lieu d'analyser les journaux manuellement :```
"Show safer-dependencies stats for the last month"

Ceci fournit des résumés lisibles par un humain de l’activité, de l’impact sur la sécurité et des métriques de performance extraits de ces journaux d’audit.

Formes d’entrées (schéma 2.2). Trois formes distinctes partagent le même en-tête ts / schema / source :

FormeQuand elle est écriteChamps distinctifs
Entrée d’auditAudit de manifeste / lockfile / installation bashfile, ecosystem, checked, findings, abandoned, stale, typosquat, unknown, signatures, notes, clean
Entrée d’erreur d’installationErreur d’installation de pré-vérification du shim (composant shim.install_error)install_error, shim_dir, scripts_dir
Entrée fail-openTout point d’entrée de hook se termine prématurément en raison de helper_missing / shim_missing / python_missing. source.mode est "fail_open"fail_open: { reason, detail? }

Entrées d’audit : le mode Interception exécute le pipeline complet (provenance, ancienneté de version, OSV, abandonné/obsolète, typosquat, signatures), donc tous les tableaux peuvent être remplis. Le mode Pré-installation n’exécute aujourd’hui que OSV, donc abandoned / stale / typosquat / signatures sont toujours vides. La répartition post-installation (audit de lockfile) écrit sous shim.posttooluse avec findings rempli par les chaînes WARNING: provenant des auditeurs de lockfile. Le tableau notes transporte les signaux informatifs NOTE: (par exemple, manifeste ignoré car non épinglé).

Le schéma 2.2 a ajouté — de manière additive — quatre champs aux entrées d’audit de lockfile : lockfile, manifest_ref, relation_summary (une classification directe/transitive/inconnue de chaque paquet signalé par rapport au manifeste frère), et un bloc policy enregistrant le niveau transitive en vigueur. Cette mise à niveau est rétrocompatible : les lecteurs des entrées 2.1 tolèrent les nouveaux champs, et le champ source.model reste présent à partir de la version 2.1.```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 Mode example (Bash hook, vulnerable pin denied) :```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 Mode example (Post-Install Bash hook called with no shim adjacent — broken install):```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:~
Un enregistrement en mode fail-open indique : « ce hook s’est déclenché mais est sorti prématurément sans auditer, car un prérequis manquait. » Utilisez le filtre jq ci-dessus (`select(.source.mode == "fail_open")`) pour faire remonter chaque perte silencieuse de protection dans votre journal.

Lorsque le shim s’exécute en mode dry-run (`SAFE_DEP_DRY_RUN=1`), les enregistrements incluent également `"mode": "dry_run"` afin que l’analyse a posteriori puisse filtrer les invocations d’audit uniquement.

## Prérequis

- Python 3.9+ (les hooks le détectent et passent en fail-open sur les interpréteurs plus anciens)
- `curl` (pour les appels API du registre et les vérifications de vulnérabilités OSV)
- Outils d’écosystème (facultatifs, la compétence retombe sur l’API OSV s’ils sont absents) :
  - `npm` pour les paquets npm
  - `pip-audit` pour les paquets Python
  - `bundle` pour les paquets Ruby
  - `dependency-check` pour les paquets Java

## FAQ

La justification des choix de conception (pourquoi `PostToolUse` plutôt que `PreToolUse`, pourquoi les signatures ne sont pas vérifiées, pourquoi les scripts et le shim sont dupliqués, les pièges de chargement de compétence, etc.) est documentée dans [`FAQ.md`](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md).
Télécharger l’outil