
keyhog v0.5.47
Scanner di segreti open-source in Rust
Sito web · Documentazione · Architettura · Motore GPU Vyre
KeyHog: scanner di segreti accelerato via GPU per codice, cloud e CI
KeyHog è uno scanner di segreti open-source in Rust che trova e verifica chiavi API, token, password e credenziali esposte in codice sorgente, cronologia Git, container, storage cloud, asset del browser, contenuti collaborativi e sistemi in esecuzione.
La maggior parte degli scanner di segreti si ferma alle corrispondenze regex su CPU in un checkout del repository. KeyHog combina 934 rilevatori specifici per servizio, decodifica per credenziali occultate, prove contestuali con soppressione, verifica live tramite provider, ed esecuzione di prima classe su CUDA, Metal e WGPU tramite Vyre. La calibrazione misura ogni backend CPU puro-Rust idoneo, Hyperscan/SIMD e GPU. Il routing automatico utilizza quindi il percorso più veloce con parità dimostrata per l'esatto host e classe di carico di lavoro.
| La GPU è un backend reale | Scansiona la superficie d'attacco effettiva | Separa il segnale dal rumore | Agisci sul risultato |
|---|---|---|---|
| CUDA, Metal nativo e WGPU sono peer misurati, non una catena di fallback silenziosa. | Scansiona cronologia Git, layer Docker, archivi, bucket cloud, source map, WASM, catture HAR, raccolte Git ospitate e interi sistemi. | Decodifica base64, hex, URL, protobuf, multilinea e configurazione strutturata prima di applicare prove, soppressione di esempi e baseline. | Verifica le credenziali idonee con le API dei provider, emetti SARIF o envelope strutturati e preserva copertura esatta e semantica di uscita. |
| cargo install --locked keyhog | |||
| keyhog scan . |
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/dfb768a9b8e8fa64082992f11d0b284d5ec6a199fc1eac85e0352fb20452186f.gif" alt="Scansione KeyHog che mostra gravità, evidenza, file e riga, rimedio, risultati e stato di copertura" width="900" />
</p>
## Uno scanner di segreti costruito attorno alla GPU
KeyHog non affida poche espressioni regolari a un generico compute shader.
Il suo percorso GPU è basato su [Vyre](https://github.com/santhreal/vyre), un
substrato di calcolo GPU in Rust sviluppato insieme a KeyHog. I trigger dei
rilevatori vengono compilati in tabelle immutabili residenti nella GPU. Lotti
di sorgenti limitati producono posizioni di corrispondenza complete per la
stessa pipeline di conferma, soppressione, evidenza e reporting utilizzata
dai percorsi CPU e Hyperscan.
- **Tre peer GPU fisici.** CUDA, Metal nativo e WGPU portabile vengono
acquisiti, misurati e riportati in modo indipendente.
- **Parità esatta dei risultati.** La calibrazione rifiuta un candidato la cui
identità di rilevamento differisce dal percorso di riferimento. Una risposta
errata più veloce non entra mai nella tabella di routing.
- **Evidenza persistente del percorso.** KeyHog registra il binario, il corpus
dei rilevatori, la configurazione, la classe di carico di lavoro, l'host,
l'acceleratore, il driver e l'evidenza temporale misurata. Le scansioni
normali non eseguono benchmark nel percorso critico.
- **Esecuzione residente.** I worker daemon mantengono caldi lo stato compilato
dei rilevatori e dell'acceleratore per lotti ripetuti di file, archivi,
cronologia, remoti e cloud.
- **Nessuna via di fuga CPU nascosta.** Un acceleratore selezionato
esplicitamente che non riesce a inizializzarsi o a eseguire il dispatch
fallisce in modo visibile invece di restituire risultati CPU sotto
un'etichetta GPU.
L'installazione predefinita da crates.io utilizza il percorso CPU portabile
puramente in Rust, quindi funziona su un host Rust pulito. Abilita i tre peer
GPU senza acquisire Hyperscan:```sh
cargo install --locked keyhog --no-default-features --features portable,gpu
Abilita il peer regex SIMD Hyperscan o Vectorscan:```sh cargo install --locked keyhog --no-default-features --features portable,simd
Esegui la diagnostica del backend di produzione, quindi ispeziona la route misurata:```sh
keyhog backend --self-test
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
La guida al backend documenta le tabelle residenti, il modello di dispatch limitato, il contratto di parità e le prove riproducibili di crossover.
Per iniziare
Installa ed esegui la tua prima scansione
I due comandi sopra installano l'ultima release di crates.io e scansionano l'albero corrente con il percorso portabile puramente in Rust.
Blocca un ambiente CI a una release esatta con
cargo install --locked --version '=0.5.86' keyhog. KeyHog richiede Rust 1.89
o successivo. Consulta la guida all'installazione
per i profili GPU, Hyperscan, CI, portabile e di build da sorgente.
KeyHog esce con codice 1 quando un risultato blocca la policy di evidenza attiva. La policy
predefinita blocca i risultati likely e confirmed mantenendo visibili i risultati review
con uscita 0; --evidence-policy paranoid blocca ogni livello. Esamina
il livello di evidenza esatto, il codice motivo, il file, la riga, il rilevatore e la
correzione di ogni risultato. Altri codici diversi da zero descrivono errori di input, di sistema, di verifica o di
copertura; consulta il
riferimento dei codici di uscita.
Il contratto di processo completo è:
| Uscita | Significato |
|---|---|
0 successo | Nessun risultato blocca la policy di evidenza attiva e non si è verificato alcun errore di copertura. I risultati di livello review possono rimanere visibili con la policy predefinita. |
1 risultati bloccanti | Almeno un risultato blocca la policy di evidenza attiva, ma nessuno è stato confermato come live. |
2 errore dell'operatore | Correggi gli argomenti, la configurazione, il corpus di rilevatori o l'input correggibile dall'operatore. |
3 errore di sistema | Ripara o riprova l'esecutore. Include I/O di basso livello, servizio daemon fatale, cache incrementale ed errori SIMD selezionati esplicitamente. |
4 errore di salute/self-test | Un controllo di salute doctor o backend --self-test non era sano. |
10 credenziali live | Almeno una credenziale è stata confermata come live. |
11 panico dello scanner | Scarta il risultato della scansione perché lo stato dello scanner non è affidabile. |
12 errore GPU richiesto | Un percorso GPU selezionato o richiesto esplicitamente non ha potuto essere eseguito. |
13 copertura incompleta | Una sorgente richiesta è fallita o la copertura dell'input era incompleta e nessun esito di risultato ha avuto precedenza. |
130 interrotto | SIGINT o Ctrl-C ha interrotto il processo. |
Filtra, formatta, blocca:
Crea una baseline prima di usarla come filtro:```sh keyhog scan . --create-baseline .keyhog-baseline.json keyhog scan . --baseline .keyhog-baseline.json --format json-envelope --output keyhog.json
Il primo comando salva le findings esaminate ed esce con `0` senza stamparle.
Esegui il commit di quel file, poi usa il secondo comando per segnalare solo le nuove identità delle findings. Una voce di baseline corrisponde al rilevatore e al valore della credenziale, mai al percorso del file, quindi spostare un segreto registrato non fa fallire il gate, ma ruotarlo sì. Le credenziali modificate e la copertura incompleta restano visibili. Il percorso completo, incluse le partizioni dei monorepo, è [Fail only on new secrets](https://santhreal.github.io/keyhog/workflows/ci.html#fail-only-on-new-secrets).
Per la scansione successiva, usa il [recipes cookbook](https://santhreal.github.io/keyhog/recipes.html) o i comandi copiabili in [Choose the right workflow](#choose-the-right-workflow). Puoi scansionare la cronologia Git, le immagini dei container, i bucket cloud, le raccolte di repository, gli URL e un'intera macchina senza cambiare strumento.
### Proteggi i repository per scansioni pre-commit rapide
Registra un repository con il daemon perpetuo di KeyHog per la rilevazione rapida dei segreti pre-commit (richiede Unix; su Windows usa `keyhog scan` in-process):```sh
# 1. Start the daemon (accelerated by CUDA, Metal, WGPU, or SIMD)
keyhog guard up
# 2. Guard your repository (indexes baseline and installs pre-commit hook in one step)
keyhog guard add /path/to/repo
# 3. Every staged commit checks only changed blobs against in-memory attestations
keyhog scan --git-staged
# 4. View all active guarded repositories and their states
keyhog guard list
# 5. Turn the daemon on and off cleanly without losing registrations or durable index
keyhog guard down
Vedi la guida alla guardia perpetua e il workflow pre-commit per la configurazione completa, il ciclo di vita della macchina a stati e l'automazione degli hook.
Aggiungilo a GitHub Actions
Crea .github/workflows/keyhog.yml:```yaml
name: keyhog
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
security-events: write
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: santhreal/keyhog@v0
with:
path: .
severity: high
L'azione esegue la scansione dell'albero estratto, fallisce in caso di risultati a livello `high` o `critical`, carica il SARIF su Code Scanning e conserva il report come artefatto del workflow. Anche gli errori di installazione, copertura, backend e pubblicazione del report causano il fallimento del job.
Consulta la [guida all'azione GitHub](https://santhreal.github.io/keyhog/workflows/github-action.html) per input, output, adozione della baseline, partizioni monorepo, verifica e comportamento in caso di errore. Usa la [guida CI](https://santhreal.github.io/keyhog/workflows/ci.html) per GitLab, CircleCI, Jenkins, Buildkite e job shell generici. Usa la [guida alla scansione di massa](https://santhreal.github.io/keyhog/guides/mass-scanning.html) per organizzazioni di repository, gruppi Git ospitati, bucket cloud e inventari partizionati.
## Superfici di scansione che altri strumenti trattano come prodotti separati
KeyHog esegue la scansione dei byte nel punto in cui possono fuoriuscire, non solo dei file sorgente tracciati. Usa un report per ogni confine, così la CI conserva la copertura esatta e lo stato di errore.
| Superficie di esposizione | Esempio |
|---|---|
| Artefatto del pacchetto finale | Esegui `npm pack`, poi scansiona il `.tgz` prodotto con `keyhog scan package.tgz`. L'espansione dell'archivio controlla file generati, source map, fixture e metadati assenti dall'albero sorgente previsto. |
| Applicazione browser distribuita | `keyhog scan --url https://app.example.com/assets/app.js` segue la decodifica limitata di JavaScript, source-map, WASM e risposte senza trasformare lo scanner in un crawler illimitato. |
| Issue GitHub, pull request, discussioni, wiki e gist | `keyhog scan --github-collaboration owner/repo --github-all` esegue la scansione di ogni superficie collaborativa al di fuori del checkout. |
| Configurazione di agenti AI e MCP | `keyhog scan ~/.config ~/.claude ~/.codex` applica lo stesso pipeline di rilevamento, decodifica, evidenza e report alla configurazione locale degli strumenti. |
| Layer di immagini container | `keyhog scan --docker-image registry.example.com/team/app:v1` esegue la scansione del contenuto dell'immagine che verrà eseguito, inclusi i file introdotti durante la build. |
| Inventari di oggetti cloud | `keyhog scan --s3-bucket BUCKET`, `--gcs-bucket BUCKET` o `--azure-container-url URL` conserva la paginazione del provider, gli oggetti e la copertura dei limiti di byte nel report del terminale. |
| Intero host di sviluppo | `sudo keyhog scan-system --space 50G` rileva i filesystem montati e la cronologia Git raggiungibile sotto un budget di archiviazione rigido. |
Questi percorsi condividono un unico contratto di rilevamento e report. Un errore specifico della sorgente non può trasformarsi silenziosamente in una scansione locale più ristretta.
## Scegli il workflow giusto
Scegli prima il confine della sorgente. Un preset cambia il lavoro di rilevamento, mentre un backend cambia l'esecuzione. Nessuno dei due estende una scansione dell'albero di lavoro alla cronologia Git, a un inventario del provider, allo storage cloud o a un audit dell'host.
Non esiste una scorciatoia onesta per `scan everything`. Una revisione completa del patrimonio esegue i confini pertinenti di seguito come job separati e conserva ogni report `json-envelope` con il suo codice di uscita grezzo.
| Esigenza | Inizia con | Throughput e riutilizzo | Confine di copertura |
|---|---|---|---|
| Feedback locale rapido | `keyhog scan . --fast --incremental` | Riutilizza gli hash dei file invariati. Il preset fast salta il lavoro di decodifica, entropia e ML. | Esegui la policy predefinita prima del merge perché fast è intenzionalmente più ristretto. |
| Scansione completa del repository | `keyhog scan .` | `auto` calibrato e default worker basato su core CPU. Aggiungi `--incremental` per scansioni ripetute dello stesso albero attendibile. | Solo file correnti. Non aggiunge la cronologia Git. |
| Gate di commit staged | `keyhog scan --git-staged` o `keyhog hook install` | Legge i blob esatti dell'indice, quindi le modifiche non staged non possono cambiare il risultato. | Solo contenuto staged. Esegui una scansione dell'albero di lavoro separatamente quando i byte locali non staged contano. |
| Guardia perpetua del repository | `keyhog guard add . --mode repo` poi `keyhog guard status .` | Registro root residente nel daemon con macchina a 7 stati, cache di attestazione pulita e tracciamento dell'identità della policy. | Richiede un daemon in esecuzione. La guardia integra, non sostituisce, le scansioni staged e dell'albero di lavoro. |
| Gate per pull request GitHub | `santhreal/keyhog@v0` | L'azione installa, esegue la scansione, pubblica SARIF e un artefatto, poi conserva lo stato di KeyHog. | Un percorso estratto. Usa la scansione dell'inventario del provider per un'organizzazione. |
| GitLab, Jenkins, Buildkite o shell CI | `keyhog scan . --format json-envelope --output keyhog.json` | Conserva il report e il codice di uscita su successo, risultati ed errori. Usa `--git-diff <base>` solo per un gate esplicitamente più ristretto sulle righe modificate. | I byte presenti nel checkout o il diff selezionato. |
| Adotta un repository con risultati noti | Crea `.keyhog-baseline.json`, committalo, poi esegui la scansione con `--baseline .keyhog-baseline.json`. | Le identità esistenti restano visibili nella baseline mentre solo i nuovi risultati fanno fallire il gate. | Una baseline non sopprime credenziali modificate o copertura incompleta. |
| Recupero Git ricorsivo | `keyhog scan --deep --git-history . --git-blobs . --daemon=off` | Calibra la policy deep una volta per classe di worker. Esegui in-process. | Un repository. `--git-history` copre solo l'ascendenza del checkout corrente, quindi un branch mai estratto viene mancato senza gap di copertura; `--git-blobs` raggiunge anche blob orfani, commit rimossi con amend, stash, note, messaggi di tag annotati e ref impacchettati. |
| Ispezione di container o archivi | `keyhog scan --docker-image registry/app:v1` o `keyhog scan incoming/` | Conserva un report envelope così i membri saltati, corrotti, crittografati, non sicuri o sovradimensionati restano visibili. | Solo l'immagine o il percorso filesystem selezionato e i formati annidati supportati. |
| Ispezione di URL, risposta o HAR | `keyhog scan --url https://api.example.com/config` o `keyhog scan capture.har` | Usa limiti di sorgente limitati e conserva l'envelope del terminale. | Solo risposte recuperate o voci di cattura. Non è un crawler. |
| Inventario di organizzazione o cloud | `keyhog scan --daemon=off --github-org acme --format json-envelope --output acme.json` | Partiziona per provider, proprietario o bucket. Esegui partizioni indipendenti in concorrenza con un report e uno stato ciascuna. | Un inventario del provider selezionato per job. I limiti di paginazione o oggetti restano confini di copertura. |
| Conferma se i risultati idonei sono attivi | `keyhog scan . --verify` | La concorrenza del provider e i controlli di frequenza sono separati dai worker dello scanner. | Invia richieste derivate dalle credenziali agli endpoint dichiarati del provider. Non tutti i rilevatori supportano la verifica. |
| Scansione sanitaria dell'intero host | `sudo keyhog scan-system --space 50G` | Usa tutti i core CPU per impostazione predefinita e scansiona la cronologia Git rilevata dopo i dati del filesystem. | Filesystem montati locali. I mount di rete sono opt-in e il tetto di spazio è rigido. |
| Directory, cronologia, archivio, remoto o inventario cloud con GPU su Unix | Calibra l'autoroute, avvia `keyhog daemon start --mass`, poi esegui `keyhog scan --daemon=mass <SOURCE>`. | Trasmette batch limitati attraverso un worker compilato CPU, Hyperscan, CUDA, Metal o WGPU. Aggiungi `--incremental` per alberi filesystem caldi invariati. La ricevuta del terminale riporta totale esatto e batch GPU, chunk, byte, quota GPU e throughput. | Baseline, verifica, lockdown, preset, overlay e altre modifiche alla policy dello scanner vengono rifiutate prima dell'acquisizione. Lo stato incrementale si applica solo alle radici filesystem locali del daemon. |
### Scansiona ogni confine di sorgente supportato
Usa un comando per confine. Conserva un report `json-envelope` e lo stato di uscita grezzo per ogni partizione dell'inventario.
| Sorgente o caso d'uso | Comando |
|---|---|
| Più radici locali | `keyhog scan services/api services/web deploy/` |
| File modificati in continuazione | `keyhog watch services/api deploy/` |
| Byte staged, righe modificate, cronologia raggiungibile o blob | `keyhog scan --git-staged`, `--git-diff main`, `--git-history .` o `--git-blobs .` |
| Binari nativi e stringhe firmware | `keyhog scan --binary firmware.bin` (una scansione di directory semplice salta i binari ed esce comunque con `0`) |
| Archivi e sorgenti compressi | `keyhog scan incoming/` (i membri supportati si espandono automaticamente) |
| Layer di immagini Docker | `keyhog scan --docker-image registry/app:v1` |
| JavaScript, source map, WASM o risposta di un endpoint | `keyhog scan --url https://api.example.com/config` |
| Catture di richieste e risposte HTTP | `keyhog scan capture.har` |
| Issue GitHub, pull request, discussioni, wiki e gist | `keyhog scan --github-collaboration owner/repo --github-all` |
| Inventari GitHub, GitLab o Bitbucket | `--github-org ORG`, `--gitlab-group GROUP` o `--bitbucket-workspace WORKSPACE` |
| Inventari S3, GCS o Azure Blob | `--s3-bucket BUCKET`, `--gcs-bucket BUCKET` o `--azure-container-url URL` |
| Uno stream limitato da un altro strumento | `producer \| keyhog scan --stdin` (usa `set -o pipefail` così un producer fallito fa emergere il proprio errore, non una scansione a zero byte) |
Una scansione di directory semplice non legge i binari nativi. Ognuno diventa un gap di copertura `binary (estensione o sniff del contenuto)`, la scansione esce comunque con `0` e `--no-default-excludes` non lo cambia, quindi passa `--binary` quando gli artefatti compilati sono in scope. Quel flag richiede una build con la feature `binary`, che l'installazione crates.io predefinita ha e la feature snella `ci` non ha.
L'estrazione di binari nativi riporta credenziali complete che soddisfano il contratto di forma esplicito di un rilevatore nominato. Sopprime frammenti brevi di prefisso e stringhe generiche a forma di assegnazione dalle sezioni dati compilate perché quei byte non conservano il contesto sorgente.
Il recupero degli endpoint è limitato e schermato da SSRF. Non è un crawler. Gli endpoint cloud privati e l'inoltro delle credenziali richiedono i loro flag di fiducia espliciti. I token del provider appartengono alle variabili d'ambiente documentate, non agli argomenti di processo.
Usa il [selettore di workflow](https://santhreal.github.io/keyhog/capabilities.html) per i dettagli di sorgente e policy, la [guida all'azione GitHub](https://santhreal.github.io/keyhog/workflows/github-action.html) per il gate di repository mantenuto, la [guida CI diretta](https://santhreal.github.io/keyhog/workflows/ci.html) per report durevoli e gestione dell'uscita, e la [guida alla scansione di massa](https://santhreal.github.io/keyhog/guides/mass-scanning.html) per partizionamento e aggregazione. Il [ricettario](https://santhreal.github.io/keyhog/recipes.html) copre container, archivi, URL, contenuto collaborativo GitHub e sorgenti cloud.
### Velocità e concorrenza senza congetture
Inizia con le impostazioni predefinite. Cargo non può eseguire KeyHog dopo `cargo install`, quindi esegui i comandi seguenti una volta dopo aver installato una build Cargo multi-backend e di nuovo dopo che host, binario, corpus di rilevatori, driver o classi di carico di lavoro cambiano:```sh
keyhog calibrate-autoroute --policy all
keyhog backend --autoroute --json
| Control | Usalo per | Mantieni questo invariante |
|---|---|---|
--backend auto calibrato | Selezione di routine di CPU, Hyperscan o GPU. | Un backend esplicito è un override diagnostico, non un default più veloce. |
--threads <N> | Riservare capacità CPU su un runner condiviso. Gli host dedicati normalmente dovrebbero lasciarlo non impostato così KeyHog usa i core disponibili. | Ogni valore deve essere positivo. Più processi KeyHog concorrenti possiedono ciascuno un pool di worker, quindi dividi il budget dell'host tra le partizioni. |
--reader-threads <N> | Pipeline di storage misurate dove il lavoro del reader, non la scansione, è il collo di bottiglia. | Il default deriva dal pool di worker di scansione. Lascialo non impostato finché il profiling non mostra un collo di bottiglia del reader. |
--incremental e --incremental-cache <PATH> | Scansioni ripetute dello stesso albero fidato. | Non condividere un singolo indice tra repository non correlati o job non fidati. |
| Partizioni di provider o repository | Scansione concorrente dell'estate e retry indipendenti. | Preserva un envelope terminale e un codice di uscita grezzo per partizione. Non concatenare i risultati e scartare lo stato di copertura. |
--verify-concurrency, --verify-rate e --verify-batch | Limitare i controlli live del provider indipendentemente dalla scansione dei file. | La verifica invia richieste derivate dalle credenziali. I rate limit del provider, non il numero di CPU, governano questa concorrenza. |
| Daemon di massa | Flussi di directory, cronologia, archivi, remoti o cloud su scala TB su un singolo worker Unix. | Ogni frame è limitato a 8 MiB e 1.024 chunk. Il daemon serializza lo stato dei frammenti e restituisce una ricevuta esatta di esecuzione CPU/GPU. |
--fast, default, --deep o --precision | Selezionare una policy esplicita di costo di rilevamento e recall. | Questi preset si escludono a vicenda e cambiano la copertura. Non sono manopole di velocità intercambiabili. |
Ispeziona la policy risolta con keyhog config --effective. Usa --profile
per misurare le fasi fisse dello scanner e l'esecuzione completa dell'operatore prima di modificare
i controlli di reader, batch o profondità del canale. Il report a basso overhead registra
sorgente, backend, cache, workload, thread, input, transizioni di stato, tempo CPU,
picco di memoria, SHA-256 esatto del binario, SHA-256 delle funzionalità abilitate, tripletta target, profilo di
build, compilatore, allocatore, SHA-256 del backend collegato, SHA-256 del corpus del rilevatore,
BLAKE3 dei rilevatori abilitati, BLAKE3 del piano compilato, provenienza del rilevatore con hash,
BLAKE3 completo della configurazione risolta, BLAKE3 della policy di prestazioni, preset,
stato di protezione applicato, adapter di sorgente, BLAKE3 della sorgente-target con hash,
BLAKE3 della partizione sorgente con hash, byte grezzi della sorgente, fanout delle unità sorgente,
byte derivati dalla decodifica, byte completati dal dispatch del backend e bucket stabili di dimensione/fanout.
I domini di byte che il loro adapter di sorgente non può ancora distinguere rimangono
esplicitamente non disponibili invece di diventare zeri misurati. Il report non
registra contenuto della sorgente, valori delle credenziali, percorsi grezzi, URL grezzi o valori
grezzi di configurazione. Usa --perf-trace solo per contatori diagnostici costosi per pattern e
backend.
Lascia i controlli avanzati della pipeline non impostati a meno che una misurazione riproducibile sul
worker di destinazione non mostri un miglioramento.
Per una scansione ricorrente completa del repository:```sh
keyhog scan . --incremental
--format json-envelope --output keyhog.json
Per un runner condiviso in cui al job vengono allocati quattro worker scanner e un
worker reader:```sh
keyhog scan . --threads 4 --reader-threads 1 \
--format json-envelope --output keyhog.json
Il secondo comando è un budget di risorse, non un ottimo universale. Misura l'host di destinazione prima di scegliere conteggi espliciti di worker.
Per il recupero profondo e il triage a livello di sistema, usa le loro guide dedicate perché la loro copertura e le regole di completamento differiscono da una scansione normale del repository.
Benchmark dello scanner per segreti
Questi pannelli confrontano la policy di rilevamento, le richieste di esecuzione CPU e GPU, il comportamento della cache incrementale e le richieste del daemon caldo. Ogni valore è generato dallo snapshot del benchmark controllato. Lo snapshot vincola la versione dello scanner, il digest dell'eseguibile, il digest del rilevatore, il corpus, l'host e il timestamp di esecuzione. Usa le prove complete del benchmark per la provenienza dei concorrenti e il richiamo per categoria.
Accuratezza del rilevamento
KeyHog KeyHog v0.5.70 ha scansionato il corpus mirror: 15.000 fixture, 3.000 positivi etichettati e 2.431.242 byte di input. Il manifest della chiave di risposta è stato escluso dall'albero di scansione. La riga usa la policy predefinita sul percorso esplicito Hyperscan/SIMD su AMD Ryzen 9 9950X 16-Core Processor.
| Precisione | Richiamo | F1 | Veri positivi | Falsi positivi | Falsi negativi |
|---|---|---|---|---|---|
| 0.9651 | 0.9027 | 0.9328 | 2.708 | 98 | 292 |
L'albero sorgente tracciato era pulito.
Percorsi di esecuzione, preset e cache
Misurato su AMD Ryzen 9 9950X 16-Core Processor con NVIDIA GeForce RTX 5090, 32 core logici, 15.000 fixture, 3.000 positivi etichettati e 2.431.242 byte di input. Scanner: KeyHog v0.5.70. L'albero sorgente tracciato era pulito.
Scansione completa per percorso di esecuzione
Tutte le righe usano la policy di rilevamento predefinita con cache incrementale e daemon disattivato. La riga automatica registra la policy richiesta, ma il risultato del benchmark non vincola il percorso persistente selezionato, quindi non è una prova di routing. Le righe GPU includono l'acquisizione e l'avvio completo dello scanner su questo piccolo corpus; non sono misurazioni di crossover del kernel GPU.
| Percorso richiesto | Wall | Throughput | RSS di picco | F1 |
|---|---|---|---|---|
| Hyperscan/SIMD | 860 ms | 2,70 MB/s | 416 MiB | 0.9328 |
| CPU Pure-Rust | 903 ms | 2,57 MB/s | 509 MiB | 0.9328 |
| CUDA | 2,03 s | 1,14 MB/s | 963 MiB | 0.9328 |
| WGPU | 1,97 s | 1,18 MB/s | 1264 MiB | 0.9328 |
| Automatico | 1,46 s | 1,59 MB/s | 634 MiB | 0.9328 |
Policy di rilevamento su Hyperscan/SIMD
Il percorso, la cache, lo stato del daemon, il corpus e l'host rimangono fissi. I preset cambiano il lavoro di rilevamento, quindi confronta precisione e richiamo oltre al tempo.
| Policy | Wall | Precisione | Richiamo | F1 | Risultati |
|---|---|---|---|---|---|
| Veloce | 737 ms | 0.9700 | 0.8837 | 0.9248 | 2.738 |
| Predefinita | 860 ms | 0.9651 | 0.9027 | 0.9328 | 2.816 |
| Profonda | 861 ms | 0.9645 | 0.9067 | 0.9347 | 2.845 |
| Precisione | 849 ms | 0.9590 | 0.6397 | 0.7674 | 2.001 |
Rerun incrementale caldo
Il benchmark popola l'indice Merkle BLAKE3, quindi cronometra la seconda scansione identica. Il piccolo albero sintetico cambia poco perché l'avvio dello scanner domina; misura il tuo repository prima di affermare un'accelerazione.
| Policy predefinita Hyperscan/SIMD | Wall | Throughput | RSS di picco |
|---|---|---|---|
| Cache disattivata | 860 ms | 2,70 MB/s | 416 MiB |
| Cache incrementale calda | 617 ms | 3,76 MB/s | 457 MiB |
Richieste del daemon caldo
Un file regolare deterministico da 8 MiB (sha256:afafbe7b6487fd62866f510e7c281a9e7bfeaa8dc585d7b0478c92ee6c4f5ef5) è stato scansionato una volta in-process e una volta tramite un daemon di proprietà dopo una richiesta di riscaldamento. Il tempo del daemon è la richiesta del client; l'RSS del daemon appartiene al server residente.
| Percorso esplicito | In process | Daemon caldo | Caldo / one-shot | RSS in-process | RSS daemon |
|---|---|---|---|---|---|
| Hyperscan/SIMD | 323 ms | 106 ms | 0,33× | 63 MiB | 74 MiB |
| CPU Pure-Rust | 278 ms | 109 ms | 0,39× | 62 MiB | 66 MiB |
| CUDA | 1,65 s | 232 ms | 0,14× | 674 MiB | 666 MiB |
| WGPU | 1,33 s | 237 ms | 0,18× | 596 MiB | 600 MiB |
Queste righe coprono il percorso caldo a file singolo. Il percorso di massa accetta anche batch limitati di directory e sorgenti remote; il suo percorso incrementale del filesystem è misurato separatamente.
Scalabilità di CPU, lettore, storage, dimensione e partizione
Generato da make -C benchmarks readme-scaling da benchmarks/reports/readme-scaling.json. L'harness ha eseguito 3 prove misurate dopo 1 riscaldamento con routing simd esplicito e daemon disattivato. La scalabilità dei worker usa una cache di pagina client calda per isolare il lavoro della CPU. Le righe di lettore, dimensione del corpus, storage e partizione richiedono l'evizione della pagina pulita con posix_fadvise dove la piattaforma lo supporta; lo snapshot registra la policy su ogni riga. Ogni carico di lavoro è byte-deterministico e privo di risultati.
Host: AMD Ryzen 9 9950X 16-Core Processor, 32 core logici effettivi, 94.140 MiB di RAM, Linux 6.17.0-19-generic. Evidenza: clean, binario 274b045489c4.
Scalabilità dei worker di scansione
| Worker | Thread del lettore | Wall mediano | Wall p95 | Throughput | Speedup | Efficienza | RSS di picco mediano |
|---|---|---|---|---|---|---|---|
| 1 | auto | 8.134,4 ms | 8.135,4 ms | 7,9 MiB/s | 1,00x | 100,0% | 47,0 MiB |
| 2 | auto | 4.398,2 ms | 6.906,7 ms | 14,6 MiB/s | 1,85x | 92,5% | 50,3 MiB |
| 4 | auto | 2.392,6 ms | 6.245,2 ms | 26,7 MiB/s | 3,40x | 85,0% | 57,2 MiB |
| 8 | auto | 1.816,3 ms | 6.117,6 ms | 35,2 MiB/s | 4,48x | 56,0% | 63,4 MiB |
| 16 | auto | 1.428,5 ms | 6.867,7 ms | 44,8 MiB/s | 5,69x | 35,6% | 78,4 MiB |
| 32 | auto | 1.862,8 ms | 5.939,1 ms | 34,4 MiB/s | 4,37x | 13,6% | 126,7 MiB |
Scalabilità del lettore del filesystem
| Worker di scansione | Thread del lettore | Wall mediano | Wall p95 | Throughput | Relativo a 1 lettore | RSS di picco mediano |
|---|---|---|---|---|---|---|
| 32 | 1 | 1.898,7 ms | 1.922,1 ms | 33,7 MiB/s | 1,00x | 121,3 MiB |
| 32 | 2 | 1.881,7 ms | 1.887,5 ms | 34,0 MiB/s | 1,01x | 122,8 MiB |
| 32 | 4 | 1.874,2 ms | 1.891,2 ms | 34,1 MiB/s | 1,01x | 126,6 MiB |
| 32 | 8 | 1.873,2 ms | 1.885,7 ms | 34,2 MiB/s | 1,01x | 133,4 MiB |
| 32 | 16 | 1.856,8 ms | 1.868,5 ms | 34,5 MiB/s | 1,02x | 153,9 MiB |
| 32 | 32 | 1.877,3 ms | 1.880,4 ms | 34,1 MiB/s | 1,01x | 179,5 MiB |
Scalabilità della dimensione del corpus
| Corpus | File | Byte esatti | Wall mediano | Wall p95 | Throughput | RSS di picco mediano |
|---|---|---|---|---|---|---|
| piccolo | 256 | 8 MiB | 869,9 ms | 886,1 ms | 9,2 MiB/s | 111,1 MiB |
| medio | 1.024 | 64 MiB | 1.859,9 ms | 1.874,8 ms | 34,4 MiB/s | 126,3 MiB |
| grande | 2.048 | 256 MiB | 5.214,9 ms | 5.321,7 ms | 49,1 MiB/s | 137,1 MiB |
Scalabilità dello storage
| Classe di storage | Filesystem | ID dispositivo | Wall mediano | Wall p95 | Throughput | Relativo al primo storage | RSS di picco mediano |
|---|---|---|---|---|---|---|---|
| workspace | ext4 | 66305 | 1.847,4 ms | 1.863,4 ms | 34,6 MiB/s | 1,00x | 127,0 MiB |
| local-temp | tmpfs | 116 | 1.870,8 ms | 1.887,3 ms | 34,2 MiB/s | 0,99x | 124,9 MiB |
Scalabilità delle partizioni concorrenti
| Processi | Worker per processo | Worker aggregati | File totali | Byte totali | Wall mediano | Throughput aggregato | Speedup | RSS di picco sommato mediano |
|---|---|---|---|---|---|---|---|---|
| 1 | 32 | 32 | 256 | 8 MiB | 871,9 ms | 9,2 MiB/s | 1,00x | 111,5 MiB |
| 2 | 16 | 32 | 512 | 16 MiB | 404,6 ms | 39,5 MiB/s | 4,31x | 134,0 MiB |
| 4 | 8 | 32 | 1.024 | 32 MiB | 571,1 ms | 56,0 MiB/s | 6,11x | 227,2 MiB |
Queste righe sono misurazioni, non costanti di tuning universali. Esegui il generatore sull'host e sullo storage di destinazione. Usa il punto di flesso in cui il throughput smette di migliorare, quindi riserva CPU e memoria per il runner CI o il livello di orchestrazione.
Riproduci tutti e quattro i gruppi di benchmark con make -C benchmarks readme-matrix.
Il comando misura la matrice richiesta e fallisce se qualsiasi riga richiesta di CPU,
Hyperscan, CUDA, Metal, WGPU, preset, cache, daemon, thread, lettore, storage, dimensione
del corpus o partizione non è disponibile. Usa
make -C benchmarks readme-matrix-check per verificare che entrambi gli snapshot, i report
e il README concordino.
Scegli una configurazione di scansione
Inizia con la policy predefinita e il routing automatico calibrato. Cambia un solo asse solo quando il flusso di lavoro lo richiede:
| Flusso di lavoro | Policy di rilevamento | Esecuzione e riutilizzo | Controllo aggiuntivo |
|---|---|---|---|
| Prima scansione del repository | Predefinita | auto calibrato; --daemon=auto | Rivedi tutti i risultati prima di aggiungere soppressioni. |
| Albero locale ripetuto o scansione CI | Predefinita | auto calibrato; --incremental | Persisti la cache incrementale solo tra scansioni dello stesso albero affidabile. |
| Ciclo di feedback breve | --fast | auto calibrato; --incremental opzionale | Accetta una copertura ridotta di decodifica, entropia e ML. Esegui la policy predefinita prima del merge. |
| Recupero a richiamo più alto | --deep | In process | Deep è mutuamente esclusivo con fast e precision, e non è idoneo al daemon. |
| Inventario ampio a basso rumore | --precision | In process per raccolte di repository, cronologia e sorgenti cloud | Il preset alza i livelli minimi di confidenza e disabilita la scoperta dell'entropia. Può perdere credenziali a confidenza inferiore. |
| Inventario di directory, cronologia, archivio, remoto o cloud su scala TB su Unix | Predefinita | keyhog daemon start --mass, poi --daemon=mass | I batch rimangono limitati a 8 MiB e 1.024 chunk. Conserva il report di copertura del terminale e la ricevuta di esecuzione GPU. |
| Validazione live delle credenziali | Predefinita | In process | Aggiungi --verify esplicitamente. La verifica invia richieste derivate dalle credenziali ai provider. |
| Scansione Linux senza swap | Predefinita più --lockdown | In process; cache incrementale disabilitata | Lockdown rifiuta la verifica, i segreti in chiaro, la modalità veloce e gli switch che riducono la completezza. |
--fast, --deep e --precision sono preset di rilevamento mutuamente esclusivi.
--lockdown è una modalità di esecuzione fail-closed, non un quarto preset. I valori
espliciti di --backend sono override diagnostici e di benchmark. Non sostituiscono
l'evidenza persistente del percorso più veloce-corretto usata dal routing automatico. Vedi
Configurazione,
calibrazione autoroute,
daemon e scansioni calde,
e hardening per i
contratti completi.
Come funziona KeyHog
KeyHog compila i suoi 934 rilevatori in un piano condiviso di trigger ed estrazione,
decodifica le codifiche annidate prima del matching e applica punteggio, evidenza
e soppressione per rilevatore. La CPU Pure-Rust (cpu-fallback) è sempre disponibile.
Il percorso Hyperscan (simd-regex) usa Hyperscan quando quella funzionalità è presente;
le build portabili usano il percorso CPU. CUDA (gpu-cuda-region-presence), Metal
(gpu-metal-region-presence) e WGPU (gpu-wgpu-region-presence) sono pari
in un selettore autoroute basato su prove, non una catena di fallback. La calibrazione misura
ogni peer idoneo e persiste il percorso più veloce i cui risultati completi corrispondono
al percorso di riferimento per l'esatto binario, lo stato di rilevatore e configurazione,
host, acceleratore e classe di carico di lavoro. Una decisione mancante, obsoleta, non valida o incompleta
ferma una scansione automatica prima dell'esecuzione e segnala come ricalibrare.
Non sostituisce mai silenziosamente un altro backend.
Vedi Architettura per la mappa del repository, la direzione delle dipendenze, la pipeline da byte a risultato e i punti di ingresso di profilazione. Vedi Backend e routing per i contratti di esecuzione e Calibrazione autoroute per parità, identità del carico di lavoro, ciclo di vita della cache e procedure di riparazione.
Documentazione completa: santhreal.github.io/keyhog - installazione, prima scansione, formati di output, interni di rilevamento, soppressioni, verifica, integrazione pre-commit + CI, riferimento CLI, autoroute, codici di uscita, variabili d'ambiente e contributi. Sorgente in docs/.
Installa KeyHog
Installa la release corrente di crates.io:```sh cargo install keyhog --locked
Costruisci il checkout del repository quando ti serve una modifica non ancora rilasciata:```sh
cargo install --path crates/cli --locked
Conferma la build installata:```sh keyhog --version --full keyhog doctor
Use la [guida all'installazione](https://santhreal.github.io/keyhog/install.html) per
i requisiti della toolchain Rust, i profili di funzionalità e le dipendenze
runtime specifiche per piattaforma.
## Cosa rileva
934 rilevatori incorporati con validazione offline e companion di proprietà del rilevatore:
- **Provider cloud:** AWS (access key + secret + verifica STS),
Azure (subscription key, storage account key, SAS), GCP (service account,
API key), Cloudflare, Heroku, Vercel, Supabase.
- **Processori di pagamento:** Stripe, Braintree, Razorpay, Paddle, Plaid,
Square e PayPal, con controlli di proprietà del rilevatore e companion
opzionali o obbligatori. Una Razorpay key secret richiede la key ID adiacente.
- **Forge di sorgenti:** PAT GitHub (con checksum CRC32), token GitLab,
password app Bitbucket, token npm (con checksum), Gitea / Forgejo
/ Codeberg.
- **Auth / SSO:** Okta, Auth0, Clerk, JumpCloud, Kinde.
- **Comunicazioni:** Slack, Discord, Twilio, SendGrid, Postmark, Mailgun,
Resend, Loops.
- **AI / ML:** OpenAI (sk-/sk-proj-), Anthropic, Google AI Studio,
Cohere, Mistral, HuggingFace, Replicate. Le credenziali dell'organizzazione
HuggingFace includono sia la forma corrente `hf_` sia i token legacy `api_org_`.
- **Gestori di password:** chiavi segrete dell'account 1Password (`A3-` seguite da
cinque o sei componenti segmentate alfanumeriche maiuscole).
- **Database:** stringhe di connessione Postgres, MongoDB Atlas, Supabase
service-role, PlanetScale, Neon, Turso, MySQL, URL Redis.
- **Generico + scoperta per entropia:** `API_KEY=<blob-ad-alta-entropia>` rileva
credenziali senza un rilevatore nominato, limitato da soglie di entropia
per contesto + punteggio ML.
- **Materiale crittografico:** chiavi private RSA / EC / SSH, blocchi privati
PGP, segreti di firma JWT.
Ogni rilevatore è distribuito come [file TOML](https://github.com/santhreal/keyhog/blob/main/detectors) (dati, non codice):
metadati del servizio, pattern regex, parole chiave, validatori offline, policy
di entropia e ML, campi companion e gestore di verifica. Aggiungere un nuovo
rilevatore è una singola modifica TOML revisionabile;
la [guida per i contributori](https://github.com/santhreal/keyhog/blob/main/CONTRIBUTING.md) ne illustra il percorso.
`keyhog explain <id>` scarica la specifica completa di qualsiasi rilevatore:
pattern, parole chiave, endpoint di verifica, oltre a una guida alla rotazione
e alla remediation passo-passo associata al servizio, così un risultato non è
mai una scatola nera:
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/7654/0fc64959950abfa39c0ba81a1f5fbde3fe17a57169d2edca38cb0f248c834470.gif" alt="keyhog explain github-classic-pat: dump della specifica del rilevatore (pattern ghp_[A-Za-z0-9]{36}, parola chiave, URL di verifica) seguito dalla guida alla rotazione GitHub e dalla remediation passo-passo" width="860" />
</p>
Consulta la creazione e l'ispezione dei rilevatori nel
[riferimento dei rilevatori](https://github.com/santhreal/keyhog/blob/main/docs/src/detectors.md), oppure interroga il corpus
installato con `keyhog detectors --search <termine> --verbose`.
## Perché maggiore recall, meno falsi positivi
- **Scansione con decodifica.** Manifest `Secret` Kubernetes, notebook
Jupyter, payload JWT, env avvolti in base64, valori Helm e blob `auth:`
di docker-config. Il preprocessore strutturato tratta le azioni Helm
bilanciate come valori inerti a tempo di render e chiude i delimitatori
Jupyter mancanti a fine file, così i byte letterali e le celle di codice
complete restano coperti. Decodifica i valori strutturati in posizione e
fornisce il testo in chiaro a ogni rilevatore a valle. I rilevatori non
devono reimplementare ciascuno la decodifica. Le scansioni con decodifica
abilitata recuperano anche espressioni JavaScript XOR di byte-array e
AES-256-CBC senza effetti collaterali quando tutto il materiale di recupero
è incorporato, incluse le rigide wrapper CryptoJS/OpenSSL con passphrase
salata. KeyHog non esegue mai il sorgente.
- **Riassemblaggio multilinea.** Continuazione `"sk-proj-" + \` in JavaScript,
stringhe multilinea YAML, continuazione con backslash nei Makefile, output
templati Helm / Jinja, tutto riassemblato prima del matching regex.
- **Validazione companion.** I companion obbligatori limitano i rilevatori ad
alto rumore. Una API key Twilio senza il suo API secret viene saltata. I
companion opzionali arricchiscono il punteggio delle evidenze o la verifica.
Il rilevamento dell'access-key AWS non richiede il suo secret, ma il secret è
necessario per la verifica live.
- **Risoluzione tra rilevatori.** Il TOML del rilevatore può richiedere,
rifiutare o assorbire risultati delimitati di un altro rilevatore. La
risoluzione resta deterministica rispetto all'ordine di input, e target
non validi, contraddizioni o cicli di dipendenza fanno fallire la compilazione
del corpus.
- **Verdetti delle evidenze.** Ogni risultato porta un livello esatto `review`,
`likely` o `confirmed` più un codice motivo canonico. Checksum intrinseco o
prova grammaticale, companion obbligatori e verifica live producono evidenze
confermate; una forma forte specifica del fornitore in un ruolo che contiene
credenziali produce evidenze probabili; ancoraggi deboli, assegnazioni
generiche, candidati solo per entropia e contesti di test, documentazione,
regole o identificatori restano evidenze di review.
Un `evidence_score` opzionale integra il verdetto quando misurato.
La soglia predefinita `0.40` controlla il pavimento di confidenza interno
dello scanner e resta configurabile con `--min-confidence`.
- **Calibrazione bayesiana per rilevatore.** `keyhog calibrate --fp generic-api-key`
scrive un posteriore Beta(α,β). Le scansioni lo usano solo quando
`--calibration-cache` o `[system].calibration_cache` punta a quel file, così
la regolazione della confidenza è esplicita e riproducibile invece di
dipendere da stato di cache host casuale.
## Prestazioni
Usa l'harness riproducibile in [`benchmarks/`](https://github.com/santhreal/keyhog/blob/main/benchmarks) per confrontare
KeyHog, Betterleaks, Kingfisher, Nosey Parker, TruffleHog e Titus sotto un
unico contratto di punteggio. L'harness esclude il manifest ground-truth da
ogni albero di scansione. Le tabelle generate restano vuote finché non esistono
esecuzioni con schema corrente. Esegui `make -C benchmarks report` dopo la
misurazione. Non modificare a mano le tabelle generate.
### Classifica di rilevamento
<!-- BENCH:leaderboard:start -->
#### Corpus mirror sintetico a forma SecretBench
Corpus: **mirror** - 15000 fixture, 3000 positivi etichettati, 2.431.242 byte. Ogni scanner è stato valutato in modo identico (regola di sovrapposizione SecretBench); il manifest con la chiave di risposta è escluso dall'albero di scansione.
| Rank | Scanner | F1 | Precision | Recall | Findings | Wall | Peak RSS |
|---|---|---|---|---|---|---|---|
| 1 | **KeyHog** | **0.9328** | 0.9651 | 0.9027 | 2816 | 1.05s | 416 MB |
| 2 | TruffleHog | 0.5294 | 1.0000 | 0.3600 | 1080 | 1.59s | 300 MB |
| 3 | Kingfisher | 0.4683 | 0.3877 | 0.5913 | 5255 | 4.81s | 402 MB |
| 4 | Titus | 0.4207 | 0.3381 | 0.5567 | 5151 | 2.86s | 115 MB |
| 5 | Nosey Parker | 0.4186 | 0.3511 | 0.5183 | 4529 | 0.82s | 285 MB |
| 6 | Betterleaks | 0.3498 | 0.2241 | 0.7970 | 11113 | 0.74s | 198 MB |
#### Corpus di regole homefield / home-turf dei concorrenti
Corpus: **homefield** - 2399 fixture raccolte dalle suite di regole ground-truth dei concorrenti (regole Betterleaks e Kingfisher; 1.057 positivi etichettati, 1.342 negativi, 772.974 byte). Valutazione incrociata tra strumenti sul ground truth dei concorrenti.
| Rank | Scanner | F1 | Precision | Recall | Findings | Wall | Peak RSS |
|---|---|---|---|---|---|---|---|
| 1 | **KeyHog** | **0.9214** | 0.9582 | 0.8874 | 979 | 0.72s | 384 MB |
| 2 | Betterleaks | 0.9056 | 0.9130 | 0.8984 | 1040 | 0.58s | 192 MB |
| 3 | Kingfisher | 0.8842 | 0.9250 | 0.8468 | 968 | 2.14s | 390 MB |
| 4 | TruffleHog | 0.4812 | 0.9850 | 0.3226 | 345 | 1.22s | 280 MB |
| 5 | Titus | 0.4635 | 0.3810 | 0.5913 | 1640 | 2.15s | 110 MB |
| 6 | Nosey Parker | 0.4520 | 0.3950 | 0.5280 | 1412 | 0.68s | 265 MB |
### Provenienza dei risultati
| Scanner | Versione scanner / digest eseguibile | Identità corpus | Identità host | Data esecuzione |
|---|---|---|---|---|
| KeyHog | versione: KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Set rilevatori: 926 (926-4168e2c6c93a16ca)<br>Target di build: x86_64-linux<br>Versione modello ML: moe-v1-246a05b92bec9aa3<br>Scheda modello ML: registrata 2026-07-15; feature 55; F1 sintetico 0.971 / P 0.945 / R 0.999; F1 reale 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; rilevatori a recall zero 2/32; differenziale a sei scanner non disponibile<br>SHA-256 eseguibile: `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:39Z |
| TruffleHog | versione: trufflehog 3.96.0<br>SHA-256 eseguibile: `6eb1f98fb890bf9361d8833c061e122dcb4f14fb7b71c65e603b7c096153c724` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:58Z |
| Kingfisher | versione: kingfisher 1.94.0<br>SHA-256 eseguibile: `a49f8e9838d7f1da1e9f328a4dbc45a16996bce5078cde3ff1b8ad422d8ab07a` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:50Z |
| Titus | versione: Titus v1.1.20 (porting Go di NoseyParker)<br>SHA-256 eseguibile: `0b9c126a6c280ba28c6ed8795f88bf9bd793164c15959a34921f47a7ed276bcf` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:30:03Z |
| Nosey Parker | versione: noseyparker 0.24.0 Configurazione di build: Timestamp build: 2025-05-08T21:11:15.600909923Z Timestamp commit: 2025-05-08T17:04:47.000000000-04:00 Ramo commit: HEAD SHA commit: 61fa4ca67e4ded1b47b3b9ecce618ae91f1ff2fe Funzionalità Cargo: color_backtrace,default,disable_trace,github,log,mimalloc,parquet,release Debug: true Ottimizzazione: 3 Target triple: x86_64-unknown-linux-gnu Sistema di build: OS: Ubuntu Versione OS: Linux (Ubuntu 22.04) Vendor CPU: AuthenticAMD Marca CPU: AMD EPYC 7763 64-Core Processor Core CPU: 2 Versione rustc: 1.86.0 Canale rustc: stable Host triple rustc: x86_64-unknown-linux-gnu Data commit rustc: 2025-03-31 SHA commit rustc: 05f9846f893b09a1be1fc8560e33fc3c815cfecb Versione LLVM rustc: 19.1<br>SHA-256 eseguibile: `42d6e88bf77904866a9dda49d7cf333501e76b62e9054b112e67f81dc88e2b71` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:53Z |
| Betterleaks | versione: betterleaks versione dev<br>SHA-256 eseguibile: `466f7d34e1ebcf12ecd5939494f509c17125e54416226976fced2f046da56ba4` | mirror; 15.000 fixture; 3.000 positivi etichettati; 2.431.242 byte | SHA-256/12 hostname: `82fcd9288623`<br>Linux 6.17.0-19-generic<br>AMD Ryzen 9 9950X 16-Core Processor | 2026-08-11T01:29:43Z |
<!-- BENCH:leaderboard:end -->
### Velocità e memoria
<!-- BENCH:perf:start -->
#### Corpus mirror sintetico a forma SecretBench
| Scanner | Config | Corpus | Wall | Throughput | Peak RSS |
|---|---|---|---|---|---|
| Betterleaks | `default-nocache-nodaemon-no-validate` | mirror | 0.74s | 3.1 MB/s | 198 MB |
| Nosey Parker | `default-nocache-nodaemon-no-git-history` | mirror | 0.82s | 2.8 MB/s | 285 MB |
| KeyHog | `simd-nocache-nodaemon-full` | mirror | 1.05s | 2.2 MB/s | 416 MB |
| TruffleHog | `default-nocache-nodaemon-no-verify` | mirror | 1.59s | 1.5 MB/s | 300 MB |
| Titus | `default-nocache-nodaemon-no-validate` | mirror | 2.86s | 0.8 MB/s | 115 MB |
| Kingfisher | `default-nocache-nodaemon-low-no-validate` | mirror | 4.81s | 0.5 MB/s | 402 MB |
#### Corpus di regole homefield / home-turf dei concorrenti
| Scanner | Config | Corpus | Wall | Throughput | Peak RSS |
|---|---|---|---|---|---|
| Betterleaks | `default-nocache-nodaemon-no-validate` | homefield | 0.58s | 1.3 MB/s | 192 MB |
| Nosey Parker | `default-nocache-nodaemon-no-git-history` | homefield | 0.68s | 1.1 MB/s | 265 MB |
| KeyHog | `simd-nocache-nodaemon-full` | homefield | 0.72s | 1.1 MB/s | 384 MB |
| TruffleHog | `default-nocache-nodaemon-no-verify` | homefield | 1.22s | 0.6 MB/s | 280 MB |
| Titus | `default-nocache-nodaemon-no-validate` | homefield | 2.15s | 0.4 MB/s | 110 MB |
| Kingfisher | `default-nocache-nodaemon-low-no-validate` | homefield | 2.14s | 0.4 MB/s | 390 MB |
<!-- BENCH:perf:end -->
### Confronto recall per categoria
<!-- BENCH:gaps:start -->
_Solo fetta di recall diagnostico. Precision complessiva e F1 restano il contratto di confronto; i falsi positivi sono conteggiati nelle loro categorie con punteggio._
| Categoria | KeyHog P/R/F1 | KeyHog TP/FN | Miglior concorrente P/R/F1 | Gap di recall |
|---|---|---|---|---|
| `generic-high-entropy-string` | 1.000 / 0.434 / 0.606 | 73/95 | Betterleaks 1.000 / 0.798 / 0.887 | +0.363 |
<!-- BENCH:gaps:end -->
### Telemetria di recupero statico delimitato
<!-- BENCH:recovery:start -->
Esecuzione selezionata: scanner **KeyHog** `KeyHog v0.5.70<br>Commit: d1eb2e09eb2c289181d93d719ce3f62411aeaf2c<br>Set rilevatori: 926 (926-4168e2c6c93a16ca)<br>Target di build: x86_64-linux<br>Versione modello ML: moe-v1-246a05b92bec9aa3<br>Scheda modello ML: registrata 2026-07-15; feature 55; F1 sintetico 0.971 / P 0.945 / R 0.999; F1 reale 0.832 / P 0.753 / R 0.931 / [email protected] 0.938; rilevatori a recall zero 2/32; differenziale a sei scanner non disponibile`; corpus **mirror** (15.000 fixture, 2.431.242 byte); generato `2026-08-11T01:29:39Z`; artefatto `mirror-keyhog-simd-nocache-nodaemon-full.json`.
Schema telemetria: `static-recovery-v1`.
| Disposizione | Conteggio esatto |
|---|---:|
| Supportato | 0 |
| Non supportato | 0 |
| Errato | 0 |
| Motivo di rifiuto | Conteggio esatto |
|---|---:|
| _nessuno_ | 0 |
<!-- BENCH:recovery:end -->
### Evidenze Bloom bigram
<!-- BENCH:bloom:start -->
Schema evidenze: `bloom-evidence-v1`.
| Campo | Risultato esatto |
|---|---|
| Corpus | `samsung-creddata-fx-record-spans-v1` |
| Revisione corpus | `f1de3f85dbdf42bf7b3467c0d273a4dfe44d56ee` |
| SHA-256 corpus | `4f2de506f334521121bb5b4aef8a37bf0b8153a4f9115e7ba9392d0eed1757b9` |
| SHA-256 fixture | `a0ff018dc0a64b2cc78b25999043d1a441afa0087070f4cd8d73ae82408a59b4` |
| SHA-256 eseguibile | `2899ee53789bff9c531f72645f6c8380a7c873230dfb2b6857079467bc8d2dcd` |
| SHA-256 corpus rilevatori workspace | `d87e8b3d086e9ffa4c8a94f35a717ec710d5224e52e5b4fc7e71db30677609c9` |
| Digest rilevatori scanner | `8d789251e092959f` |
| SHA-256 corpus rilevatori | `3729bd72df768187420f37e08ab64cd2b5a8bac558002d8b0844f465e9a75711` |
| Rifiuto Bloom | **110/51794 (0.21%)**; 51684 ammessi |
| Disponibilità esterna | 51794 misurati; 0 esplicitamente non disponibili su 51794 dichiarati; motivi: |
| Risultati abilitati vs bypassati | **IDENTICI**; 977/977 risultati |
| SHA-256 identità risultato | `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` / `1517bad01ab5228e85b7f4fd44e72226aa3f195bc18a67d58b7a6364b6bf6e0e` |
| Densità/stato Bloom | 1793/65536 slot; `healthy`; saturazione a 39322 |
L'identità del risultato vincola rilevatore, file, riga, intervallo di byte e SHA-256 della credenziale; le credenziali in chiaro non vengono mai registrate.
<!-- BENCH:bloom:end -->
Riproduci: `make -C benchmarks canonical KEYHOG_BIN=/percorso/assoluto/keyhog`
riesegue l'esatto set di esecuzioni mirror di KeyHog, Betterleaks, Kingfisher,
Nosey Parker, TruffleHog e Titus, incluso il differenziale Bloom CredData
vincolato all'eseguibile; `make -C benchmarks report` rigenera le tabelle sopra
e `benchmarks/reports/`. Vedi [`benchmarks/README.md`](https://github.com/santhreal/keyhog/blob/main/benchmarks/README.md)
per i corpora (mirror, home-turf dei concorrenti, Samsung/CredData) e la
matrice backend/cache/daemon/OS/GPU.
## Worker daemon di massa con supporto GPU
Il daemon Unix di massa opzionale mantiene caldo uno scanner compilato e il suo
stato backend calibrato. Le scansioni del filesystem locale inviano solo la
radice canonica e i metadati della policy delle sorgenti; il daemon legge e
raggruppa i file nel proprio processo. Le sorgenti Git, binarie, remote e cloud
che richiedono credenziali lato client usano frame di chunk delimitati protetti.```sh
# Terminal 1
keyhog calibrate-autoroute --policy default
keyhog daemon start --mass
# Terminal 2, after the daemon prints its ready line
keyhog scan --daemon=mass /srv/inventory/team-a \
--format json-envelope --output team-a.json
keyhog daemon stop
--daemon=mass è una route obbligatoria. Non esegue mai nuovi tentativi in-process. Ogni batch è limitato a 8 MiB e 1.024 chunk, indipendentemente dalla dimensione totale dell'input. Preserva l'envelope di copertura, lo stato di uscita e la ricevuta di esecuzione terminale per ogni partizione dell'inventario.
Vedi ciclo di vita del daemon, routing e ricevute e partizionamento dell'inventario.
Triage delle credenziali a livello di sistema```sh
sudo keyhog scan-system --space 50G sudo keyhog scan-system --include-network --output system-findings.json
`scan-system` è un audit locale limitato all'host, non un sostituto per la partizione dell'inventario di repository o
cloud. Si limita in base al totale di byte scansionati piuttosto
che al percorso: `--space` è il tetto massimo, e i filesystem montati in rete vengono
saltati a meno che non si passi `--include-network`. Rivedi il comportamento di mount, filesystem di rete,
tetto di spazio e privilegi prima di eseguirlo. Vedi
[triage a livello di sistema](https://santhreal.github.io/keyhog/guides/system-wide-triage.html).
## Blocca le scansioni locali sensibili
`--lockdown` di Linux è una modalità di protezione dei processi fail-closed:```sh
keyhog scan . --daemon=off --lockdown
Blocca la memoria corrente e futura, disabilita i core dump e la cache incrementale, rimane in processo e rifiuta la verifica, l'output in chiaro, la modalità rapida e le opzioni che riducono la completezza. Fallisce su piattaforme non supportate o in caso di capacità di memoria bloccata insufficiente. Vedi hardening e gestione dei dati.
Usa KeyHog come libreria Rust```rust
use keyhog_core::{Chunk, ChunkMetadata, RawMatch}; use keyhog_scanner::CompiledScanner;
let detectors = keyhog_core::load_embedded_detectors_or_fail()?; let scanner = CompiledScanner::compile(detectors)?; let findings = scanner.scan(&Chunk { data: "TOKEN=sk_live_EXAMPLE…".into(), metadata: ChunkMetadata::default(), })?; let report_safe: Vec<_> = findings.iter().map(RawMatch::to_redacted).collect();
I metodi predefiniti della libreria sono riferimenti CPU portabili e deterministici. I
metodi espliciti del backend restituiscono errori tipizzati invece di terminare il processo o
sostituire silenziosamente un altro motore. I chunk grezzi e le corrispondenze possono contenere
testo in chiaro. Convertili con `RawMatch::to_redacted`, oppure usa i valori finali
`VerifiedFinding`, prima dei confini JSON, log, disco o rete.
La [guida all'architettura](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md) definisce la proprietà delle crate,
i contratti dei backend, le ricevute di recupero, gli helper delle sorgenti e i confini sicuri
per la reportistica. La documentazione Rust a livello di crate possiede l'API completa.
## Configurare la policy con precedenza esplicita
La policy del repository risiede in `.keyhog.toml`:```toml
verify = false
[scan]
severity = "high"
incremental = true
[system]
gpu = "auto"
L'ordine di risoluzione è: impostazioni predefinite integrate, configurazione utente, configurazione del repository, variabili d'ambiente dove documentate, e infine override espliciti da CLI. Chiavi sconosciute e combinazioni non valide causano un errore prima della scansione. Esegui keyhog config --effective per ispezionare la policy risolta senza esporre le credenziali del proxy. Le voci oltre expires fanno fallire il caricamento dell'allowlist prima della scansione.
Consulta configurazione e precedenza per ogni chiave e variabili d'ambiente per credenziali e input di runtime.
Architettura
KeyHog mantiene l'orchestrazione al confine e il comportamento di dominio nelle librerie:```text sources -> scanner -> suppression/evidence -> reporting -> optional verifier CLI and Action own process, transport, and exit semantics.
Detector definitions remain data under `detectors/`. `keyhog-core` owns
detector and finding types, `keyhog-scanner` owns matching and execution
backends, `keyhog-sources` owns input acquisition, `keyhog-verifier` owns live
checks, and `keyhog-cli` owns operator workflows.
Start with the [architecture guide](https://github.com/santhreal/keyhog/blob/main/docs/src/architecture.md) for the repository
map, dependency direction, bytes-to-finding pipeline, routing ownership, and
profiling entrypoints.
## Inspect and extend the installation```sh
keyhog detectors --search aws --verbose
keyhog explain aws-access-key
keyhog backend --autoroute --json
keyhog completion zsh
Il riferimento CLI
elenca ogni comando, flag, valore predefinito generato e stato di uscita. Usa
keyhog --help e keyhog <comando> --help per la versione esatta installata.
Contribuire
- Nuovo rilevatore? Inserisci un file TOML in
detectors/, apri una PR. La guida per i contributori (CONTRIBUTING.md) contiene lo schema e un esempio completo. - Bug / segreto mancato / falso positivo? Apri una segnalazione con la
forma del segreto oscurato e l'id del rilevatore; ogni segnalazione diventa una
fixture di test permanente in
crates/scanner/tests/contracts/. - Comportamento delle release? Ogni esecuzione CI riuscita su
mainincrementa la versione patch, genera i changelog e pubblica tutte e sei le crate su crates.io. Aggiungi un frammento opzionale inchanges/per una nota precisa. La guida alle release copre la transazione automatica e il recupero da upload falliti. - Problema di sicurezza in KeyHog stesso? Non aprire una segnalazione pubblica;
usa la segnalazione privata di vulnerabilità di GitHub.
Se quel modulo non è disponibile, scrivi a
[email protected]; PGP non è richiesto.
Changelog. Segnalazioni aperte.
Crediti
KeyHog si basa su precedenti lavori di scansione dei segreti. Idee prese in prestito da:
- TruffleHog: ampiezza dei rilevatori e semantica di verifica
- Betterleaks: efficienza dei token e soppressione dei falsi positivi
- Titus: ergonomia della scansione e calibrazione della gravità
Grazie a questi progetti e ai loro contributori.
Licenza
Licenza: MIT OR Apache-2.0.
Termini: MIT e Apache-2.0. Questa doppia licenza copre il codice e i TOML dei rilevatori. L'uso commerciale, l'incorporamento, i fork e i servizi ospitati sono consentiti con entrambe le licenze.
Storico delle stelle
Generato da osservazioni UTC del conteggio pubblico delle stelle di GitHub. Il repository memorizza il primo punto e ogni successiva transizione del conteggio. Le riesecuzioni nello stesso giorno sostituiscono il punto di quel giorno, e i conteggi invariati non generano alcun commit.