
Hook de segurança de pré-escrita independente de hospedeiro para agente de codificação: detecta padrões de entrada do usuário via Semgrep e emite orientações de segurança determinísticas, sem LLM.
Um ponto de verificação de segurança para ferramentas de codificação com IA. Ele examina cada arquivo que um assistente de IA escreve e interrompe os perigosos antes que cheguem ao disco.
Assistentes de codificação com IA (Claude Code, Codex, …) escrevem código rápido — incluindo código que lida com coisas como senhas, e-mails, chaves de API ou entrada bruta do usuário. É fácil para um assistente enviar esses dados diretamente para uma consulta de banco de dados, um comando shell ou uma resposta HTTP sem pensar em segurança.
O VibeGate fica entre o assistente e seu sistema de arquivos. Toda vez que o assistente tenta escrever ou editar um arquivo, o VibeGate examina o novo código primeiro:
Nenhum LLM está envolvido na análise em si — é uma análise estática rápida e determinística, então nunca inventa nada e nunca custa tokens.
Aqui está tudo o que o VibeGate verifica atualmente:
| Verificação | O que detecta | Resultado |
|---|---|---|
| Injeção de comando | Entrada não sanitizada atinge um comando shell | Bloqueia |
| Injeção SQL | Entrada não sanitizada atinge uma consulta de banco de dados | Bloqueia |
| Injeção NoSQL | O corpo da requisição é usado diretamente como um filtro de banco de dados | Bloqueia |
| Injeção de template (SSTI) | A própria fonte do template, não apenas seus dados, vem da entrada do usuário | Bloqueia |
| Desserialização insegura | Dados não confiáveis atingem um desserializador inseguro (pickle, YAML inseguro, ...) | Bloqueia |
| Travessia de diretório (Path traversal) | Entrada não sanitizada atinge uma leitura, gravação ou exclusão de arquivo | Bloqueia |
| XXE | XML não confiável é analisado com entidades externas habilitadas | Bloqueia |
| XSS | Entrada não sanitizada é renderizada como HTML bruto | Bloqueia |
| Upload de arquivo irrestrito | O próprio nome do arquivo enviado é usado para construir o caminho de salvamento | Bloqueia |
| SSRF | O servidor busca uma URL que não está codificada | Avisa |
| Redirecionamento aberto | Um destino de redirecionamento que não está codificado | Avisa |
| Atribuição em massa (Mass assignment) | Todo o corpo da requisição é passado para um construtor ou atualizador de modelo | Avisa |
| Dados sensíveis em um corpo de requisição | E-mails, senhas, tokens, etc. lidos do corpo da requisição | Avisa |
| Dados sensíveis em uma URL/query | E-mails, senhas, tokens, etc. lidos da string de consulta | Avisa |
| Dados sensíveis em cabeçalhos | E-mails, senhas, tokens, etc. lidos dos cabeçalhos da requisição | Avisa |
| Caminho de arquivo vindo da entrada do usuário | Uma variável, não uma string codificada, é usada como caminho de arquivo | Avisa |
| Argumentos de CLI | Dados vêm de argumentos de linha de comando | Avisa |
| Entrada padrão (stdin) | Dados vêm da entrada padrão | Avisa |
| Variáveis de ambiente | Dados vêm de uma variável de ambiente | Avisa |
| Ação do GitHub não fixada (unpinned) | Um workflow usa uma tag mutável (@v4) em vez de um commit SHA | Avisa |
pull_request_target inseguro | Um workflow usa o gatilho pull_request_target | Avisa |
| Registro de credenciais (Credential logging) | Uma senha, chave de API ou token é passado para print/console.log/um logger | Avisa |
| Segredo codificado | Uma variável nomeada como um segredo recebe um valor literal com aparência real | Avisa |
A lista completa e atual reside em guidance.TECHNICAL_RISKS e
formatter.BLOCKING_CATEGORIES, caso esta tabela algum dia se desatualize.
┌───────────────────────────────┐
│ Você pede ao Claude Code │
│ para escrever ou editar │
│ um arquivo │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ Claude Code tenta salvar │
│ o arquivo (ferramenta │
│ Write/Edit) │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ Hook do VibeGate │
│ (executa automaticamente, │
│ antes do arquivo ser salvo)│
└───────────────┬───────────────┘
│
escaneia o novo código com Semgrep
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌────────────────────┐ ┌────────────────────┐ ┌──────────────────────┐
│ Nenhuma entrada │ │ Entrada arriscada, │ │ Entrada arriscada │
│ arriscada │ │ mas risco menor │ │ atinge um sink │
│ encontrada │ │ (ex.: exibida em │ │ crítico │
│ │ │ uma resposta HTTP)│ │ (SQL/command/RCE, │
│ │ │ │ │ injeção de template)│
└─────────┬──────────┘ └─────────┬──────────┘ └───────────┬──────────┘
│ │ │
▼ ▼ ▼
Arquivo é salvo, Arquivo é salvo, Arquivo NÃO é salvo.
nada é exibido. mais um aviso no Claude Code vê
terminal com o o motivo do bloqueio
risco e como e é informado do que
corrigi-lo. corrigir.
Em resumo: código seguro passa intocado, código arriscado mas suportável é salvo com um aviso anexado, e código que está a um passo de coisas como injeção SQL, injeção de comando ou execução remota de código é interrompido antes de chegar ao disco.
Se o próprio VibeGate encontrar um erro inesperado, ele sempre permite a gravação — um bug no hook nunca deve ser o motivo pelo qual seu trabalho é bloqueado.
Cada aviso e bloqueio também carrega uma instrução explícita dizendo ao Claude Code para mencionar a descoberta a você em sua resposta, e não corrigi-la silenciosamente. É isso que torna a atividade do VibeGate visível na conversa, não apenas em um log de terminal que você teria que procurar.