Identificar secretos codificados de forma rígida en texto estructurado estático

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"