Encontre os caminhos de ataque que importam.
O Basalt lê sua conta AWS e seu código, mapeia a plataforma inteira e mostra os poucos caminhos até dados sensíveis, inclusive os que passam pelos seus agentes de IA.
Seu cliente pergunta. Seu grafo responde.
Cada pergunta de uma revisão de segurança, inclusive a da LGPD, é uma pergunta sobre a sua plataforma. O Basalt encontra a resposta no grafo e anexa a prova.
Seus agentes de IA conseguem chegar a dados de clientes?
Sim. O SupportBot consegue ler s3://customer-exports pela tool read_file.
- Seus agentes de IA conseguem chegar a dados de clientes?Sim. O SupportBot consegue ler s3://customer-exports pela tool read_file.support_bot/tools.py:8infra/iam.tf:22
- Quem consegue assumir roles em produção?Qualquer conta AWS. A ci-deploy confia em "AWS": "*" sem ExternalId.infra/iam/ci.tf:7
- As credenciais ficam fora das configs?Um token em texto puro, numa config de MCP do Cursor. O valor nunca foi guardado..cursor/mcp.json:9
- Algum armazenamento de dados está aberto na internet?Não. Nenhum dos seus data stores permite leitura anônima.bucket policies verificadas
Um caminho, com a prova.
Cada achado é uma cadeia que vai de um ponto de entrada até o dado, com o arquivo, a linha e o recurso por trás de cada passo.
Caminho: uma function URL pública da Lambda, sem autenticação, expõe a função support-api, que executa o agente SupportBot; uma prompt injection faz o agente chamar a tool read_file; a tool usa a role IAM support-bot; a role pode ler s3://customer-exports.
Impacto
De uma function URL pública até leitura em s3://customer-exports, marcado com a tag pii.
Causa
A role permite s3:GetObject em *, e a read_file aceita qualquer caminho de arquivo.
Correção
Restringir a policy a tickets/* e limitar a tool a um diretório. Qualquer uma das duas mudanças quebra o caminho.
Evidência
- infra/lambda.tf:31
- support_bot/agent.py:13
- support_bot/tools.py:8
- infra/iam.tf:22
- arn:aws:s3:::customer-exports
Impacto
Credenciais do banco de produção, da Stripe e da OpenAI, legíveis a partir de qualquer conta AWS.
Causa
A trust policy da ci-deploy permite "AWS": "*" sem condição de sts:ExternalId.
Correção
Indicar a conta de CI no Principal e exigir um ExternalId. A role continua funcionando para o seu pipeline; o caminho deixa de existir.
Evidência
- infra/iam/ci.tf:7
- infra/iam/ci.tf:19
- arn:aws:secretsmanager:us-east-1:…:secret:prod/database
A correção se escreve. Você aprova.
Peça ao assistente do Basalt para fechar um caminho. Ele lê os arquivos envolvidos, escreve a menor mudança que quebra a cadeia e, só depois do seu sim, cria o branch e abre o pull request. Nunca no branch principal.
data "aws_iam_policy_document" "support_bot" { statement { actions = ["s3:GetObject"] resources = ["*"] resources = ["arn:aws:s3:::customer-exports/tickets/*"] }}
from pathlib import PathROOT = Path("/srv/tickets") @tooldef read_file(path: str) -> str: """Read a support attachment.""" target = (ROOT / path).resolve() if not target.is_relative_to(ROOT): raise PermissionError(path) return open(path).read() return target.read_text()
Uma CLI que conhece sua plataforma.
Escaneie um repositório no notebook, cheque um branch antes do deploy ou peça ao assistente para corrigir um caminho. O mesmo motor somente leitura em todo lugar.
- >_Roda localmente
- ●○○Checagem antes do deploy
- <?>Assistente com aprovação
- tf ↔ awsTerraform + AWS ao vivo
Lemos configuração.
Nunca dados.
{ "Effect": "Allow",
"Action": ["iam:GetAccountAuthorizationDetails", "s3:GetBucketPolicy", …] },
{ "Effect": "Deny",
"Action": ["s3:GetObject*", "secretsmanager:GetSecretValue",
"dynamodb:Query", "kms:Decrypt", …] }
Três formas de começar.
Escolha a que combina com o seu momento. Dá para passar para a próxima a qualquer hora.
Veja o que está aberto.
Um scan completo de um produto, todos os caminhos de ataque com evidência e a correção dos dois primeiros críticos.
Grátis, por lista de esperaPasse na revisão.
Uma auditoria pontual, ou o relatório e as respostas que o time de segurança do seu cliente espera, revisados pelo nosso time.
Pagamento únicoContinue fechado.
Scans conforme o código muda, alerta quando uma mudança abre um caminho e a correção como pull request.
AssinaturaRevisões pontuais são abatidas se você assinar.
As primeiras perguntas que recebemos.
Mais detalhes na página de segurança e na documentação.
Que acesso o Basalt precisa?
Na AWS, uma role criada por você, que assumimos com um ExternalId. Ela permite 14 leituras de configuração e nega explicitamente leituras de dados como s3:GetObject e secretsmanager:GetSecretValue. Para o código, a CLI analisa seus repositórios na sua própria máquina; um GitHub App com acesso de leitura aos repositórios que você escolher está sendo liberado.
Vocês leem nossos dados ou guardam nossos secrets?
Não. Lemos configuração e a estrutura do código. Quando a AWS devolve valores de variáveis de ambiente, eles são classificados em memória e descartados; o valor nunca é gravado, logado ou enviado a lugar nenhum.
Dá para testar sem dar acesso a vocês?
Sim. A CLI roda na sua máquina contra um repositório ou Terraform, e contra a AWS com as suas próprias credenciais. Nada sai da máquina a menos que você a vincule a uma conta.
Vocês atacam nossos sistemas?
Não. A análise de caminhos é estática: lê configuração e código e nunca envia tráfego para suas aplicações ou agentes.
Qual a diferença para Wiz, Snyk ou Aikido?
Essas ferramentas listam problemas. O Basalt junta o código dos seus agentes, o IAM e os dados em um único grafo e mostra as poucas cadeias que de fato chegam a algo sensível, a um preço que uma startup consegue pagar. CVEs de dependências e scan de containers continuam com as ferramentas que você já usa.
E os falsos positivos?
Todo achado traz sua evidência e um nível de confiança. Quando uma condição ou um limite de permissão pode mudar o resultado e não conseguimos resolver, o passo é marcado como incerto em vez de ser reportado como crítico.
Encontre seu primeiro caminho nesta semana.
Entre na lista de espera, comece pela Auditoria Essencial ou fale com a gente se já há uma revisão marcada.