wasviking-sentinel secrets
Encontre secrets vazados em disco e no histórico do git, opcionalmente verifique ao vivo se eles estão ativos, sem que os secrets brutos saiam do host.
wasviking-sentinel secrets roda localmente no host, percorre o sistema
de arquivos e, opcionalmente, o histórico do git, e reporta credenciais
vazadas. A propriedade central: os secrets brutos nunca saem do host.
Apenas um hash SHA-256 e uma prévia mascarada chegam à WASViking®.
Cobertura OWASP: A07 (Identification and Authentication Failures), CWE-798 (Use of Hard-coded Credentials).
O que ele detecta
O catálogo de detectores vem com 32 padrões, incluindo:
| Provedor | O que é detectado |
|---|---|
| AWS | Pares de access key ID + secret access key, tokens de sessão. |
| GitHub | Personal access tokens (classic e fine-grained), tokens de instalação de app. |
| GitLab | Personal access tokens, tokens de registro de runner. |
| Stripe | Chaves de API live e de teste (sk_live, sk_test). |
| SendGrid | Chaves de API. |
| Slack | Tokens de bot, tokens de usuário, URLs de webhook. |
| PagerDuty | Chaves de integração de serviço. |
| Twilio | Account SIDs + auth tokens. |
| Banco de dados | URIs de conexão de Postgres / MySQL / MongoDB / Redis com credenciais. |
| Genérico | Chaves privadas RSA / EC / OpenSSH. |
| Provedores de nuvem | JSON de service account do GCP, connection strings do Azure. |
O catálogo completo de detectores faz parte do binário. Novos detectores chegam a cada release.
O que ele NÃO detecta
Para suprimir ruído:
- Fixtures de teste e valores fictícios bem conhecidos (
aws_secret_key_AKIA…EXAMPLE). - Placeholders de documentação com
EXAMPLE,PLACEHOLDER,XXXX. - Arquivos em caminhos comuns de documentação e teste (
/docs/,/__tests__/,*.test.{js,ts,py}). - Padrões sinalizados pelo classificador de IA como texto que é obviamente placeholder.
Verificação de licença (preflight)
Antes de qualquer trabalho local, secrets chama o endpoint de preflight
da WASViking para confirmar que a chave de API da organização está ativa.
Isso é exigido mesmo quando você não está enviando resultados.
--api-key(ou a variável de ambienteWASV_API_KEY) é obrigatória. Ausente ou vazia, a execução é recusada com exit 1.- A verificação é
POST /api/v1/sentinel/preflight. Qualquer chave de API ativa da organização passa; nenhum escopo específico é necessário para o preflight em si. - O resultado fica em cache em
~/.wasviking/preflight_cache.json(modo0600) por 30 minutos por padrão (TTL vindo do servidor, limitado a 60s..6h). - Dentro do TTL, as chamadas seguintes pulam a rede por completo.
- Se a API estiver inacessível, mas houver em disco uma aprovação recente e bem-sucedida (dentro de uma janela de tolerância de 24 horas), a execução continua. Indisponibilidades curtas da WASViking não quebram o CI do cliente.
- Se a API rejeitar ativamente a chave (401 / 403), a janela de tolerância não se aplica. Chaves revogadas bloqueiam na próxima expiração do cache.
- A chave do cache é um SHA-256 truncado da chave de API, então rotacionar a chave invalida o cache automaticamente.
A flag
--submité independente.--api-keyé obrigatória independentemente de você enviar resultados ou não.
Uso básico
A partir do diretório que contém a árvore de código-fonte:
export WASV_API_KEY="wv_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
wasviking-sentinel secrets --path .
[sentinel] Walking .
[sentinel] Files scanned: 5,142
[sentinel] Secrets detected: 4
[sentinel] aws_secret_key src/config/prod.py:18 unverified
[sentinel] github_pat scripts/deploy.sh:5 unverified
[sentinel] stripe_sk_live src/billing/keys.py:3 unverified
[sentinel] slack_webhook src/alerts/post.go:9 unverified
Os artefatos de relatório são gravados em --out (padrão .).
Verificação ao vivo
10 detectores oferecem verificação ao vivo opcional. O agente consulta o endpoint legítimo do provedor para checar se o secret está válido no momento.
wasviking-sentinel secrets --path . --verify
[sentinel] aws_secret_key src/config/prod.py:18 VERIFIED LIVE
[sentinel] stripe_sk_live src/billing/keys.py:3 VERIFIED LIVE
[sentinel] github_pat scripts/deploy.sh:5 invalid (404 from provider)
[sentinel] slack_webhook src/alerts/post.go:9 no verifier available
A verificação ao vivo:
- Usa endpoints de identidade somente leitura do provedor sempre que possível.
- Nunca modifica estado no provedor remoto.
- Registra o endpoint do verificador no log do agente, para que um auditor possa ver exatamente o que foi consultado.
Garantia de privacidade
O payload de envio para a WASViking contém:
- ID do detector e severidade.
- Caminho do arquivo e número da linha.
- Um hash SHA-256 do secret bruto.
- Uma prévia mascarada (
AKIA••••••••••••••••XYZ7). - Resultado da verificação ao vivo (booleano).
O secret bruto fica em memória no host apenas pelo tempo necessário para verificá-lo (se solicitado) e depois é descartado. Ele nunca é gravado em nenhum sistema da WASViking.
Histórico do git
wasviking-sentinel secrets --path . --git
--git percorre o histórico do git do repositório além da working
tree. Útil para encontrar secrets que foram commitados e depois
"removidos" por um commit posterior, mas que continuam vivos no histórico.
Mais lento que um scan da working tree; roda sobre todos os commits
alcançáveis no repositório local.
Envie para o seu tenant
wasviking-sentinel secrets \
--path . \
--submit \
--api-key "$WASV_API_KEY"
Os achados chegam ao portal em Application Security → Hard-coded Secrets como Findings,
com a categoria token_exposure ou credential_exposure. Eles alimentam o
Risk Score e o fluxo de trabalho de Findings.
Referência de flags
| Flag | Finalidade | Padrão |
|---|---|---|
--path |
Diretório a analisar, de forma recursiva. | . |
--out |
Diretório onde gravar os artefatos de relatório. | . |
--fail-on |
Limite de severidade: critical, high, medium, low, none. |
high |
--git |
Percorre também o histórico do git do repositório (mais lento). | false |
--verify |
Chama os endpoints de identidade dos provedores para confirmar que as ocorrências estão ativas (somente leitura). | false |
--submit |
Faz POST das ocorrências para a API da WASViking depois do scan. | false |
--api |
URL base da API da WASViking. Env: WASV_API. |
https://api.wasviking.com |
--api-key |
Chave de API da organização. Obrigatória em toda execução (preflight). Adicione o escopo secrets:submit à chave se você também usa --submit. Env: WASV_API_KEY. |
(obrigatória) |
--timeout |
Tempo máximo total (wall-clock) do pipeline de secrets. | 10m0s |
Exit codes
| Exit code | Significado |
|---|---|
| 0 | OK. Nada no limite de --fail-on ou acima dele. |
| 1 | Falha genérica (IO, rede, parse). |
| 2 | Argumento inválido, ou --submit sem uma chave de API. |
| 73 | Uma credencial no limite de --fail-on ou acima dele que o --verify confirmou como ativa. |
| 74 | Ocorrências no limite de --fail-on ou acima dele que não foram verificadas. |
| 79 | Falha de cobertura: a raiz não pôde ser percorrida, então nada foi analisado. Nunca é retornado para um projeto que está simplesmente vazio. Veja Falhas de cobertura. |
A separação entre 73 e 74 existe para que um pipeline possa tratar uma credencial confirmada como ativa como um incidente e uma ocorrência não verificada como um item de revisão, sem fazer parse do log.
O próprio secrets pode ser usado como gate de CI via --fail-on. Para o
wrapper de nível mais alto, que combina secrets + sbom + scans
orientados por template em uma única passada, veja wasviking-sentinel ci.
Integração com CI
Veja wasviking-sentinel ci para o wrapper de
gate de CI/CD. O subcomando secrets sozinho serve bem para pipelines que
só precisam deste gate.
