
Scansiona. Oscura. Commit pulito.
Trova il segreto. Correggilo. Esegui il commit pulito.
Gli scanner di segreti sono bravi a lanciare l'allarme e non molto utili a spegnerlo. Ti consegnano un elenco di credenziali compromesse e lasciano a te la pulizia. Credactor chiude il cerchio: trova un segreto hardcoded e lo riscrive sul posto, così una fuga di dati passa dal rilevamento alla correzione con un singolo comando.
Tenere le credenziali fuori dal codice sorgente è una pratica di sicurezza di base, non opzionale. Credactor rende quella base economica da mantenere, sulla tua macchina prima di un commit o in CI prima di un merge. Eseguilo da solo, o insieme agli scanner di cui ti fidi già.
# Credactor finds this:
db_password = "h8Tq2vKp9mRz4Wd"
# By default it rewrites the secret as a sentinel that fails loudly at runtime:
db_password = "REDACTED_BY_CREDACTOR"
# With --replace-with env, it writes a reference that reads from the environment:
db_password = os.environ["DB_PASSWORD"]
La redazione riscrive i file nel tuo working tree. Se un segreto è già stato committato, ruota la chiave e ripulisci anche la cronologia (ad esempio, con
git filter-repo). Riscrivere un file non sostituisce la revoca di una credenziale compromessa.
REDACTED_BY_CREDACTOR ben visibile che fallisce a runtime per impostazione predefinita, oppure un riferimento a variabile d'ambiente consapevole del linguaggio (Python, JavaScript/TypeScript, Go, Java/Kotlin, Ruby, PHP e shell) come os.environ["KEY"]. La sostituzione è codice valido. Se il file non include già l'import corrispondente (ad esempio import os), aggiungilo..bak automatici, protezioni sui confini dei symlink e sui permessi dei file, e mascheramento completo dei segreti in ogni output. Se non è possibile scrivere un backup sicuro, Credactor salta il file invece di riscriverlo alla cieca, e un crash durante la scrittura lascia l'originale intatto.--ci in sola lettura con codici di uscita precisi, un hook pre-commit e l'importazione dei report di Gitleaks, TruffleHog o Betterleaks. Rileva con lo scanner che già esegui, correggi con Credactor.pip install credactor
Richiede Python 3.11+. Nessun'altra dipendenza. Funziona su Linux, macOS e Windows (testato in CI su Linux e Windows).
Su macOS e Linux puoi installarlo con Homebrew:
brew install rxb06/tap/credactor
La formula installa in un proprio virtualenv e include l'extra opzionale
[encoding], quindi un'installazione con Homebrew rileva i segreti anche nei file
non UTF-8. Un semplice pip install credactor omette quell'extra; aggiungilo con
pip install 'credactor[encoding]' se vuoi la stessa copertura.
Dal sorgente:
git clone https://github.com/rxb06/credactor.git
cd credactor
pip install -e .
credactor funziona poi da qualsiasi directory.
Esegui prima
--dry-rune rivedi i risultati prima di redigere. I falsi positivi sono possibili, e con--fix-allun falso positivo viene riscritto. Sopprimi i valori noti come sicuri con# credactor:ignoreo una voce in.credactorignore.
credactor --dry-run . # scan, change nothing
credactor . # scan, then redact interactively (y/n per finding)
credactor --fix-all . # redact everything after one confirmation
credactor --fix-all --yes . # redact non-interactively (CI / scripts)
credactor --ci . # read-only gate: exit 1 on findings
credactor --replace-with env . # redact to env-var references instead of the sentinel
L'hook controlla solo il contenuto in stage, quindi un segreto già committato non viene segnalato di nuovo. Usa
credactor --scan-history .per controllare ciò che è già nel repo.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/rxb06/credactor
rev: v2.7.4 # pin to the latest release tag
hooks:
- id: credactor
- uses: rxb06/[email protected]
L'action passa sempre --ci, quindi segnala e fa da gate ma non riscrive mai il
checkout. I risultati fanno fallire lo step; imposta fail-on-findings: false per segnalare
senza fare da gate. Un errore fa fallire lo step in ogni caso.
Carica su Code Scanning invece di fallire sui risultati:
- uses: rxb06/[email protected]
with:
format: sarif
upload-sarif: true
fail-on-findings: false
Il job necessita di permissions: security-events: write per il caricamento. Vedi la
guida all'integrazione CI per ogni input,
inclusa l'importazione dei report di Gitleaks, TruffleHog e Betterleaks.
Credactor rileva i tipi di credenziali che trapelano più spesso e assegna a ciascuno una gravità per consentirti di fare triage a colpo d'occhio.
| Categoria | Esempi | Gravità |
|---|---|---|
| Chiavi di provider cloud | AWS (AKIA…), GCP (AIza…), Stripe (sk_live_…), Slack (xoxb-…) | Critica |
| Token di piattaforma | GitHub (ghp_, github_pat_), GitLab (glpat-), npm (npm_), PyPI (pypi-) | Critica |
| Chiavi private | Blocchi PEM (-----BEGIN … PRIVATE KEY-----) | Critica |
| JWT | Token a tre segmenti eyJ… | Alta |
| Stringhe di connessione | URL con credenziali inline (scheme://user:pass@host) | Alta |
| Variabili di credenziali | password = "…", api_key = "…", secret_key = "…" | Alta/Media/Bassa |
| Attributi XML | <add key="Password" value="…" /> | Alta/Media/Bassa |
| Stringhe ad alta entropia | hex tra virgolette (32–64 caratteri) / Base64 (60+ caratteri) | Media/Bassa |
I token deterministici dei provider (i prefissi sopra) vengono segnalati indipendentemente dall'entropia. I rilevatori euristici (JWT, stringhe di connessione, hex, Base64) devono superare una soglia di entropia. Hex o Base64 isolati vengono segnalati solo se tra virgolette. Un valore ad alta entropia non tra virgolette viene catturato solo su una variabile con nome di credenziale, il che risparmia gli SHA di git e i checksum. Per le regole complete di rilevamento e gravità, vedi il Manuale.
Il set di regole native di Credactor è più ristretto di quello di uno scanner dedicato, e alcuni formati di provider (ad esempio SendGrid, Twilio e i webhook di Slack) non vengono rilevati. Il suo punto di forza è la correzione: abbinalo a Gitleaks, TruffleHog o Betterleaks per il rilevamento più ampio, oppure eseguilo da solo.