conductor-oss/conductor · critical · DocumentAccessDeniedException

Access denied: link-local address range is blocked (host res

Error message

Access denied: link-local address range is blocked (host resolves to {address})

What it means

Thrown by DocumentAccessPolicy.checkResolvedAddress after DNS resolution: the host resolved to an InetAddress whose isLinkLocalAddress() is true (169.254.0.0/16 and IPv6 link-local). This catches obfuscated metadata-IP access (decimal/hex/octal encodings, DNS rebinding) that would slip past the string blocklist, because InetAddress.getByName normalizes all representations before the check. DocumentAccessDeniedException (SecurityException); the resolved address is included in the message.

Source

Thrown at ai/src/main/java/org/conductoross/conductor/ai/document/DocumentAccessPolicy.java:358

                        "Access denied: host '" + host + "' is blocked");
            }
        }

        // Resolve hostname to IP and check for link-local / metadata ranges.
        // This catches obfuscated IPs (hex, octal, decimal encoding) and DNS
        // rebinding because InetAddress.getByName normalizes all representations.
        checkResolvedAddress(host);
    }

    /**
     * Resolves the host to an IP address and blocks link-local (169.254.0.0/16) and other dangerous
     * ranges that are commonly used for SSRF against cloud metadata services.
     */
    private void checkResolvedAddress(String host) {
        try {
            InetAddress addr = InetAddress.getByName(host);
            if (addr.isLinkLocalAddress()) {
                throw new DocumentAccessDeniedException(
                        "Access denied: link-local address range is blocked (host resolves to "
                                + addr.getHostAddress()
                                + ")");
            }
            if (addr.isLoopbackAddress()) {
                throw new DocumentAccessDeniedException(
                        "Access denied: loopback address is blocked (host resolves to "
                                + addr.getHostAddress()
                                + ")");
            }
        } catch (DocumentAccessDeniedException e) {
            throw e;
        } catch (Exception e) {
            // DNS resolution failure — allow the request to proceed and fail naturally
            log.debug(
                    "Could not resolve host '{}' for access policy check: {}",
                    host,
                    e.getMessage());

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Use the real external hostname/IP for the resource you need — link-local addresses are never valid service endpoints.
  2. If this is an SSRF attempt, treat the input as hostile and reject the whole request upstream.
  3. For a misconfigured service, fix its DNS/DHCP so it advertises a routable address.
Defensive patterns

Strategy: validation

Validate before calling

// Resolve and reject link-local before the loader call
java.net.InetAddress a = java.net.InetAddress.getByName(host);
if (a.isLinkLocalAddress()) {
    throw new SecurityException("Refusing link-local host: " + host + " -> " + a.getHostAddress());
}

Try / catch

try {
    loader.download(url);
} catch (SecurityException e) {
    // link-local (169.254/16) is never a valid service endpoint — do not bypass
    throw new SecurityException("Blocked link-local resolution for: " + url, e);
}

Prevention

When it happens

Trigger: A loader is pointed at a hostname or non-canonical IP that resolves into the link-local range, e.g. http://0xa9fe1694/ (hex for 169.254.22.148), a DNS rebinding domain that flips to 169.254.x.x, or fe80::/ IPv6.

Common situations: SSRF/prompt-injection attempts using encoded IP forms; a legitimately misconfigured internal service that advertises a link-local address; IPv6 link-local endpoints.

Understand the failure class

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/eae5e45cc015d52c. Report an issue: GitHub.