
Identifier les secrets codés en dur dans un texte structuré statique

« Mes petits oiseaux sont partout, même dans le Nord, ils me murmurent les histoires les plus étranges. » – Lord Varys
Whispers est un outil d'analyse statique de code conçu pour analyser divers formats de données courants à la recherche d'informations d'identification codées en dur et de fonctions dangereuses. Whispers peut être exécuté en CLI ou intégré dans votre pipeline CI/CD.
Whispers est conçu pour être un analyseur de texte structuré, pas un analyseur de code.
Les formats couramment utilisés suivants sont actuellement pris en charge :
Les fichiers Python3 sont analysés en tant qu'AST en raison du support natif du langage.
Les fichiers de langage suivants sont analysés en tant que texte et vérifiés pour les motifs courants de déclaration et d'affectation de variables :
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)
Plusieurs options de configuration sont disponibles dans Whispers. Il est possible d'inclure/exclure des résultats en fonction du chemin du fichier, de la clé ou de la valeur. Les chemins de fichiers sont interprétés comme des globs. Les clés et les valeurs acceptent les expressions régulières et plusieurs autres paramètres. Un fichier de configuration par défaut intégré sera utilisé si vous n'en fournissez pas un personnalisé.
config.yml doit avoir la structure suivante :
include:
files:
- "**/*.yml"
exclude:
files:
- "**/test/**/*"
- "**/tests/**/*"
keys:
- ^foo
values:
- bar$
rules:
starks:
message: Murmures du Nord
severity: CRITICAL
value:
regex: (Aria|Ned) Stark
ignorecase: True
Le moyen le plus rapide d'ajuster la détection (c'est-à-dire supprimer les faux positifs et les résultats indésirables) est de copier le fichier config.yml par défaut dans un nouveau fichier, de l'adapter, et de le passer comme argument à Whispers.
whispers --config config.yml --rules starks src/file/or/dir
Les règles spécifient les éléments réels à extraire des paires clé-valeur. Plusieurs règles courantes sont intégrées, comme les clés AWS et les mots de passe, mais l'outil est conçu pour être facilement extensible avec de nouvelles règles.
rules:rule-id: # nom de règle unique
description: Valeurs formatées comme un jeton de session AWS
message: Jeton de session AWS # le rapport affichera ce message
severity: BLOCKER # l'un de BLOCKER, CRITICAL, MAJOR, MINOR, INFO
key: # spécifier le format de la clé
regex: (aws.?session.?token)?
ignorecase: True # correspondance insensible à la casse
value: # spécifier le format de la valeur
regex: ^(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9\+\/]{270,450}$
ignorecase: False # correspondance sensible à la casse
minlen: 270 # la valeur fait au moins cette longueur
isBase64: True # la valeur est codée en base64
isAscii: False # la valeur est des données binaires une fois décodée
isUri: False # la valeur n'est pas formatée comme une URI
similar: 0.35 # similarité maximale autorisée entre clé et valeur
# (1.0 étant exactement identique)
Toutes les fonctionnalités d'analyse sont implémentées via des plugins. Chaque plugin implémente une classe avec la méthode pairs() qui parcourt les fichiers et retourne les paires clé-valeur à vérifier avec les règles.
class PluginName:
def pairs(self, file):
yield "key", "value"