Skip to content

DNS Rebinding Security Check Too Strict for Internal Homelab Networks #673

@robmcd527

Description

@robmcd527

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions