Whispers es una herramienta de análisis de código estático diseñada para analizar varios formatos de datos populares en busca de credenciales codificadas y características peligrosas. Los susurros se pueden ejecutar en la CLI o puede integrarlo con su canal de CI / CD.
Reconoce
- Contraseñas
- Token de API
- Clave de AWS
- Claves privadas
- Credenciales hash
- Token de autenticación
- Funciones peligrosas
- Archivos sensibles
Formatos admitidos
Se dice que los susurros son un texto estructurado Analizador, no analizador de código.
Actualmente se admiten los siguientes formatos de uso común:
- YAML
- JSON
- XML
- .npmrc
- .pypirc
- .htpasswd
- .Propiedades
- pip.conf
- conf / ini
- Dockerfile
- Dockercfg
- Secuencias de comandos de Shell
- Python3
Los archivos Python3 se analizan como AST debido a la compatibilidad con el idioma nativo.
Formatos de declaración y asignación
Los siguientes archivos de idioma se analizan como texto y se comprueban para determinar la declaración de variables generales y los patrones de asignación:
Formatos especiales
- Archivos de credenciales de AWS
- Cadenas de conexión JDBC
- Archivos de configuración de Jenkins
- Archivos de configuración de SpringFramework Beans
- Archivos de propiedades de Java
- Archivos de autenticación de registro privado de Dockercfg
- Token de Github
instalación
De PyPI
De GitHub
git clone https://github.com/Skyscanner/whisperscd whispersmake install
propósito de uso
CLI
whispers --helpwhispers --infowhispers source/code/fileOrDirwhispers --config config.yml source/code/fileOrDirwhispers --output /tmp/secrets.yml source/code/fileOrDirwhispers --rules aws-id,aws-secret source/code/fileOrDirwhispers --severity BLOCKER,CRITICAL source/code/fileOrDirwhispers --exitcode 7 source/code/fileOrDir
pitón
from whispers.cli import parse_argsfrom whispers.core import runsrc = "http://www.kitploit.com/2021/11/tests/fixtures"configfile = "whispers/config.yml"args = parse_args(["-c", configfile, src])for secret in run(args):print(secret)
Config
Hay varias opciones de configuración disponibles en Whispers. Es posible incluir / excluir resultados según la ruta del archivo, la clave o el valor. Las rutas de archivo se interpretan como globales. Las claves y los valores aceptan expresiones regulares y varios otros parámetros. Hay un archivo de configuración predeterminado incorporado que se utilizará si no proporciona uno personalizado.
config.yml debe tener la siguiente estructura:
include:files:- "**/*.yml"exclude:files:- "**/test/**/*"- "**/tests/**/*"keys:- ^foovalues:- bar$rules:starks:message: Whispers from the Northseverity: CRITICALvalue:regex: (Aria|Ned) Starkignorecase: True
La forma más rápida de optimizar la detección (es decir, eliminar falsos positivos y resultados no deseados) es copiar el archivo config.yml estándar en un archivo nuevo, adaptarlo y pasarlo como argumento a Whispers.
whispers –config config.yml –rules starks src/file/or/dir
Reglas personalizadas
Las reglas especifican las cosas reales que se extraerán de los pares clave-valor. Hay varias incorporadas populares, como AWS Keys y Passwords, pero la herramienta está diseñada para ser fácilmente ampliable con nuevas reglas.
- Las reglas personalizadas se pueden encontrar en el archivo de configuración principal en. Por definir rules:
- Se pueden agregar reglas personalizadas a susurros / reglas
rule-id: # unique rule namedescription: Values formatted like AWS Session Tokenmessage: AWS Session Token # report will show this messageseverity: BLOCKER # one of BLOCKER, CRITICAL, MAJOR, MINOR, INFOkey: # specify key formatregex: (aws.?session.?token)?ignorecase: True # case-insensitive matchingvalue: # specify value formatregex: ^(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9+/]{270,450}$ignorecase: False # case-sensitive matchingminlen: 270 # value is at least this longisBase64: True # value is base64-encodedisAscii: False # value is binary data when decodedisUri: False # value is not formatted like a URIsimilar: 0.35 # maximum allowed similarity between key and value # (1.0 being exactly the same)
Complementos
Todas las funciones de análisis se implementan mediante complementos. Cada complemento implementa una clase con el pairs() Método que recorre los archivos en iteración y devuelve los pares clave-valor que se comprobarán con las reglas.
class PluginName:def pairs(self, file):yield "key", "value"