Описание
HAPI FHIR: ReDoS via FHIRPath matches()/replaceMatches() in FHIR Validator HTTP Endpoint
Summary
All implementations of FHIRPathEngine accept arbitrary FHIRPath expressions and evaluate them without input validation. The FHIRPath functions matches(), matchesFull(), and replaceMatches() pass user-controlled regular expressions directly to Java's Pattern.compile() and String.replaceAll() without complexity checks or timeouts. An attacker can send a resource containing an evil regex pattern that causes catastrophic backtracking, exhausting system resources, and causing Denial-of-Service.
Details
The vulnerability exists in regex execution in FHIRPathEngine implementations across multiple code modules. For example the org.hl7.fhir.r5 module:
Entry point 1 — FHIRPathEngine.java:5929 (R5 funcMatches):
Entry point 2 — FHIRPathEngine.java:5951 (R5 funcMatchesFull):
Entry point 3 — FHIRPathEngine.java:5120 (R5 funcReplaceMatches):
The same vulnerabilities exist in the dstu2, dstu2016may, dstu3, r4, and r4b modules, and the FHIRPathEngine is used in the validation module functionality.
Why this is exploitable:
- No timeout mechanism covers FHIRPath evaluation — the
ValidationTimeoutclass only protectsInstanceValidatoroperations, notevaluateFhirPath() - Java's
Pattern.compile()with a pattern like(a+)+$against input"aaaaaaaaaaaaaaaaaaaaaa!"causes exponential backtracking (O(2^n) time complexity)
Impact
- CPU Exhaustion: The exponential backtracking in Java's regex engine consumes 100% of a CPU core for the duration of the hang (effectively infinite for sufficiently long input strings) for callers of FHIRPathEngine.
Пакеты
ca.uhn.hapi.fhir:org.hl7.fhir.dstu2
<= 6.9.6
6.9.7
ca.uhn.hapi.fhir:org.hl7.fhir.dstu2016may
<= 6.9.6
6.9.7
ca.uhn.hapi.fhir:org.hl7.fhir.dstu3
<= 6.9.6
6.9.7
ca.uhn.hapi.fhir:org.hl7.fhir.r4
<= 6.9.6
6.9.7
ca.uhn.hapi.fhir:org.hl7.fhir.r4b
<= 6.9.6
6.9.7
ca.uhn.hapi.fhir:org.hl7.fhir.r5
<= 6.9.6
6.9.7
ca.uhn.hapi.fhir:org.hl7.fhir.validation
<= 6.9.6
6.9.7
ca.uhn.hapi.fhir:org.hl7.fhir.validation.cli
<= 6.9.6
6.9.7
Связанные уязвимости
HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to 6.9.7, the FHIRPathEngine implementation passes user-controlled regular expressions from matches(), matchesFull(), and replaceMatches() to Java regex operations without effective timeouts, allowing catastrophic backtracking and denial of service. This issue is fixed in version 6.9.7.