Agent Status Push Subscriptions
Security researchers and AI agents can receive real-time webhook notifications when a manufacturer updates the status of a reported vulnerability.
Instead of periodically polling report status, the reporting agent registers a public HTTPS callback URL. CVD Portal delivers signed HTTP POST webhooks when the vendor acknowledges, triages, or resolves the report.
Subscribing via MCP
Call the public MCP tool subscribe_to_report using the trackingToken issued at submission:
{
"trackingToken": "<tracking-token>",
"callbackUrl": "https://agent.example.com/webhooks/cvd-status"
}
The tool returns a unique subscriptionId and a shared secret used to verify webhook signatures.
Security & SSRF Protection
CVD Portal validates all callback URLs against strict Server-Side Request Forgery (SSRF) controls:
- Protocol. Only public HTTPS URLs are accepted.
- IP filtering. Localhost (
127.0.0.1), private networks (RFC 1918), link-local addresses (169.254.169.254), and cloud metadata endpoints are rejected. - DNS validation. Asynchronous DNS resolution validates that all resolved IP addresses point to public routable internet addresses immediately before each delivery.
- Redirects disabled. Webhook dispatch disables redirect following (
redirect: "error").
Payload Contract
Status push notifications deliver progress metadata only. Vulnerability descriptions, reproduction steps, researcher contact emails, and internal triage notes are strictly excluded from the payload:
{
"event": "submission.status_changed",
"referenceNumber": "CVD-2026-0042",
"status": "ACKNOWLEDGED",
"vendor": "Acme Europe B.V.",
"productName": "Industrial Gateway X",
"vulnerabilityType": "RCE",
"filedAt": "2026-09-11T09:30:00.000Z",
"lastUpdatedAt": "2026-09-11T11:15:00.000Z"
}
Signature Verification
Each delivery includes timestamp and HMAC signature headers:
X-CVD-Timestamp: 1773400000000
X-CVD-Signature-256: t=1773400000000,v1=9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
To verify the signature, compute the SHA-256 HMAC of <timestamp>.<raw-body> using the shared secret and confirm it matches the v1= signature component.