Pacto, Carnadas y Fugas
Pacto
Pacto es una lista, por ruta, de las consultas, los hosts, las carpetas y los programas permitidos. Se genera a partir de tus tests y se guarda en vantor.pact.json. En modo bloqueo, rechaza las operaciones que no figuran en la lista.
1. Generar el archivo
En vantor.config.json:
{ "mode": "monitor", "pact": "learn" }
Corré tus tests o usá la aplicación en un entorno de prueba. Vantor escribe vantor.pact.json:
{
"version": 1,
"routes": {
"POST /api/facturas": {
"net": ["api.mercadopago.com"],
"sql": ["insert into facturas ( monto ) values ( ? )"]
}
},
"background": { "net": ["api.resend.com"] }
}
El archivo guarda la forma de cada consulta, sin valores. background lista los hosts que se llaman fuera de una petición, como en un cron.
Usá learn solo con tests o tráfico de confianza. En producción, un atacante podría agregar sus operaciones a la lista.
2. Revisar
Subí el archivo a git para revisar los cambios en cada PR. npx vantor pact muestra un resumen.
3. Aplicar
{ "mode": "block", "pact": "monitor" }
Empezá con monitor para ver qué operaciones faltan, y después pasá a "pact": "block". Lo que no figura en el archivo se reporta con la regla pact o, en bloqueo, falla con VANTOR_BLOCKED.
Una ruta que no figura en el archivo se compara con las operaciones de todas las demás rutas. Solo genera un evento si usa una operación que no figura en ninguna.
Límites de Pacto
- Las rutas se agrupan por forma:
/facturas/42y/facturas/43son/facturas/:id. Un identificador que parece una palabra, como/iglesia/jesus-vive, queda como su propia ruta y recurre a la comparación general. - Las consultas dinámicas, como un filtro que agrega condiciones según lo que elige el usuario, generan muchas formas. Generá el archivo con tests que cubran esas combinaciones.
- Solo registra lo que pasa por los hooks de Vantor. Si cambiás de driver, volvé a generar el archivo.
Carnadas
Rutas y valores señuelo.
Rutas señuelo
Están activas por defecto. Las peticiones a /.env, /.git/config, /wp-login.php, /phpmyadmin y rutas similares generan un evento de la regla decoy. En modo bloqueo responden 404.
{
"decoy": {
"paths": ["/admin-viejo"],
"banMinutes": 30
}
}
banMinutes rechaza al cliente durante ese tiempo. Por defecto no se aplica. Usalo solo con trustProxy configurado. De lo contrario, un escáner puede bloquear a todos los usuarios detrás del mismo proxy.
Valores señuelo
Generá un valor único y guardalo como dato falso en tu base:
npx vantor decoy
# vantor-decoy-9f2c41ab07e3d165c2a8e04f
{ "decoy": { "values": ["vantor-decoy-9f2c41ab07e3d165c2a8e04f"] } }
Si el valor aparece en una respuesta o una petición, se genera un evento. En modo bloqueo, la respuesta no se envía. Verificá que ningún listado legítimo lo incluya.
Fugas
La regla leak revisa cada respuesta de texto antes de enviarla. Si contiene un campo como "password_hash", "hashed_password", "encrypted_password", "totp_secret", o una clave privada, se reporta y, en modo bloqueo, se responde 500.
Para agregar marcadores propios:
{ "leak": { "markers": ["\"cuil_completo\""] } }
Límites de Fugas
- Compresión: si tu aplicación comprime dentro del proceso, con el middleware
compression, Vantor recibe los bytes comprimidos y no puede leerlos. Comprimí en el proxy (Nginx, Caddy). - Streaming: si el dato aparece cuando la respuesta ya empezó a enviarse, Vantor corta la conexión. Lo enviado hasta ese punto ya salió.
- Se revisan los primeros 5 MB de cada respuesta. Los archivos binarios no se revisan.
- Busca nombres de campo y marcadores conocidos. No reconoce datos sensibles por su contenido.