Hook

Hook secrets: rileva i segreti scritti nel codice

Analizza una codebase alla ricerca di credenziali scritte nel codice, dalla riga di comando.

L'hook secrets segnala le credenziali compilate nel sorgente invece che lette dall'ambiente. Si basa sulla provenienza (un letterale contro una lettura dall'ambiente), non sul contenuto del valore, quindi non ha bisogno di un catalogo esaustivo dei prefissi dei fornitori e non produce quasi falsi positivi. È il motore deterministico dietro la specializzazione secrets.

Le firme dei formati dei fornitori, le credenziali nelle stringhe di connessione e un letterale associato a un identificatore dal nome di segreto sono indipendenti dal linguaggio: la stessa stringa si legge allo stesso modo in qualsiasi file. Le due euristiche che dipendono dalla sintassi, una lettura dall'ambiente con un valore predefinito scritto nel codice e un segreto che finisce in un sink di log, sono consapevoli del linguaggio, così un console.log di JavaScript non viene mai letto in un file Rust e os.getenv("X", "default") di Python viene riconosciuto per quello che è.

Come eseguirlo​

npx lagune read secrets # scans the whole project
npx lagune read secrets --dir src # scans a directory
npx lagune read secrets --file config.ts # scans a single file

L'analisi stampa fino a due sezioni. Hardcoded secrets found è l'insieme dei rilievi (un valore predefinito scritto nel codice per una variabile d'ambiente dal nome di segreto, una credenziale incorporata in una stringa di connessione o un valore che corrisponde a un formato di fornitore selezionato), quindi l'hook esce con un codice diverso da zero. Secret handling to review manually è un insieme di piste: un semplice letterale associato a un identificatore dal nome di segreto (la sua provenienza si può stabilire, ma se il valore sia davvero un segreto no) e un valore dal nome di segreto che finisce in un sink di log o di risposta. Un'esecuzione pulita stampa no hardcoded secrets found.

Opzioni della CLI​

OpzioneValoreDescrizione
--diruna directoryLimita l'analisi a una directory. Si ripete e si combina con --file.
--fileun fileLimita l'analisi a un singolo file. Si ripete e si combina con --dir.

Senza opzioni analizza l'intero progetto.

Copertura dei linguaggi​

Il rilievo sul valore predefinito dell'ambiente e la pista sui sink di log leggono un insieme di forme per ogni linguaggio, quindi coprono i linguaggi qui sotto e restano in silenzio altrove. Gli altri tre segnali vengono eseguiti su ogni file.

SegnaleLinguaggi
Valore predefinito dell'ambienteJavaScript/TypeScript, Python, Ruby, PHP, Kotlin, Java, Go (cmp.Or), Rust, C#
Sink di log o di rispostaJavaScript/TypeScript, Python, Ruby, PHP, Java, Kotlin, Go, Rust, C, C++, C#
È un problema di policy?

No. Riconoscere il formato di un segreto per avvisare che è finito in un commit è uno strumento difensivo standard, la stessa operazione che svolgono gitleaks, trufflehog e la push protection di GitHub. L'hook include firme di rilevamento (i formati pubblici dei token), mai un segreto reale, e verifica e spiega invece di esfiltrare.

Domande frequenti

Si basa sulla provenienza, non sul contenuto del valore. I formati ad alta affidabilità (token dei fornitori, valori predefiniti dell'ambiente, stringhe di connessione) sono rilievi che escono con un codice diverso da zero. Un semplice letterale associato a un identificatore dal nome di segreto è una pista da confermare, e lo stesso identificatore letto da process.env non viene segnalato affatto.