Alertas de CVE por webhook
Las CVE que afectan a las tecnologías que monitoreas, directo en tu sistema, en Slack o en Discord: las críticas al momento, el resto en un resumen diario. Con etiquetas por cliente, para SOC y MSSP.
Cómo funciona
- Arma tu lista: productos del catálogo (FortiOS, Node.js, Windows Server…) o paquetes de código y de sistema (npm, PyPI, Debian…), cada uno con etiquetas libres, como cliente-acme.
- Cada 15 minutos, el Vexday cruza las CVE nuevas y las que cambiaron con tu lista.
- Lo crítico sale al momento. El resto va en un resumen diario, a la hora y en el huso de cada destino.
- El historial no dispara: al registrar una tecnología, las CVE que ya la afectaban quedan como línea de base, sin envío.
Cuándo se dispara una alerta
newUna CVE publicada hace hasta 30 días pasa a afectar una tecnología de la lista.kevLa CVE entra en el KEV de CISA: explotación activa confirmada.exploitAparece la primera PoC pública de la CVE, fechada en los últimos 30 días.epssEl EPSS supera el umbral de la cuenta: subió la probabilidad de explotación.severityEl CVSS llega después de la publicación y sube la CVE a inmediata.gov_brUna alerta oficial del gobierno brasileño (CTIR Gov, CISC) pasa a citar la CVE.Al momento o en el resumen
Política por defecto: al momento, KEV, PoC pública, alerta oficial de Brasil, CVSS ≥ 9 o EPSS ≥ 50 %; en el resumen diario, CVSS ≥ 4; el resto queda registrado, sin envío.
La política es tuya. Para fabricantes de mucho volumen (Microsoft, Oracle, Cisco), el modelo «solo explotación activa» avisa al momento únicamente con señal de explotación. Cada tecnología también puede ir siempre al momento o siempre al resumen. Y cada destino tiene un tope de inmediatas por día: al pasarlo, las más graves salen al momento y el resto va al resumen.
Destinos
El botón de prueba del panel envía un mensaje de verificación. La URL de Slack y de Discord se guarda cifrada.
Lo que llega a tu endpoint
Un POST por ronda, con hasta 100 alertas inmediatas (type cve.alerts), y uno por día con el resumen (type cve.digest). Los campos de cada CVE son los de la API, y attribution trae los créditos que piden las licencias de las fuentes.
{
"id": "4bf933c7-c07a-4a45-a1b0-8729d2eebc8e",
"type": "cve.alerts",
"api_version": "2026-11-01",
"created_at": "2026-11-03T14:05:00+00:00",
"events": [{
"id": "0b6d9a51-8c2e-4f7a-9d3b-2e5c1a7f4b60",
"level": "immediate",
"reason": "kev",
"created_at": "2026-11-03T14:00:12+00:00",
"severity": 9.8, "severity_source": "cvss",
"cve": {
"id": "CVE-2026-12345",
"title": "…",
"cvss": 9.8, "cvss_severity": "CRITICAL",
"cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"epss": 0.71, "epss_percentile": 0.99,
"in_kev": true, "kev_ransomware": false,
"kev_due_date": "2026-11-24",
"kev_required_action": "Apply mitigations per vendor instructions…",
"ssvc_exploitation": "active",
"has_public_poc": true, "has_nuclei": true, "has_metasploit": false,
"vulncheck_kev": true, "vulncheck_reported_exploit": true,
"published": "2026-11-01T10:00:00+00:00",
"url": "https://vexday.io/pt/cve/CVE-2026-12345",
"gov_br_alerts": []
},
"matched": [{
"kind": "product", "slug": "fortinet-fortios", "name": "FortiOS",
"vendor": "Fortinet", "ecosystem": null, "tags": ["cliente-acme"]
}]
}],
"attribution": [
"CVE® records © The MITRE Corporation, used under the CVE Terms of Use (https://www.cve.org/Legal/TermsOfUse).",
"This product uses data from the NVD API but is not endorsed or certified by the NVD."
]
}Encabezados y firma
Content-Type: application/json User-Agent: Vexday-Webhooks/1 X-Vexday-Event: cve.alerts X-Vexday-Delivery: 4bf933c7-c07a-4a45-a1b0-8729d2eebc8e X-Vexday-Signature: t=1762178700,v1=<HMAC-SHA256 hex>
El X-Vexday-Delivery es el mismo en todos los intentos: ignora una entrega que ya procesaste. Para comprobar la firma, recalcula el HMAC-SHA256 de "t.cuerpo" con el secreto del endpoint (está en el panel) sobre los bytes crudos del cuerpo, y rechaza un t con más de 5 minutos de diferencia:
# Python
import hashlib, hmac, time
def verify_signature(secret: str, body: bytes, header: str, tolerance=300) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
t, v1 = parts.get("t", "0"), parts.get("v1", "")
if abs(time.time() - int(t)) > tolerance:
return False
expected = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(v1, expected)// Node.js
const crypto = require("crypto");
// body: the raw body (Buffer), before JSON.parse
function verifySignature(secret, body, header, tolerance = 300) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const t = parts.t || "0";
if (Math.abs(Date.now() / 1000 - Number(t)) > tolerance) return false;
const expected = crypto.createHmac("sha256", secret)
.update(Buffer.concat([Buffer.from(t + "."), body]))
.digest("hex");
const got = Buffer.from(parts.v1 || "");
return got.length === expected.length &&
crypto.timingSafeEqual(got, Buffer.from(expected));
}Planes
El plan cambia el volumen, nunca el contenido: los tres tienen las mismas alertas, el resumen, las etiquetas y los tres destinos. 14 días gratis para empezar, con tarjeta; cancela cuando quieras.
Para empezar: un sistema recibiendo las alertas.
- 1 endpoint
- 25 tecnologías
- Endpoint JSON, Slack y Discord
- API: 1000 peticiones por día
Para equipos con más de un sistema recibiendo.
- 3 endpoints
- 150 tecnologías
- Endpoint JSON, Slack y Discord
- API: 5000 peticiones por día
Para quien atiende a varios clientes: un endpoint por cliente.
- 10 endpoints
- 1000 tecnologías
- Endpoint JSON, Slack y Discord
- API: 20.000 peticiones por día
- MCP para asistentes de IA
En la cuenta gratuita, el panel puede avisar por correo cuando una CVE de tu stack entra en el KEV.