
Identificar secretos codificados en texto estructurado estático

"Mis pajaritos están en todas partes, incluso en el Norte, me susurran las historias más extrañas." - Lord Varys
Whispers es una herramienta de análisis estático de código diseñada para analizar varios formatos de datos comunes en busca de credenciales codificadas y funciones peligrosas. Whispers puede ejecutarse en la línea de comandos o puedes integrarlo en tu pipeline de CI/CD.
Whispers está pensado para ser un analizador de texto estructurado, no un analizador de código.
Actualmente se admiten los siguientes formatos de uso común:
Los archivos Python3 se analizan como AST debido al soporte nativo del lenguaje.
Los siguientes archivos de lenguaje se analizan como texto y se verifican patrones comunes de declaración y asignación 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)
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 especificaciones de ruta de archivo se interpretan como globs. Las claves y valores aceptan expresiones regulares y varios otros parámetros. Hay un archivo de configuración predeterminado incorporado que se usará si no proporcionas uno personalizado.
config.yml debe tener la siguiente estructura:
include:
files:
- "**/*.yml"
exclude:
files:
- "**/test/**/*"
- "**/tests/**/*"
keys:
- ^foo
values:
- bar$
rules:
starks:
message: Susurros del Norte
severity: CRITICAL
value:
regex: (Aria|Ned) Stark
ignorecase: True
La forma más rápida de ajustar la detección (es decir, eliminar falsos positivos y resultados no deseados) es copiar el config.yml predeterminado en un nuevo archivo, adaptarlo y pasarlo como argumento a Whispers.
whispers --config config.yml --rules starks src/file/or/dir
Las reglas especifican las cosas reales que se deben extraer de los pares clave-valor. Hay varias reglas comunes integradas, como claves y contraseñas de AWS, pero la herramienta está diseñada para expandirse fácilmente con nuevas reglas.
rules:rule-id: # nombre único de la regla
description: Valores formateados como tokens de sesión de AWS
message: Token de sesión de AWS # el informe mostrará este mensaje
severity: BLOCKER # uno de BLOCKER, CRITICAL, MAJOR, MINOR, INFO
key: # especificar formato de clave
regex: (aws.?session.?token)?
ignorecase: True # coincidencia sin distinción de mayúsculas/minúsculas
value: # especificar formato de valor
regex: ^(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9\+\/]{270,450}$
ignorecase: False # coincidencia con distinción de mayúsculas/minúsculas
minlen: 270 # el valor tiene al menos esta longitud
isBase64: True # el valor está codificado en base64
isAscii: False # el valor son datos binarios al decodificar
isUri: False # el valor no tiene formato de URI
similar: 0.35 # similitud máxima permitida entre clave y valor
# (1.0 siendo exactamente iguales)
Toda la funcionalidad de análisis se implementa mediante plugins. Cada plugin implementa una clase con el método pairs() que recorre los archivos y devuelve los pares clave-valor que se verificarán con las reglas.
class NombreDelPlugin:
def pairs(self, file):
yield "key", "value"