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
- Use the real external hostname/IP for the resource you need — link-local addresses are never valid service endpoints.
- If this is an SSRF attempt, treat the input as hostile and reject the whole request upstream.
- 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
- Use routable hostnames/IPs for all external resources.
- Treat encoded/obfuscated IPs in input as hostile.
- Pin services to stable public DNS, not link-local addresses.
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
- Authentication and authorization failures — expired tokens, bad credentials, and missing scopes.
Related errors
- Access denied: host '{host}' is blocked
- Access denied: loopback address is blocked (host resolves to
- Access denied: path matches blocked prefix '{prefix}'
- agentUrl resolves to a cloud metadata address — SSRF blocked
- Access denied: file name '{fileName}' is blocked
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/eae5e45cc015d52c.
Report an issue: GitHub.