
Hook de seguridad previo a la escritura, independiente del host, para agentes de codificación: detecta patrones de entrada del usuario mediante Semgrep y emite orientación de seguridad determinista y sin LLM.
Un punto de control de seguridad para herramientas de codificación con IA. Revisa cada archivo que un asistente de IA escribe y detiene los peligrosos antes de que lleguen al disco.
Los asistentes de codificación con IA (Claude Code, Codex, …) escriben código rápido, incluido código que maneja cosas como contraseñas, correos electrónicos, claves API o entrada de usuario sin procesar. Es fácil que un asistente envíe esos datos directamente a una consulta de base de datos, un comando de shell o una respuesta HTTP sin pensar en la seguridad.
VibeGate se sitúa entre el asistente y tu sistema de archivos. Cada vez que el asistente intenta escribir o editar un archivo, VibeGate escanea el nuevo código primero:
No interviene ningún LLM en el análisis en sí mismo: es análisis estático rápido y determinista, por lo que nunca inventa cosas y nunca te cuesta tokens.
Esto es todo lo que VibeGate verifica actualmente:
| Comprobación | Qué detecta | Resultado |
|---|---|---|
| Command injection | La entrada no saneada llega a un comando de shell | Bloquea |
| SQL injection | La entrada no saneada llega a una consulta de base de datos | Bloquea |
| NoSQL injection | El cuerpo de la solicitud se usa directamente como filtro de base de datos | Bloquea |
| Template injection (SSTI) | La propia fuente de la plantilla, no solo sus datos, proviene de la entrada del usuario | Bloquea |
| Insecure deserialization | Datos no confiables llegan a un deserializador inseguro (pickle, YAML inseguro, ...) | Bloquea |
| Path traversal | La entrada no saneada llega a una lectura, escritura o eliminación de archivo | Bloquea |
| XXE | XML no confiable se analiza con entidades externas habilitadas | Bloquea |
| XSS | La entrada no saneada se renderiza como HTML sin procesar | Bloquea |
| Unrestricted file upload | El nombre del propio archivo subido se usa para construir la ruta de guardado | Bloquea |
| SSRF | El servidor obtiene una URL que no está codificada | Advierte |
| Open redirect | Un destino de redirección que no está codificado | Advierte |
| Mass assignment | Todo el cuerpo de la solicitud se pasa a un constructor o actualización de modelo | Advierte |
| Sensitive data in a request body | Correos, contraseñas, tokens, etc. leídos del cuerpo de la solicitud | Advierte |
| Sensitive data in a URL/query | Correos, contraseñas, tokens, etc. leídos de la cadena de consulta | Advierte |
| Sensitive data in headers | Correos, contraseñas, tokens, etc. leídos de las cabeceras de la solicitud | Advierte |
| File path from user input | Se usa una variable, no una cadena codificada, como ruta de archivo | Advierte |
| CLI arguments | Los datos provienen de argumentos de línea de comandos | Advierte |
| Standard input | Los datos provienen de stdin | Advierte |
| Environment variables | Los datos provienen de una variable de entorno | Advierte |
| Unpinned GitHub Action | Un flujo de trabajo usa una etiqueta mutable (@v4) en lugar de un SHA de commit | Advierte |
Unsafe pull_request_target | Un flujo de trabajo usa el disparador pull_request_target | Advierte |
| Credential logging | Una contraseña, clave API o token se pasa a print/console.log/un logger | Advierte |
| Hardcoded secret | Una variable con nombre similar a un secreto se asigna a un valor literal que parece real | Advierte |
La lista completa y actualizada vive en guidance.TECHNICAL_RISKS y formatter.BLOCKING_CATEGORIES, por si esta tabla alguna vez se desvía.
┌───────────────────────────────┐
│ Le pides a Claude Code que │
│ escriba o edite un archivo │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ Claude Code intenta guardar │
│ el archivo (herramienta │
│ Write/Edit) │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ Hook de VibeGate │
│ (se ejecuta automáticamente, │
│ antes de guardar el archivo)│
└───────────────┬───────────────┘
│
escanea el nuevo código con Semgrep
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌────────────────────┐ ┌────────────────────┐ ┌──────────────────────┐
│ No se encontró │ │ Entrada riesgosa,│ │ Entrada riesgosa │
│ entrada riesgosa │ │ pero riesgo bajo │ │ llega a un sumidero│
│ │ │ (p. ej. mostrada │ │ crítico (SQL/ │
│ │ │ en una respuesta │ │ comando/RCE, │
│ │ │ HTTP) │ │ inyección de │
│ │ │ │ │ plantillas) │
└─────────┬──────────┘ └─────────┬──────────┘ └───────────┬──────────┘
│ │ │
▼ ▼ ▼
El archivo se guarda, El archivo se guarda, El archivo NO se guarda.
no se muestra nada. además de una advertencia Claude Code ve el motivo
en la terminal con el del bloqueo y se le dice
riesgo y cómo solucionarlo. qué corregir.
En resumen: el código seguro pasa sin cambios, el código riesgoso pero sobrevivible se guarda con una advertencia adjunta, y el código que está a un paso de cosas como inyección SQL, inyección de comandos o ejecución remota de código se detiene antes de llegar al disco.
Si VibeGate encuentra un error inesperado, siempre deja que la escritura continúe: un error en el hook nunca debería ser la razón por la que tu trabajo se bloquea.
Cada advertencia y bloqueo también lleva una instrucción explícita que le dice a Claude Code que mencione el hallazgo en su respuesta, no solo que lo corrija en silencio. Así es como la actividad de VibeGate se vuelve visible en la conversación, no solo en un registro de terminal que tendrías que buscar.