
Identificare i segreti hardcoded in testo strutturato statico

"I miei piccoli uccelli sono ovunque, persino al Nord, mi sussurrano le storie più strane." - Lord Varys
Whispers è uno strumento di analisi statica del codice progettato per analizzare vari formati di dati comuni alla ricerca di credenziali hardcoded e funzioni pericolose. Whispers può essere eseguito tramite CLI o integrato nella tua pipeline CI/CD.
Whispers è pensato per essere un parser di testo strutturato, non un parser di codice.
I seguenti formati comunemente utilizzati sono attualmente supportati:
I file Python3 vengono analizzati come AST grazie al supporto nativo del linguaggio.
I seguenti file di linguaggio vengono analizzati come testo e controllati per pattern comuni di dichiarazione e assegnazione di variabili:
pip3 install whispers
git clone https://github.com/Skyscanner/whispers
cd whispers
make install
whispers --help
whispers --info
whispers source/code/fileOrDir
whispers --config config.yml source/code/fileOrDir
whispers --output /tmp/secrets.yml source/code/fileOrDir
whispers --rules aws-id,aws-secret source/code/fileOrDir
whispers --severity BLOCKER,CRITICAL source/code/fileOrDir
whispers --exitcode 7 source/code/fileOrDir
from whispers.cli import parse_args
from whispers.core import run
src = "tests/fixtures"
configfile = "whispers/config.yml"
args = parse_args(["-c", configfile, src])
for secret in run(args):
print(secret)
Ci sono diverse opzioni di configurazione disponibili in Whispers. È possibile includere/escludere i risultati in base al percorso del file, alla chiave o al valore. Le specifiche del percorso del file sono interpretate come glob. Chiavi e valori accettano espressioni regolari e diversi altri parametri. C'è un file di configurazione predefinito integrato che verrà utilizzato se non ne fornisci uno personalizzato.
config.yml dovrebbe avere la seguente struttura:
include:
files:
- "**/*.yml"
exclude:
files:
- "**/test/**/*"
- "**/tests/**/*"
keys:
- ^foo
values:
- bar$
rules:
starks:
message: Whispers from the North
severity: CRITICAL
value:
regex: (Aria|Ned) Stark
ignorecase: True
Il modo più rapido per ottimizzare il rilevamento (ad esempio: rimuovere falsi positivi e risultati indesiderati) è copiare il file config.yml predefinito in un nuovo file, adattarlo e passarlo come argomento a Whispers.
whispers --config config.yml --rules starks src/file/or/dir
Le regole specificano le cose effettive che dovrebbero essere estratte dalle coppie chiave-valore. Ce ne sono diverse comuni già integrate, come chiavi AWS e password, ma lo strumento è progettato per essere facilmente espandibile con nuove regole.
rules:rule-id: # unique rule name
description: Values formatted like AWS Session Token
message: AWS Session Token # report will show this message
severity: BLOCKER # one of BLOCKER, CRITICAL, MAJOR, MINOR, INFO
key: # specify key format
regex: (aws.?session.?token)?
ignorecase: True # case-insensitive matching
value: # specify value format
regex: ^(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9\+\/]{270,450}$
ignorecase: False # case-sensitive matching
minlen: 270 # value is at least this long
isBase64: True # value is base64-encoded
isAscii: False # value is binary data when decoded
isUri: False # value is not formatted like a URI
similar: 0.35 # maximum allowed similarity between key and value
# (1.0 being exactly the same)
Tutta la funzionalità di parsing è implementata tramite plugin. Ogni plugin implementa una classe con il metodo pairs() che scorre i file e restituisce le coppie chiave-valore da controllare con le regole.
class PluginName:
def pairs(self, file):
yield "key", "value"