-
-
Notifications
You must be signed in to change notification settings - Fork 123
Description
Webhook notifications to internal services are blocked with the error:
webhook URL resolves to private IP [INTERNAL_IP] - private networks are not allowed for security
This occurs even when:
- The webhook is intentionally configured for an internal service
- The user is aware of and accepts the security trade-off
- DNS resolution is working correctly (testing via WebUI succeeds)
Root Cause
The SSRF protection added in commit 6a48c75 ("Fix critical notification system bugs and security issues") blocks all webhook URLs that resolve to private IP
ranges (10/8, 172.16/12, 192.168/16, 127/8, 169.254/16), regardless of user intent.
While this is an excellent security hardening measure for multi-tenant or public deployments, it's overly restrictive for homelab/internal-only environments
where:
- All services are on a trusted private network
- Users intentionally route through internal IPs/hostnames
- DNS rebinding attacks are not a realistic threat
Use Case
A typical homelab setup with Traefik reverse proxy:
Local DNS: internal-service.local → [INTERNAL_IP]
↓
Traefik (reverse proxy on internal VM)
↓
Service (Docker container)
Pulse can't send webhooks to internal-service.local because it resolves to a private IP, even though:
- The domain name correctly routes through the reverse proxy
- WebUI testing works fine (browser makes the request directly)
- This is the standard routing pattern for self-hosted setups
Proposed Solutions
Option 1: Configuration Flag (Recommended)
Add an environment variable to explicitly allow private IP webhooks for homelab deployments:
PULSE_ALLOW_PRIVATE_WEBHOOKS=true
This keeps the default secure (blocks private IPs) while giving homelab users an explicit opt-in.
Option 2: Warning Instead of Error
Log a warning but allow the webhook to proceed:
Warning: Webhook URL resolves to private IP. This is allowed but may indicate a DNS rebinding vulnerability in public deployments.
Option 3: Allowlist Configuration
Let users explicitly allowlist trusted private IP ranges:
{
"webhookAllowedPrivateRanges": ["10.0.0.0/8", "172.16.0.0/12"]
}
Additional Context
- Error message indicates this is working as designed (good security practice for default)
- No documentation about this restriction in WEBHOOKS.md or CONFIGURATION.md
- Security audit was thorough (commit message shows comprehensive SSRF hardening)
- Would benefit from mention in docs for users hitting this issue