Crawl4AI: SSRF filter bypass in Docker server via IPv6 transition forms (NAT64 / 6to4 / unspecified / v4-mapped)
Description
Crawl4AI Docker API SSRF filter bypass via IPv6 transition addresses, allowing unauthenticated access to internal services and cloud metadata.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Crawl4AI Docker API SSRF filter bypass via IPv6 transition addresses, allowing unauthenticated access to internal services and cloud metadata.
Vulnerability
The SSRF protection in validate_webhook_url/validate_url_destination in deploy/docker/utils.py used an explicit CIDR blocklist that missed several address families. An attacker can bypass the filter by encoding internal IPv4 addresses inside IPv6 transition forms (e.g., NAT64 64:ff9b::a9fe:a9fe, 6to4 2002:a9fe:a9fe::, IPv4-mapped ::ffff:169.254.169.254, IPv4-compatible ::a9fe:a9fe, or the IPv6 unspecified address ::). The blocklist is applied to crawl endpoints (POST /crawl, /md, /html, /screenshot, /pdf, /execute_js) and webhook URLs (/crawl/job, /llm/job). All affected versions prior to the fix are vulnerable [1][2].
Exploitation
The Docker API is unauthenticated by default (jwt_enabled: false), so no credentials are required. An attacker sends a crafted request to any of the affected endpoints with a URL containing an IPv6 transition form that resolves to an internal address (e.g., 169.254.169.254). The server's blocklist does not catch these forms, allowing the request to proceed. The error message also echoed the resolved internal IP, providing an oracle for DNS/internal network enumeration [1][2].
Impact
Successful exploitation enables Server-Side Request Forgery (SSRF). An unauthenticated attacker can make the server fetch internal-network URLs and cloud instance-metadata endpoints (e.g., http://169.254.169.254/), potentially exposing internal services and cloud credentials [1][2].
Mitigation
The fix replaces the blocklist with a single rule: reject any resolved IP where not ip.is_global, evaluated on the address and every embedded IPv4 transition form (v4-mapped, NAT64 64:ff9b::/96, 6to4 2002::/16, v4-compat ::/96). Error messages are now opaque. Users should upgrade to the patched version. Workarounds include enabling authentication (CRAWL4AI_API_TOKEN) and restricting container outbound network access via egress firewall or no metadata route [1][2].
AI Insight generated on Jun 16, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected products
1Patches
0No patches discovered yet.
Vulnerability mechanics
Root cause
"The SSRF blocklist used explicit CIDR ranges that missed IPv6 transition forms (NAT64, 6to4, v4-mapped, v4-compatible) and the IPv6 unspecified address."
Attack vector
An unauthenticated attacker sends a crafted URL to any of the affected API endpoints, encoding an internal IPv4 address (e.g., `169.254.169.254`) inside an IPv6 transition form such as NAT64 (`64:ff9b::a9fe:a9fe`), 6to4 (`2002:a9fe:a9fe::`), IPv4-mapped (`::ffff:169.254.169.254`), IPv4-compatible (`::a9fe:a9fe`), or the IPv6 unspecified address (`::`) [ref_id=1][ref_id=2]. Because the Docker API is unauthenticated by default (`jwt_enabled: false`), no credentials are required. The server resolves the address and fetches the internal resource, bypassing the blocklist.
Affected code
The SSRF protection functions `validate_webhook_url` and `validate_url_destination` in `deploy/docker/utils.py` used an explicit IPv4/IPv6 CIDR blocklist that missed several address families [ref_id=1][ref_id=2]. The blocklist was applied to crawl endpoints (`POST /crawl`, `/md`, `/html`, `/screenshot`, `/pdf`, `/execute_js`) and webhook endpoints (`/crawl/job`, `/llm/job`), all sharing the same incomplete check.
What the fix does
The patch replaces the explicit CIDR blocklist with a single rule that rejects any resolved IP where `not ip.is_global`, evaluated on the address and every embedded IPv4 transition form (v4-mapped, NAT64 `64:ff9b::/96`, 6to4 `2002::/16`, v4-compat `::/96`) [ref_id=1][ref_id=2]. Error messages are now opaque and no longer echo the resolved IP, closing the DNS/oracle leak.
Preconditions
- networkThe Docker API must be accessible over the network
- authAuthentication must be disabled (jwt_enabled: false, the default)
- inputThe attacker must be able to send HTTP requests to the API endpoints
Generated on Jun 16, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
2News mentions
0No linked articles in our index yet.