Description
The POST /webhooks/ endpoint for creating webhooks uses WebhooksDto which validates the url field with only @IsUrl() (format check), missing the @IsSafeWebhookUrl validator that blocks internal/private network addresses. The update (PUT /webhooks/) and test (POST /webhooks/send) endpoints correctly apply @IsSafeWebhookUrl. When a post is published, the orchestrator fetches the stored webhook URL without runtime validation, enabling blind SSRF against internal services.
Timeline
- 2026-03-28 13:05 UTC - Postiz received the advisory.
- 2026-03-29 15:55 UTC - Postiz acknowledged and verified the advisory.
- 2026-03-29 16:00 UTC - Postiz developed the fix, verified it, created the release and published the advisory.
- 2026-03-30 18:44 UTC - GitHub issued CVE-2026-34590 for this advisory.
Mitigations
- Upgrade to v2.21.4 or later.
Known exploits
- Access to internal network / ressources.
Impact
- Impacts could include:
- Internal network scanning: An attacker can probe internal hosts and ports via timing differences in webhook delivery. Even though responses are not returned, reachability can be inferred.
- Blind interaction with internal services: The SSRF sends POST requests with attacker-influenced body content (serialized post data) to internal services. Services without authentication (e.g., internal APIs, caches, message queues) could be manipulated.
- Cloud metadata access: On cloud deployments (AWS, GCP, Azure), the instance metadata service at 169.254.169.254 may be reachable, potentially exposing IAM credentials or instance configuration. While the response is not reflected to the attacker, the POST request itself reaches the metadata service.
- Persistence: The malicious webhook URL is stored in the database and triggered on every post publication until deleted, creating a persistent SSRF primitive.
References
Description
The
POST /webhooks/endpoint for creating webhooks usesWebhooksDtowhich validates theurlfield with only@IsUrl()(format check), missing the@IsSafeWebhookUrlvalidator that blocks internal/private network addresses. The update (PUT /webhooks/) and test (POST /webhooks/send) endpoints correctly apply@IsSafeWebhookUrl. When a post is published, the orchestrator fetches the stored webhook URL without runtime validation, enabling blind SSRF against internal services.Timeline
Mitigations
Known exploits
Impact
References