
Identificar segredos codificados em texto estruturado estático.

"Os meus passarinhos estão por toda a parte, mesmo no Norte, eles sussurram-me as histórias mais estranhas." - Lord Varys
Whispers é uma ferramenta de análise estática de código projetada para analisar vários formatos comuns de dados em busca de credenciais hardcoded e funções perigosas. Whispers pode ser executado na CLI ou você pode integrá-lo no seu pipeline de CI/CD.
Whispers é projetado para ser um analisador de texto estruturado, não um analisador de código.
Os seguintes formatos comumente utilizados são atualmente suportados:
Arquivos Python3 são analisados como ASTs devido ao suporte nativo à linguagem.
Os seguintes arquivos de linguagem são analisados como texto e verificados quanto a padrões comuns de declaração e atribuição de variáveis:
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)
Existem várias opções de configuração disponíveis no Whispers. É possível incluir/excluir resultados com base no caminho do arquivo, chave ou valor. As especificações de caminho de arquivo são interpretadas como globs. Chaves e valores aceitam expressões regulares e vários outros parâmetros. Há um arquivo de configuração padrão embutido que será usado se você não fornecer um personalizado.
config.yml deve ter a seguinte estrutura:
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
A maneira mais rápida de ajustar a detecção (ou seja, remover falsos positivos e resultados indesejados) é copiar o config.yml padrão para um novo arquivo, adaptá-lo e passá-lo como argumento ao Whispers.
whispers --config config.yml --rules starks src/file/or/dir
As regras especificam as coisas reais que devem ser extraídas dos pares chave-valor. Existem várias regras comuns já incorporadas, como chaves e senhas AWS, mas a ferramenta é projetada para ser facilmente expansível com novas regras.
rules:rule-id: # nome único da regra
description: Valores formatados como Token de Sessão AWS
message: Token de Sessão AWS # o relatório mostrará esta mensagem
severity: BLOCKER # um de BLOCKER, CRITICAL, MAJOR, MINOR, INFO
key: # especifica o formato da chave
regex: (aws.?session.?token)?
ignorecase: True # correspondência insensível a maiúsculas/minúsculas
value: # especifica o formato do valor
regex: ^(?=.*[a-z])(?=.*[A-Z])[A-Za-z0-9\+\/]{270,450}$
ignorecase: False # correspondência sensível a maiúsculas/minúsculas
minlen: 270 # o valor tem pelo menos este comprimento
isBase64: True # o valor está codificado em base64
isAscii: False # o valor são dados binários quando decodificado
isUri: False # o valor não é formatado como um URI
similar: 0.35 # similaridade máxima permitida entre chave e valor
# (1.0 sendo exatamente igual)
Toda a funcionalidade de análise é implementada através de plugins. Cada plugin implementa uma classe com o método pairs() que percorre arquivos e retorna os pares chave-valor a serem verificados com as regras.
class PluginName:
def pairs(self, file):
yield "key", "value"