Every CVE Search/ Get API key

CVE-2026-81876

HAPI FHIR: SHCParser DEFLATE infinite loop causes denial of service

7.5 HighFix available

HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.12, SHCParser in org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java can enter an infinite loop while processing attacker-controlled Smart Health Card JWT content whose header contains zip: "DEF" and whose raw-DEFLATE payload is empty or truncated. SHCParser.decodeJWT() reaches SHCParser.inflate(), where Inflater.inflate() can return zero while Inflater.finished() remains false and Inflater.needsInput() is true. The loop also lacks an Inflater.needsDictionary() termination check, SHCParser.decompress() contains the same zero-progress pattern, and ResourceChecker.java can reach SHC parsing during file-format detection. A malformed validation request can pin a JVM worker thread indefinitely, and concurrent requests can exhaust all validation workers. This issue is fixed in version 6.9.12.

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
None
Integrity
None
Availability
High

Exploit likelihood

0.63%Unchanged since Sep 17, 2026
90%50%10%1%

What each source reports

CVE List Score used 7.5

HAPI FHIR: SHCParser DEFLATE infinite loop causes denial of service

HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.12, SHCParser in org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java can enter an infinite loop while processing attacker-controlled Smart Health Card JWT content whose header contains zip: "DEF" and whose raw-DEFLATE payload is empty or truncated. SHCParser.decodeJWT() reaches SHCParser.inflate(), where Inflater.inflate() can return zero while Inflater.finished() remains false and Inflater.needsInput() is true. The loop also lacks an Inflater.needsDictionary() termination check, SHCParser.decompress() contains the same zero-progress pattern, and ResourceChecker.java can reach SHC parsing during file-format detection. A malformed validation request can pin a JVM worker thread indefinitely, and concurrent requests can exhaust all validation workers. This issue is fixed in version 6.9.12.

Record
CVE-2026-81876
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-20, CWE-400, CWE-835
Updated
2026-11-02
EUVDEUVD-2026-80998 7.5

HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.12, SHCParser in org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java can enter an infinite loop while processing attacker-controlled Smart Health Card JWT content whose header contains zip: "DEF" and whose raw-DEFLATE payload is empty or truncated. SHCParser.decodeJWT() reaches SHCParser.inflate(), where Inflater.inflate() can return zero while Inflater.finished() remains false and Inflater.needsInput() is true. The loop also lacks an Inflater.needsDictionary() termination check, SHCParser.decompress() contains the same zero-progress pattern, and ResourceChecker.java can reach SHC parsing during file-format detection. A malformed validation request can pin a JVM worker thread indefinitely, and concurrent requests can exhaust all validation workers. This issue is fixed in version 6.9.12.

Record
EUVD-2026-80998
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-gq9c-wmrm-5hvr 7.5

HAPI FHIR: SHCParser DEFLATE infinite loop causes denial of service

Summary

A malformed Smart Health Card (SHC) JWT with zip: "DEF" and an empty or truncated DEFLATE payload causes SHCParser.inflate() to loop forever. This allows an attacker who can submit SHC content for validation to pin a JVM worker thread indefinitely, causing denial of service.

Details

The vulnerable code is in org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java.

decodeJWT() inflates the JWT payload when the header contains "zip":"DEF":

// SHCParser.java:300-302
if ("DEF".equals(res.header.asString("zip"))) {
  payloadJson = inflate(payloadJson);
}

inflate() loops only on !inflater.finished() and does not check inflater.needsInput(), inflater.needsDictionary(), or zero-progress output:

// SHCParser.java:455-468
while (!inflater.finished()) {
  final int count = inflater.inflate(buffer);
  outputStream.write(buffer, 0, count);
}

For empty or truncated raw DEFLATE input, Inflater.inflate() returns 0, finished() remains false, and needsInput() becomes true, producing an infinite tight loop. The same unsafe loop pattern also exists in decompress() at SHCParser.java:410-423.

The validator reaches this path during SHC validation and during file-format detection for SHC-looking input (ResourceChecker.java:115-118).

PoC

Compile the project, then run a minimal local harness that calls:

SHCParser.inflate(new byte[0]);

This never returns. Local verification:

timeout 3s java -cp ... VerifyDoSFindings shcHang
echo $?
# 124 = timeout killed the hung process

A JWT PoC uses:

  • header: Base64URL({"zip":"DEF"})
  • payload: empty or truncated raw DEFLATE bytes
  • signature: arbitrary

Submit the resulting token as SHC content, for example via a .shc file or content beginning with shc:/ that reaches the validator's SHC detection path.

Impact

This is a denial-of-service vulnerability. A single malformed SHC validation request can consume a worker thread indefinitely. In services that validate uploaded SHC content, a small number of concurrent malformed requests can exhaust all validation workers.

Credits

  • Thai Son Dinh from VinSOC Labs (R&D)
Record
GHSA-gq9c-wmrm-5hvr
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-20, CWE-400, CWE-835
Updated
2026-11-02
NVD 7.5

HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.12, SHCParser in org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java can enter an infinite loop while processing attacker-controlled Smart Health Card JWT content whose header contains zip: "DEF" and whose raw-DEFLATE payload is empty or truncated. SHCParser.decodeJWT() reaches SHCParser.inflate(), where Inflater.inflate() can return zero while Inflater.finished() remains false and Inflater.needsInput() is true. The loop also lacks an Inflater.needsDictionary() termination check, SHCParser.decompress() contains the same zero-progress pattern, and ResourceChecker.java can reach SHC parsing during file-format detection. A malformed validation request can pin a JVM worker thread indefinitely, and concurrent requests can exhaust all validation workers. This issue is fixed in version 6.9.12.

Record
CVE-2026-81876
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-20, CWE-400, CWE-835
Updated
2026-11-02
OSV 7.5

HAPI FHIR: SHCParser DEFLATE infinite loop causes denial of service

HAPI FHIR is a complete implementation of the HL7 FHIR standard for healthcare interoperability in Java. Prior to version 6.9.12, SHCParser in org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java can enter an infinite loop while processing attacker-controlled Smart Health Card JWT content whose header contains zip: "DEF" and whose raw-DEFLATE payload is empty or truncated. SHCParser.decodeJWT() reaches SHCParser.inflate(), where Inflater.inflate() can return zero while Inflater.finished() remains false and Inflater.needsInput() is true. The loop also lacks an Inflater.needsDictionary() termination check, SHCParser.decompress() contains the same zero-progress pattern, and ResourceChecker.java can reach SHC parsing during file-format detection. A malformed validation request can pin a JVM worker thread indefinitely, and concurrent requests can exhaust all validation workers. This issue is fixed in version 6.9.12.

Record
CVE-2026-81876
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-20, CWE-400, CWE-835
Updated
2026-11-02
OSVGHSA-gq9c-wmrm-5hvr 7.5

HAPI FHIR: SHCParser DEFLATE infinite loop causes denial of service

Summary

A malformed Smart Health Card (SHC) JWT with zip: "DEF" and an empty or truncated DEFLATE payload causes SHCParser.inflate() to loop forever. This allows an attacker who can submit SHC content for validation to pin a JVM worker thread indefinitely, causing denial of service.

Details

The vulnerable code is in org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/elementmodel/SHCParser.java.

decodeJWT() inflates the JWT payload when the header contains "zip":"DEF":

// SHCParser.java:300-302
if ("DEF".equals(res.header.asString("zip"))) {
  payloadJson = inflate(payloadJson);
}

inflate() loops only on !inflater.finished() and does not check inflater.needsInput(), inflater.needsDictionary(), or zero-progress output:

// SHCParser.java:455-468
while (!inflater.finished()) {
  final int count = inflater.inflate(buffer);
  outputStream.write(buffer, 0, count);
}

For empty or truncated raw DEFLATE input, Inflater.inflate() returns 0, finished() remains false, and needsInput() becomes true, producing an infinite tight loop. The same unsafe loop pattern also exists in decompress() at SHCParser.java:410-423.

The validator reaches this path during SHC validation and during file-format detection for SHC-looking input (ResourceChecker.java:115-118).

PoC

Compile the project, then run a minimal local harness that calls:

SHCParser.inflate(new byte[0]);

This never returns. Local verification:

timeout 3s java -cp ... VerifyDoSFindings shcHang
echo $?
# 124 = timeout killed the hung process

A JWT PoC uses:

  • header: Base64URL({"zip":"DEF"})
  • payload: empty or truncated raw DEFLATE bytes
  • signature: arbitrary

Submit the resulting token as SHC content, for example via a .shc file or content beginning with shc:/ that reaches the validator's SHC detection path.

Impact

This is a denial-of-service vulnerability. A single malformed SHC validation request can consume a worker thread indefinitely. In services that validate uploaded SHC content, a small number of concurrent malformed requests can exhaust all validation workers.

Credits

  • Thai Son Dinh from VinSOC Labs (R&D)
Record
GHSA-gq9c-wmrm-5hvr
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-20, CWE-400, CWE-835
Updated
2026-11-02
OSVROOT-APP-MAVEN-CVE-2026-81876 No score

CVE-2026-81876 in ca.uhn.hapi.fhir:org.hl7.fhir.r5 - Patched by Root

Root has patched CVE-2026-81876 in the ca.uhn.hapi.fhir:org.hl7.fhir.r5 package for Root:Maven. Multiple fixed versions available.

Record
ROOT-APP-MAVEN-CVE-2026-81876
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
ca.uhn.hapi.fhir:org.hl7.fhir.r5
Maven
through 6.9.11
6.9.12
ca.uhn.hapi.fhir:org.hl7.fhir.validation
Maven
through 6.9.11
6.9.12
ca.uhn.hapi.fhir:org.hl7.fhir.validation.cli
Maven
through 6.9.11
6.9.12
ca.uhn.hapi.fhir:org.hl7.fhir.r5
Maven
before 6.9.12, plus listed versions
0.0.10.0.140.0.20.1.181.0.0
Show 45 moreShow less
1.1.674.0.04.0.14.0.24.0.34.1.04.2.05.0.05.0.105.0.115.0.125.0.135.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.12
ca.uhn.hapi.fhir:org.hl7.fhir.validation
Maven
before 6.9.12, plus listed versions
0.0.10.0.140.0.20.1.181.0.0
Show 45 moreShow less
1.1.674.0.04.0.14.0.24.0.34.1.04.2.05.0.05.0.105.0.115.0.125.0.135.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.12
ca.uhn.hapi.fhir:org.hl7.fhir.validation.cli
Maven
before 6.9.12, plus listed versions
4.0.04.0.14.0.24.0.34.1.04.2.05.0.0
6.9.12
ca.uhn.hapi.fhir:org.hl7.fhir.r5
Root:Maven
before 6.9.10-aikido.1
6.9.10-aikido.16.7.9-aikido.106.9.4.1-aikido.36.9.0-aikido.11
ca.uhn.hapi.fhir:org.hl7.fhir.validation
Root:Maven
before 6.9.10-aikido.1
6.9.10-aikido.16.7.9-aikido.106.9.4.1-aikido.36.9.0-aikido.11
io.root.ca.uhn.hapi.fhir:org.hl7.fhir.r5
Root:Maven
before 6.9.10-root.io.1
6.9.10-root.io.16.7.9-root.io.106.9.4.1-root.io.36.9.0-root.io.11
io.root.ca.uhn.hapi.fhir:org.hl7.fhir.validation
Root:Maven
before 6.9.10-root.io.1
6.9.10-root.io.16.7.9-root.io.106.9.4.1-root.io.36.9.0-root.io.11

History

History
RecordedChangedSources
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-81876 is a high vulnerability (CVSS 7.5) in Hapifhir Org.hl7.fhir.core, published September 16, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.63%, the 50th percentile. Fixed in ca.uhn.hapi.fhir:org.hl7.fhir.r5 6.9.12.

References

This page doesn't list everything

Left out here: 686 versions. The JSON record has them.

MoveEnter Open