Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
safer-dependencies — Livello di sicurezza automatico delle dipendenze per assistenti di codifica AI che controlla i pacchetti per CVE, typosquatting, abbandono, problemi di vetustà delle versioni e integrità degli hash negli ecosistemi npm, PyPI, RubyGems, Maven, Go e Rust. | Kitploit
Strumenti/GitHubGitHub/robert-auger/safer-dependencies
Scanner di VulnerabilitàDevSecOpsRilevamento SegretiSicurezza della Supply Chain
GitHubrobert-auger/safer-dependencies

safer-dependencies

Livello di sicurezza automatico delle dipendenze per assistenti di codifica AI che controlla i pacchetti per CVE, typosquatting, abbandono, problemi di vetustà delle versioni e integrità degli hash negli ecosistemi npm, PyPI, RubyGems, Maven, Go e Rust.

Vedi Repository
30569 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Dipendenze più sicure per Claude Code

Quando gli assistenti di codifica AI come Claude aggiungono pacchetti al tuo progetto, spesso scelgono qualunque versione sembri giusta — senza verificare se presenta vulnerabilità di sicurezza note, se il pacchetto è ancora mantenuto attivamente, o se il nome è a un refuso di distanza da un clone malevolo.

safer-dependencies è un livello di sicurezza per Claude Code: si posiziona tra Claude e i tuoi file manifest ed esegue automaticamente i suoi controlli di sicurezza: le installazioni vulnerabili vengono bloccate prima di essere eseguite, e una versione rischiosa scritta in un manifest viene corretta su disco subito dopo la scrittura. Rileva e corregge dipendenze rischiose — CVE, typosquatting, pacchetti abbandonati e problemi di età della versione, oltre a un periodo di attesa per le nuove release — su npm, PyPI, RubyGems, Maven, Go, Rust e PHP (Composer). Vedi CAPABILITIES.md per sapere esattamente cosa è e cosa non è coperto.

Nuovo qui? GETTING-STARTED.md ti porta da zero a un'installazione funzionante in circa cinque minuti.

Sicurezza e privacy: vedi SECURITY.md (divulgazione delle vulnerabilità), PRIVACY.md (trasmissione dati, nessuna telemetria) e CAPABILITIES.md (cosa lo strumento difende e cosa no).

Licenza (source-available — NON "open source" OSI): Libero da usare e modificare per i tuoi scopi, incluso l'uso interno aziendale/for-profit e la creazione di prodotti che vendi. È richiesta una licenza a pagamento separata per monetizzare il software — venderlo, distribuirlo all'interno di un prodotto o servizio venduto, o offrirne le funzionalità a terzi a pagamento (incluso hosted/SaaS/API). La ridistribuzione e i derivati devono mantenere la licenza e citare questo progetto. Vedi (Sezione 4 per la restrizione commerciale); richieste di licenza commerciale via .

solo
stesso
LICENSE
github.com/robert-auger

Contenuti

  • Per iniziare — da zero a installato in circa cinque minuti
  • Cosa fa
  • Cosa lo attiva
  • Cosa c'è in questo repository
  • Ecosistemi supportati
  • Installazione
    • Configurazione
    • Modifica del periodo di attesa
  • Livelli di avviso
  • Come funziona
    • Modalità Normale (Manuale)
    • Modalità Intercettazione (Automatica)
    • Modalità Pre-Installazione (Hook Bash)
    • Modalità Post-Installazione (Hook Bash)
    • Modalità Post-Agente (Coppia di Hook Agente)
  • Registro di controllo
  • Requisiti
  • FAQ

Per iniziare

GETTING-STARTED.md ti porta da zero a un'installazione funzionante in circa cinque minuti — prerequisiti, installazione interattiva e verifica. Per il riferimento completo all'installazione (installazioni globali/progetto/manuali, specifiche Windows, la allowlist dei permessi, aggiornamento e disinstallazione), vedi INSTALLATION.md.

Uso quotidiano: una volta installati gli hook, non c'è nulla da eseguire — safer-dependencies funziona automaticamente in background. Quando Claude aggiunge o installa pacchetti, segnala le dipendenze rischiose e aggiorna le versioni vulnerabili a una sicura sul posto — e blocca un'installazione nota come vulnerabile prima ancora che venga eseguita — così i pacchetti non sicuri vengono individuati e corretti senza che tu debba chiederlo. Puoi comunque invocarlo direttamente in qualsiasi momento: "è sicuro [email protected]?", "verifica la configurazione di safer-dependencies", o "mostra le statistiche di safer-dependencies".

Cosa fa

Quando Claude sta per aggiungere un pacchetto al tuo progetto, safer-dependencies intercetta ed esegue 5 controlli:

  1. Provenienza -- registro ufficiale, rilevamento typosquatting (npm/PyPI/RubyGems/Maven/crates.io), età del pacchetto
  2. Età della versione -- seleziona la versione stabile più recente pubblicata 7+ giorni fa (finestra di attesa)
  3. Scansione vulnerabilità -- API OSV, con strumenti nativi dell'ecosistema (npm audit, pip-audit, bundle audit) quando disponibili
  4. Integrità hash-pin -- per le righe di requirements.txt PyPI con pin --hash=sha256:..., l'hash dichiarato viene validato rispetto agli hash pubblicati da PyPI; una discrepanza genera un AVVISO
  5. Pacchetti abbandonati e obsoleti -- i pacchetti noti come abbandonati (es. paperclip, request, pycrypto, github.com/dgrijalva/jwt-go) vengono bloccati immediatamente con un sostituto suggerito; i pacchetti senza release stabile da 2+ anni ricevono un avviso consultivo STALE:. I pacchetti bloccati vengono rimossi dal manifest e Claude chiederà come procedere; i pacchetti solo obsoleti vengono lasciati al loro posto.

Se vengono rilevati problemi, Claude emette avvisi e può fare un passo indietro verso una versione più sicura. Tutti i controlli vengono registrati in ~/.claude/safer-dependencies-audit-YYYY-MM.log (un file per mese di calendario).

Cosa lo attiva

La skill si attiva automaticamente quando Claude:

Operazioni su manifest / installazione

  • Aggiunge o aggiorna un pacchetto in package.json, requirements.txt, Gemfile, pom.xml, build.gradle, Cargo.toml, go.mod o qualsiasi altro manifest supportato
  • Scrive un import, require o use per un pacchetto non già dichiarato nel manifest
  • Genera o aggiorna un file di lock (controlla solo le voci nuove/modificate)
  • Esegue un'installazione del package manager tramite Bash (npm install, bundle install, poetry install, uv sync, go mod tidy, ecc.) — Pre-Install controlla gli argomenti del comando, Post-Install controlla il lockfile risultante
  • Scrive un Dockerfile o un workflow CI (.github/workflows/*.yml, ecc.) che incorpora passaggi di installazione del package manager con versioni pinnate

Domande di selezione e raccomandazione

  • Confronti librerie/framework: "dovrei usare axios o node-fetch?", "moment vs dayjs?", "quale è meglio X o Y?"
  • Richieste di raccomandazione: "qual è un buon client HTTP per Python?", "raccomanda una libreria di logging per Go", "quale pacchetto gestisce CSV in Node?"
  • Selezione della versione: "quale versione di Django dovrei usare?", "ultima Flask stabile?"

Espressioni di intenzione d'uso (pre-aggiunta)

  • "Voglio usare FastAPI per questo", "sto pensando di aggiungere Celery", "stiamo valutando Prisma come ORM", "usiamo Tailwind"

Domande su salute e affidabilità dei pacchetti

  • "moment.js è ancora mantenuto?", "questa gemma è ancora attiva?", "X è abbandonato?", "X è EOL?", "posso fidarmi di questo pacchetto?", "quando è stato aggiornato l'ultima volta faker?"

Comandi di scaffolding

  • npx create-react-app, npm create vite@latest, django-admin startproject, rails new, cargo new + cargo add, "bootstrap di un nuovo progetto FastAPI"

Aggiunte implicite di pacchetti (richieste di funzionalità che implicano una nuova dipendenza)

  • "Aggiungi caching Redis all'app", "connettiti a Postgres", "aggiungi autenticazione JWT", "scrivi codice per inviare email" — si attiva quando nessun pacchetto per quella funzionalità è già nel manifest

Migrazione e porting

  • "Migra da requests a httpx", "passa da CRA a Vite", "porta da moment a date-fns" — controlla il pacchetto in arrivo

Non si attiva non per:

  • Import di librerie standard (os, fs, java.util.*, ecc.)
  • Dipendenze già dichiarate che non vengono modificate
  • Discussioni accademiche su come funziona internamente un pacchetto ("spiega il reconciler di React", "come funziona la risoluzione dei moduli di webpack?") — le domande di confronto e selezione attivano comunque la skill
  • Installazione di app a livello di sistema operativo, runtime o estensioni IDE (Python stesso, Docker, Homebrew, estensioni VS Code)

Cosa c'è in questo repository

Questo è un bundle skill + hook, non un singolo file di skill. Un'installazione completa distribuisce questi componenti:

FileRuolo
skills/safer-dependencies.mdLa skill (SKILL.md una volta installata). Descrive le procedure di controllo e include la modalità di gestione per installazione/statistiche.
skills/safer-dependencies-shim.shHook PostToolUse:Write/Edit — controlla le scritture di manifest e lockfile e corregge automaticamente le versioni vulnerabili sul posto (Modalità Intercettazione).
skills/safer-dependencies-pretooluse-bash.shHook PreToolUse:Bash — controllo OSV pre-volo dei comandi di installazione del package manager; nega i pin concreti vulnerabili prima che l'installazione venga eseguita (Modalità Pre-Installazione).
skills/safer-dependencies-posttooluse-bash.shHook PostToolUse:Bash — controllo post-volo dopo i comandi Bash; rileva CVE transitive nei lockfile appena scritti, manifest modificati tramite sed/jq/script e l'ambiente risolto di semplici pip install (Modalità Post-Installazione).
skills/safer-dependencies-pretooluse-agent.sh + skills/safer-dependencies-posttooluse-agent.shCoppia di hook PreToolUse:Agent + PostToolUse:Agent — colma il divario di copertura dei subagent. Le modalità 2–4 si attivano solo per le chiamate di strumenti della sessione root, quindi qualsiasi manifest scritto da un subagent le bypassa. Post-Agent controlla ciò che il subagent ha scritto dopo ogni ritorno di chiamata dello strumento Agent (Modalità Post-Agente).
skills/scripts/Libreria Python condivisa (safedep/) e script resolver autonomi usati da tutti gli hook.
skills/scripts/safer_dependencies_manager.pyModulo di gestione per installazione interattiva, statistiche d'uso e validazione della configurazione.

Il solo file di skill non è sufficiente — senza hook, l'invocazione automatica dipende dalla decisione di Claude di ricorrere alla skill. Installa tutti e cinque i componenti per una copertura completa; molte skill e slash command distribuiscono subagent internamente, quindi la coppia Post-Agente è importante anche se non ne generi mai esplicitamente uno. (Vedi FAQ.md per capire perché una skill da sola non può garantire la copertura.)

Ecosistemi supportati

EcosistemaManifestFile di lock
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

Installazione

Nuovo al progetto? Inizia con GETTING-STARTED.md. La versione breve:```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'installer chiede l'ambito (globale vs progetto) e quali hook abilitare, poi scrive `settings.json` per te — sia le voci degli hook **sia** la lista di autorizzazioni che consente ai comandi di controllo della skill di essere eseguiti senza richiesta di approvazione a ogni audit.

Tutto il resto relativo all'installazione si trova in **[INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md)**, il riferimento unico per i meccanismi di installazione: installazioni manuali file per file (a livello globale e di progetto), specifiche Windows, hook Post-Agent, la [lista di autorizzazioni](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist), la verifica della configurazione, l'aggiornamento, il blocco a un tag di release e la disinstallazione.

Dopo l'installazione, la gestione quotidiana avviene tramite linguaggio naturale con Claude — `install safer-dependencies` (riesegui / modifica gli hook), `show safer-dependencies stats`, `check safer-dependencies setup` — oppure tramite il menu `/safer-dependencies`. Anche l'aggiornamento avviene in sessione: `/safer-dependencies update` applica l'ultima release (`update --check` per una prova a secco, `update --rollback` per annullare); consulta [INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#in-session-self-updater-safer-dependencies-update) per il modello di fiducia.

> **Nota sulla piattaforma:** sono supportati macOS, Linux e Windows. Windows richiede Git for Windows (che fornisce bash) e Python 3 nel `PATH` — non serve WSL. I test pratici finora si sono concentrati su **macOS e Windows**; il supporto Linux è esercitato dalla matrice CI automatizzata.

### Configurazione

Due cose sono configurabili dopo l'installazione:

- **Lista di autorizzazioni** — pre-approva i comandi di controllo in sola lettura della skill (le regole `npm audit` / `bundle audit` in forma esatta e gli script resolver della skill stessa) così gli audit vengono eseguiti senza richiesta di approvazione ogni volta; `curl` non viene mai pre-approvato, e `npm view` / `pip-audit` sono opzionali tramite il profilo Convenience. L'installer interattivo scrive le voci principali per te; le installazioni manuali aggiungono il blocco completo a mano. Blocco completo e motivazione: [INSTALLATION.md → Lista di autorizzazioni](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist).
- **Criteri di sicurezza** — la finestra/modalità di attesa per l'età della release e un livello `off`/`warn`/`block` per ogni tipo di controllo, modificati con `/safer-dependencies config` e salvati in `~/.config/safer-dependencies/config.toml`. Schema e semantica dei livelli: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).

### Modifica del periodo di attesa

L'attesa (chiamata **cooloff** nella configurazione) è l'età minima che una release deve raggiungere prima che la skill la selezioni — predefinita **7 giorni**. Per modificarla, chiedi a Claude o esegui direttamente il comando di configurazione:```
/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

Gli stessi verbi funzionano anche al di fuori di una sessione Claude:```bash python3 skills/scripts/safer_dependencies_manager.py config set cooloff.days 14

root@kitploit:~
L'impostazione persiste in `~/.config/safer-dependencies/config.toml` (sezione `[cooloff]`); le variabili d'ambiente `SAFE_DEP_COOLOFF_DAYS` e `SAFE_DEP_COOLOFF_MODE` sovrascrivono il file per sessione. Tre comportamenti da conoscere: `mode = "off"` rimuove del tutto il filtro sull'età dalla selezione delle versioni; una riscrittura guidata da CVE bypassa il blocco, quindi una correzione di sicurezza non viene mai trattenuta perché troppo recente; e il blocco copre npm, PyPI, RubyGems e crates.io — Maven e Go sono intenzionalmente non bloccati. Semantica completa: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).

## Livelli di avviso

| Livello | Significato | Esempio |
|-------|---------|---------|
| CRITICAL | Ferma e chiedi all'utente | Typosquat rilevato, firma manomessa |
| HIGH | Avvisa e prosegui | CVE noto, pacchetto < 30 giorni |
| MEDIUM | Avvisa e prosegui | Versione < 7 giorni, firma mancante |
| LOW | Avvisa e prosegui | Gem Ruby non firmata (previsto) |

## Come funziona

La skill opera in cinque modalità (riassunte di seguito; la logica progettuale più approfondita si trova in `skills/safer-dependencies.md`):

### Modalità Normale (Manuale)

Quando Claude sta per scrivere un `import`, aggiungere un pacchetto a un manifest o aggiornare un file di lock, la skill viene eseguita inline nella tua sessione:

1. Interroga il registro dei pacchetti per le versioni stabili
2. Seleziona automaticamente la versione più recente pubblicata 7+ giorni fa (deterministica — nessun giudizio LLM)
3. Verifica le vulnerabilità note tramite strumenti dell'ecosistema e l'API OSV
4. Verifica le firme dei pacchetti dove disponibili
5. Emette avvisi se vengono trovati problemi, fissa la versione esatta
6. Registra il risultato nel registro di audit

La selezione della versione è gestita da script Python autonomi inclusi nella skill, non dall'LLM che interpreta regole. Il comando restituisce `SELECTED: <version>` e Claude usa esattamente quella versione.

### Modalità Intercettazione (Automatica)

Configura `.claude/settings.json` con un hook `PostToolUse` per abilitare la verifica automatica e trasparente dei pacchetti:

1. Claude scrive un file manifest (es. `package.json`) con la versione originariamente richiesta — il file viene salvato su disco
2. L'hook `PostToolUse` si attiva immediatamente dopo il completamento della scrittura e invoca `safer-dependencies-shim.sh`
3. Lo shim legge il file, analizza i pacchetti dichiarati ed esegue tutti i controlli di sicurezza (typosquat, abbandonato, CVE, obsolescenza, hash-pin)
4. Se sono necessarie correzioni, lo shim **riscrive il manifest sul posto** con versioni sicure (o rimuove le voci che non hanno una versione sicura)
5. Lo shim emette segnali (`UPDATED:`, `BLOCKED:`, `WARNING:`, `STALE:`, `MAJOR-UPDATE-CONFIRM:`, `REFACTOR-REQUIRED:`, `REGRESSION:`, `TYPOSQUAT-CONFIRM:`, `VERIFY:`, `CLEAN:`) tramite `hookSpecificOutput.additionalContext` su stdout. `REGRESSION:` precede un `MAJOR-UPDATE-CONFIRM:` quando il registro di audit mostra che lo stesso (file, pacchetto) è stato precedentemente corretto allo stesso target sicuro — cioè, un subagente o un piano obsoleto ha reintrodotto una versione con vulnerabilità nota, e l'orchestratore dovrebbe ripristinare la versione precedentemente approvata piuttosto che ridecidere il salto di versione maggiore.
6. Claude riceve questi segnali come promemoria di sistema ed esegue il lavoro di follow-up (trova gli import interessati, esegue i test, rifattorizza per le modifiche breaking)

**Nota di progettazione — Forma C (correttiva post-scrittura):** l'hook NON blocca le scritture. Ogni versione vulnerabile viene prima salvata su disco e poi corretta automaticamente nello stesso ciclo di utilizzo dello strumento. Questa è una scelta deliberata rispetto a un design bloccante `PreToolUse` — vedi [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) per i compromessi.

**Esempio di segnale:**```
UPDATED: aiohttp 3.8.5 → 3.9.0 (HIGH: 33 CVEs fixed)

L'agente genitore usa questi segnali per identificare il codice interessato e rifattorizzarlo secondo necessità.

Modalità Pre-Install (Hook Bash)

Configura .claude/settings.json con un hook PreToolUse:Bash per abilitare il controllo pre-volo dei comandi di installazione dei gestori di pacchetti. Questo integra (non sostituisce) la Modalità Intercept — insieme formano una difesa a strati.

  1. Claude tenta una chiamata allo strumento Bash (es. npm install [email protected])
  2. L'hook PreToolUse scatta prima che la chiamata venga eseguita e invoca safer-dependencies-pretooluse-bash.sh
  3. Un filtro rapido in puro bash cortocircuita i comandi non-PM in ~115 ms (senza invocazione di Python), quindi git status / ls / npm test pagano un costo trascurabile sul percorso critico
  4. Per le installazioni riconosciute dei gestori di pacchetti (npm/pnpm/yarn install/i/add), l'helper tokenizza tramite shlex, estrae ogni argomento pkg@version e lo invia a OSV
  5. Qualsiasi pin concreto vulnerabile → l'hook restituisce permissionDecision: "deny" con un GHSA-id per-finding + CVSS + riepilogo, più un suggerimento per invocare la skill safer-dependencies
  6. L'installazione non viene mai eseguita — nessun fetch di rete, nessuno script postinstall

Perché esiste in aggiunta alla Modalità Intercept: lo shim post-write è cieco a Bash. npm install [email protected] viene eseguito fino in fondo (e gli script postinstall vengono eseguiti) prima che qualsiasi audit scatti; npm install -g typosquat-pkg non scrive alcun manifest di progetto. La Modalità Pre-Install colma queste lacune strutturalmente.

La Modalità Pre-Install vede solo ciò che l'utente ha digitato (argomenti pkg@version sulla riga di comando). Non può vedere l'albero transitivo che il resolver installerà effettivamente. La Modalità Post-Install (sotto) controlla il lockfile una volta che l'installazione è completata — le due modalità sono complementari, non ridondanti.

Ambito: le CLI dei gestori di pacchetti qui coperte abbracciano cinque ecosistemi (npm/pnpm/yarn/bun/npx/deno, pip/pip3/pipx/pipenv/uv/uvx/poetry, gem/bundle, go, cargo), più Maven tramite la Modalità Intercept (le dipendenze Maven sono tipicamente dichiarate in pom.xml/build.gradle, non aggiunte tramite un verbo CLI).

Lacuna nota: la CLI Maven supporta download diretti tramite mvn dependency:get -Dartifact=group:art:version e mvn dependency:copy. Questo hook non riconosce ancora tali invocazioni. Se le usi regolarmente, lo shim post-write esistente cattura comunque tutto ciò che finisce nel tuo manifest, ma la protezione pre-fetch si applica solo agli ecosistemi elencati sopra. Tracciato come follow-up.

Sintassi riconosciuta per ecosistema:

PMVerbiSintassi pin concreto
npm, pnpm, yarn, buninstall, i, add (più yarn/pnpm dlx, bun x, yarn create)[email protected], @scope/[email protected]
npx(senza verbo — il pacchetto è il primo argomento posizionale)[email protected]
denoadd, installnpm:[email protected] (specifiche con prefisso npm)
pip, pip3, pipx, pipenv, uv, uvx, poetryinstall (pip/pip3/pipx/pipenv) / add (uv/poetry) / senza verbo (uvx)pkg==1.2.3 (gestiti anche gli extra pkg[extra]==X)
gem, bundleinstall (gem) / add-v 1.2.3, --version 1.2.3, --version=1.2.3 (flag separato)
goget, install[email protected] (deve includere il prefisso v secondo i moduli Go)
cargoadd, install[email protected]

I pin di intervallo (npm ^4.17, pip >=, poetry ^/~, Go @latest) e le versioni non specificate passano alla Modalità Intercept dopo l'installazione — lo shim post-write controlla ciò che il resolver sceglie. La riscrittura automatica a una versione sicura è in coda come follow-up.

Modalità di errore: fail-open. Qualsiasi errore (Python mancante, problema di rete, input malformato) esce con 0 e nessun output, consentendo a bash di procedere. La Modalità Intercept viene comunque eseguita dopo l'installazione, quindi un pre-flight fallito degrada con garbo verso la protezione esistente.

Esempio di deny:``` 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:~
### Modalità Post-Installazione (Hook Bash)

Configura `.claude/settings.json` con un hook `PostToolUse:Bash` per abilitare
il controllo post-esecuzione dopo i comandi Bash. Esegue **tre scansioni indipendenti**
sulla `cwd` del comando, ciascuna delle quali colma una lacuna che gli altri hook non possono coprire:

- **Scansione A — file di lock.** Dopo un verbo di installazione riuscito (`npm install`,
  `bundle install`, `poetry install`, `uv sync`, `go mod tidy`, ecc.), controlla
  i file di lock modificati di recente (`package-lock.json`, `Gemfile.lock`,
  `poetry.lock`, `uv.lock`, `go.sum`, `yarn.lock`, `pnpm-lock.yaml`,
  `Pipfile.lock`). Questo colma la **lacuna delle CVE transitive** che Pre-Install non può
  vedere: l'utente ha digitato `pkg@version`, ma il resolver potrebbe aver incluso
  decine di dipendenze transitive che nessuno ha nominato.
- **Scansione B — manifest.** Dopo qualsiasi comando Bash *non* presente in una
  denylist di sola lettura (`ls`, `cat`, `git status`, …), controlla i manifest
  modificati di recente. Questo è l'**unico** fallback per le modifiche ai manifest effettuate tramite `sed -i`, `jq` o
  uno script — queste bypassano lo strumento `Write`/`Edit` su cui si aggancia la Modalità Intercettazione.
- **Scansione C — ambiente risolto.** Un semplice `pip install` /
  `pip install -r requirements.txt` non scrive alcun file di lock, quindi la Scansione A non vede mai
  l'albero risolto. Dopo un'installazione di tipo pip, la Scansione C richiama nuovamente lo stesso
  pip con un `list --format=json` di sola lettura e verifica tramite OSV l'intero ambiente
  risolto (diretto + transitivo).

Come viene eseguita una scansione:

1. Claude esegue una chiamata allo strumento Bash
2. L'hook `PostToolUse` scatta *dopo* il completamento del comando e richiama
   `safer-dependencies-posttooluse-bash.sh`
3. Un filtro rapido in puro Bash cortocircuita i comandi che non corrispondono ad alcun gate di scansione in
   ~115 ms (stessa convenzione di percorso rapido di Pre-Install), quindi `ls` / `git` / `cat`
   comportano un costo trascurabile
4. Ogni scansione attraversa la `cwd` con `find -maxdepth 5` (copre i layout monorepo;
   esclude `node_modules`, `.git`, `.venv`, `venv`) cercando file modificati negli
   ultimi 60 s — sovrascrivibile tramite `SAFE_DEP_POSTINSTALL_MTIME_WINDOW`
5. Per ogni file modificato di recente (Scansione A/B), l'hook crea un payload sintetico
   `PostToolUse:Write` e lo inoltra allo shim esistente — gli auditor di file di lock e manifest
   dello shim vengono eseguiti invariati, senza logica duplicata
6. I segnali per-file vengono concatenati ed emessi come un unico JSON `hookSpecificOutput`
   all'agente padre

**Cosa rileva che Pre-Install non rileva:** vulnerabilità transitive.
Un `bundle install` dall'aspetto pulito può includere `[email protected]` (CVE-2025-27610)
come dipendenza transitiva di `sinatra` — l'utente non ha mai digitato `rack`, quindi
Pre-Install non può vederlo, ma Post-Install legge il `Gemfile.lock` risolto
e segnala la CVE.

**Ambito:** la Scansione A non riscrive le versioni risolte — il contratto di
auto-correzione si applica solo ai manifest che Claude ha scritto direttamente. Per le CVE transitive,
la soluzione è tipicamente "aggiornare la dipendenza diretta che possiede la transitiva," il che
richiede giudizio umano. La Scansione B *esegue* l'auto-correzione, perché controlla i manifest
attraverso lo stesso percorso dello shim della Modalità Intercettazione. La Scansione A viene saltata quando il
livello di controllo `transitive` è impostato su `off` (`config set checks.transitive off`).

**Modalità di errore:** fail-open, come gli altri hook. Qualsiasi errore (shim
mancante, payload malformato, Python non disponibile) esce con codice 0 in silenzio.

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

Modalità Post-Agent (Coppia di Hook Agent)

Le quattro modalità sopra si attivano solo per le chiamate di strumenti della sessione root. Quando la sessione root invia un subagent (tramite lo strumento Agent — molte skill e comandi slash lo fanno internamente), le chiamate Write/Edit/Bash del subagent bypassano tutte queste modalità. La Modalità Post-Agent è la rete di sicurezza reattiva per questa lacuna.

  1. Un hook PreToolUse:Agent (safer-dependencies-pretooluse-agent.sh) viene eseguito immediatamente prima di ogni invio di Agent e tocca un file sentinella in /tmp/.safer-deps-agent-<PPID>-<session_id>.sentinel (con fallback a un nome basato solo sul PPID quando non è disponibile un session id)
  2. Il subagent viene eseguito e può scrivere manifest o lockfile
  3. Un hook PostToolUse:Agent (safer-dependencies-posttooluse-agent.sh) viene eseguito dopo che la chiamata Agent restituisce il controllo, esegue find su ogni manifest e lockfile più recente della sentinella e li controlla tramite lo stesso percorso shim
  4. I risultati emergono come additionalContext nel turno successivo della sessione root; la sentinella viene rimossa

I subagent annidati sono coperti automaticamente — il PostToolUse:Agent della root si attiva solo dopo che tutto il lavoro dell'agente esterno (incluso qualsiasi cosa esso abbia inviato) è su disco. L'unica lacuna è un'installazione globale che non scrive alcun manifest o lockfile (npm install -g …): non c'è nulla da scansionare. Come gli altri hook, fallisce in modalità aperta — qualsiasi errore (sentinella mancante, shim mancante, payload illeggibile) esce con 0 in silenzio. La logica progettuale completa è in skills/safer-dependencies.md.

Registro di controllo

Ogni controllo viene registrato in ~/.claude/safer-dependencies-audit-YYYY-MM.log (un file per mese di calendario, dove YYYY-MM è il mese-anno UTC) come singola riga JSON. È possibile sovrascrivere il percorso completo con la variabile d'ambiente SAFE_DEP_AUDIT_LOG (quando impostata, il suffisso della data non viene aggiunto). I file vengono anche ruotati per dimensione quando superano SAFE_DEP_LOG_MAX_BYTES (default 10 MiB; impostare a 0 per disabilitare). Impostare SAFE_DEP_MODEL per sovrascrivere il valore del modello scritto in source.model in ogni voce — utile per confronti A/B tra versioni di modelli.

Tutte e cinque le modalità aggiungono allo stesso file. Ogni voce include un blocco source (schema 2.2) che identifica quale componente l'ha scritta:

source.componentScritto daTrigger
shim.posttooluseshim.shScrittura di manifest o lockfile (Modalità Intercettazione, dispatch Post-Install)
shim.install_errorshim.shErrore di installazione preflight dello shim
bash.pretoolusepretooluse-bash.shComando di installazione Bash (Modalità Pre-Install)
bash.posttooluseposttooluse-bash.shL'hook Bash Post-Install stesso, quando fallisce in modalità aperta prima di raggiungere lo shim
agent.pretoolusepretooluse-agent.shRiservato agli eventi Pre-Agent in modalità aperta (l'hook stesso è attualmente silenzioso in caso di successo)
agent.posttooluseposttooluse-agent.shEventi dell'hook Post-Agent in modalità aperta (es. shim mancante, python_missing)
manual.skillClaude in esecuzione in Modalità NormaleControllo manuale invocato inline

source.model registra il modello Claude Code attivo nella sessione (es. "claude-sonnet-4-6"). Presente nello schema 2.1+; le voci scritte da installazioni precedenti omettono il campo. Il comando stats degrada con grazia a "unknown" quando è assente.

Filtra per source.component con 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:~
Per un'analisi più semplice, chiedi a Claude le statistiche di utilizzo invece di analizzare i log manualmente:```
"Show safer-dependencies stats for the last month"

Questo fornisce riepiloghi leggibili dall’uomo delle attività, dell’impatto sulla sicurezza e delle metriche di prestazione estratte da questi log di audit.

Forme delle voci (schema 2.2). Tre forme distinte condividono la stessa intestazione ts / schema / source:

FormaQuando viene scrittaCampi distintivi
Voce di auditAudit di manifest / lockfile / installazione bashfile, ecosystem, checked, findings, abandoned, stale, typosquat, unknown, signatures, notes, clean
Voce di errore di installazioneErrore di installazione preflight dello shim (componente shim.install_error)install_error, shim_dir, scripts_dir
Voce fail-openQualsiasi punto di ingresso hook termina anticipatamente a causa di helper_missing / shim_missing / python_missing. source.mode è "fail_open"fail_open: { reason, detail? }

Voci di audit: la Modalità Intercettazione esegue l’intera pipeline (provenienza, età della versione, OSV, abbandonati/obsoleti, typosquat, firme), quindi tutti gli array possono essere popolati. La Modalità Pre-Installazione oggi esegue solo OSV, quindi abandoned / stale / typosquat / signatures sono sempre vuoti. L’invio Post-Installazione (audit del lockfile) scrive sotto shim.posttooluse con findings popolato dalle stringhe WARNING: dei revisori del lockfile. L’array notes trasporta segnali informativi NOTE: (ad es. manifest-saltato-perché-non-pinnato).

Lo schema 2.2 ha aggiunto — in modo additivo — quattro campi alle voci di audit del lockfile: lockfile, manifest_ref, relation_summary (una classificazione diretta/transitiva/sconosciuta di ciascun pacchetto segnalato rispetto al manifest correlato) e un blocco policy che registra il livello transitive in vigore. L’aggiornamento è retrocompatibile: i lettori delle voci 2.1 tollerano i nuovi campi, e il campo source.model rimane presente dalla 2.1 in poi.```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 (hook Bash Post-installazione chiamato senza shim adiacente — installazione non riuscita):```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 evento fail-open indica: "questo hook si è attivato ma è uscito in anticipo senza eseguire l'audit perché mancava un prerequisito." Usa il filtro jq sopra (`select(.source.mode == "fail_open")`) per far emergere ogni evento silenzioso di perdita di protezione nel tuo log.

Quando lo shim viene eseguito in modalità dry-run (`SAFE_DEP_DRY_RUN=1`), le voci includono anche `"mode": "dry_run"` così l'analisi post-hoc può filtrare le invocazioni di solo audit.

## Requisiti

- Python 3.9+ (gli hook lo rilevano e falliscono in modalità fail-open su interpreti più vecchi)
- `curl` (per le chiamate API del registry e i controlli delle vulnerabilità OSV)
- Strumenti dell'ecosistema (opzionali, la skill ripiega sull'API OSV se mancano):
  - `npm` per i pacchetti npm
  - `pip-audit` per i pacchetti Python
  - `bundle` per i pacchetti Ruby
  - `dependency-check` per i pacchetti Java

## FAQ

La logica delle decisioni di progettazione (perché `PostToolUse` invece di `PreToolUse`, perché le firme non vengono verificate, perché script e shim sono duplicati, problemi di caricamento delle skill, ecc.) è documentata in [`FAQ.md`](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md).
Scarica lo strumento