Skip to content

Commit 19738b3

Browse files
bitterpanda63claude
andcommitted
Trim trailing dot and normalize case for trusted IMDS hostnames
DNS resolvers may return hostnames with a trailing dot (FQDN form), e.g. `metadata.google.internal.`. The previous equality check failed to match these, risking false-positive stored-SSRF blocks for GCP IMDS. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent dcde26d commit 19738b3

2 files changed

Lines changed: 14 additions & 1 deletion

File tree

agent_api/src/main/java/dev/aikido/agent_api/vulnerabilities/ssrf/imds/TrustedHosts.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ private TrustedHosts() {}
1313

1414
/** Checks if this hostname is trusted */
1515
public static boolean isTrustedHostname(String hostname) {
16-
return Arrays.asList(trustedHosts).contains(hostname);
16+
String normalized = hostname.toLowerCase();
17+
if (normalized.endsWith(".")) {
18+
normalized = normalized.substring(0, normalized.length() - 1);
19+
}
20+
return Arrays.asList(trustedHosts).contains(normalized);
1721
}
1822
}

agent_api/src/test/java/vulnerabilities/ssrf/ResolverTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,13 @@ void testResolvesToImdsIp_WithMultipleResolvedIps_OnlyTrustedHostname() {
8585

8686
assertNull(Resolver.resolvesToImdsIp(resolvedIps, "metadata.google.internal"));
8787
}
88+
89+
@Test
90+
void testResolvesToImdsIp_TrustedHostnameWithTrailingDot() {
91+
Set<String> resolvedIps = new HashSet<>();
92+
resolvedIps.add("169.254.169.254"); // IMDS IP
93+
94+
assertNull(Resolver.resolvesToImdsIp(resolvedIps, "metadata.google.internal."));
95+
assertNull(Resolver.resolvesToImdsIp(resolvedIps, "metadata.goog."));
96+
}
8897
}

0 commit comments

Comments
 (0)