Nezha's authenticated DDNS webhook configuration allows blind SSRF from the dashboard host
Date: 2026-05
Affected: go/github.com/naiba/nezha, go/github.com/nezhahq/nezha
Attack vector: ssrf
Category: vulnerability-disclosure
Severity: Medium
CVE: CVE-2026-47268
CWE: CWE-918
CVSS: 6.4 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N)

#### Summary An authenticated Nezha dashboard user can create or update a DDNS profile with provider `webhook` and configure an arbitrary `webhook_url`, HTTP method, request body, and headers. When DDNS is triggered for a server that uses that profile, the dashboard process sends the configured request with `utils.HttpClient` without the SSRF protections used by notification webhooks. This allows a low-privileged authenticated user who controls an owned server/DDNS profile to make the dashboard host issue HTTP requests to loopback or internal network services. The response body is not returned to the attacker in the confirmed path, so this is a blind SSRF / internal state-changing request primitive. #### Details The DDNS API is available to authenticated users, not only administrators: - `cmd/dashboard/controller/controller.go:137` registers `GET /api/v1/ddns`. - `cmd/dashboard/controller/controller.go:139` registers `POST /api/v1/ddns`. - `cmd/dashboard/controller/controller.go:140` registers `PATCH /api/v1/ddns/:id`. The create and update handlers copy attacker-controlled webhook fields directly from JSON request bodies into `model.DDNSProfile`: - `cmd/dashboard/controller/ddns.go:47-74` accepts `model.DDNSForm` and stores `WebhookURL`, `WebhookMethod`, `WebhookRequestType`, `WebhookRequestBody`, and `WebhookHeaders`. - `cmd/dashboard/controller/ddns.go:112-145` updates the same fields after profile ownership is checked. - `model/ddns_api.go:11-15` exposes these fiel


Mitigations:

Architectural layers (MAESTRO):