Alertas de CVE por webhook
As CVEs que afetam as tecnologias que você monitora, direto no seu sistema, no Slack ou no Discord: as críticas na hora, o resto num resumo diário. Com rótulos por cliente, para SOC e MSSP.
Como funciona
- Monte a sua lista: produtos do catálogo (FortiOS, Node.js, Windows Server…) ou pacotes de código e de sistema (npm, PyPI, Debian…), cada um com rótulos livres, como cliente-acme.
- A cada 15 minutos, o Vexday cruza as CVEs novas e as que mudaram com a sua lista.
- O que é crítico sai na hora. O resto vai num resumo diário, no horário e no fuso de cada destino.
- O histórico não dispara: ao cadastrar uma tecnologia, as CVEs que já a afetavam ficam como linha de base, sem envio.
Quando um alerta dispara
newUma CVE publicada há até 30 dias passa a afetar uma tecnologia da lista.kevA CVE entra no KEV da CISA: exploração ativa confirmada.exploitAparece a primeira PoC pública da CVE, datada dos últimos 30 dias.epssO EPSS passa do limiar da conta: a chance de exploração subiu.severityO CVSS chega depois da publicação e sobe a CVE para imediato.gov_brUm alerta oficial do governo brasileiro (CTIR Gov, CISC) passa a citar a CVE.Na hora ou no resumo
Política padrão: na hora, KEV, PoC pública, alerta oficial do Brasil, CVSS ≥ 9 ou EPSS ≥ 50%; no resumo diário, CVSS ≥ 4; o resto fica registrado, sem envio.
A política é sua. Para fabricantes de muito volume (Microsoft, Oracle, Cisco), o modelo “só exploração ativa” avisa na hora apenas com sinal de exploração. Cada tecnologia também pode ir sempre na hora ou sempre no resumo. E cada destino tem um teto de imediatos por dia: passou dele, os mais graves saem na hora e o resto vai para o resumo.
Destinos
O botão de teste do painel manda uma mensagem de verificação. A URL do Slack e do Discord fica guardada cifrada.
O que chega no seu endpoint
Um POST por rodada, com até 100 alertas imediatos (type cve.alerts), e um por dia com o resumo (type cve.digest). Os campos de cada CVE são os da API, e o attribution traz os créditos que as licenças das fontes pedem.
{
"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."
]
}Cabeçalhos e assinatura
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>
O X-Vexday-Delivery é o mesmo em todas as tentativas: ignore uma entrega que já processou. Para conferir a assinatura, recalcule o HMAC-SHA256 de "t.corpo" com o segredo do endpoint (está no painel) sobre os bytes crus do corpo, e recuse um t com mais de 5 minutos de diferença:
# 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));
}Planos
O plano muda o volume, nunca o conteúdo: os três têm os mesmos alertas, o resumo, os rótulos e os três destinos. 14 dias grátis para começar, com cartão; cancele quando quiser.
Para começar: um sistema recebendo os alertas.
- 1 endpoint
- 25 tecnologias
- Endpoint JSON, Slack e Discord
- API: 1.000 requisições por dia
Para times com mais de um sistema recebendo.
- 3 endpoints
- 150 tecnologias
- Endpoint JSON, Slack e Discord
- API: 5.000 requisições por dia
Para quem atende vários clientes: um endpoint por cliente.
- 10 endpoints
- 1.000 tecnologias
- Endpoint JSON, Slack e Discord
- API: 20.000 requisições por dia
- MCP para assistentes de IA
Na conta grátis, o painel pode avisar por e-mail quando uma CVE da sua stack entra no KEV.