CVE-2026-54556
Http4s: HTTP/2 Denial of Service with Ember Backend
Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, an unauthenticated HTTP/2 peer can cause an out-of-memory denial of service in the Ember backend with HTTP/2 enabled. The Hpack wrapper in ember-core/shared/src/main/scala/org/http4s/ember/core/h2/Hpack.scala concatenates HEADERS and CONTINUATION frame fragments and decodes them into a single List, but maxHeaderSize accounting does not include indexed headers or HPACK per-header overhead. A small compressed header block can therefore expand into a much larger decoded representation that remains in memory for processing. Servers exposed to untrusted HTTP/2 traffic and clients directed to an untrusted HTTP/2 server are affected, and concurrent malicious connections can exhaust the process heap. This issue is fixed in versions 0.23.35 and 1.0.0-M47.
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
What each source reports
CVE List Score used
8.2
Http4s: HTTP/2 Denial of Service with Ember Backend
Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, an unauthenticated HTTP/2 peer can cause an out-of-memory denial of service in the Ember backend with HTTP/2 enabled. The Hpack wrapper in ember-core/shared/src/main/scala/org/http4s/ember/core/h2/Hpack.scala concatenates HEADERS and CONTINUATION frame fragments and decodes them into a single List, but maxHeaderSize accounting does not include indexed headers or HPACK per-header overhead. A small compressed header block can therefore expand into a much larger decoded representation that remains in memory for processing. Servers exposed to untrusted HTTP/2 traffic and clients directed to an untrusted HTTP/2 server are affected, and concurrent malicious connections can exhaust the process heap. This issue is fixed in versions 0.23.35 and 1.0.0-M47.
- Record
CVE-2026-54556- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-409
- Updated
- 2026-11-02
EUVDEUVD-2026-66558
8.2
Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, an unauthenticated HTTP/2 peer can cause an out-of-memory denial of service in the Ember backend with HTTP/2 enabled. The Hpack wrapper in ember-core/shared/src/main/scala/org/http4s/ember/core/h2/Hpack.scala concatenates HEADERS and CONTINUATION frame fragments and decodes them into a single List, but maxHeaderSize accounting does not include indexed headers or HPACK per-header overhead. A small compressed header block can therefore expand into a much larger decoded representation that remains in memory for processing. Servers exposed to untrusted HTTP/2 traffic and clients directed to an untrusted HTTP/2 server are affected, and concurrent malicious connections can exhaust the process heap. This issue is fixed in versions 0.23.35 and 1.0.0-M47.
- Record
EUVD-2026-66558- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-vmm3-xgcx-67hm
8.2
http4s has HTTP/2 Denial of Service with Ember Backend
Summary
http4s 0.23.x and 1.0 servers running ember with http2 enabled are vulnerable to a denial of service attack using a HPACK bomb vulnerability recently disclosed as affecting other http2 servers.
Impact
Denial of Service:
- Affects any http4s server running the ember backend with HTTP/2 enabled that is exposed to untrusted traffic.
- Affects any http4s client running the ember backend with HTTP/2 enabled that can be directed to an untrusted server.
Details
The issue occurs in the Hpack wrapper. Ember concatenates the header and continuation frames before decoding all headers at once. When the code decodes the attack payload, the relatively small packets decode to a significantly larger amount of data which is returned as a single List which is then held in memory for further processing. With enough concurrent connections (~5 with a 2GB heap in testing) this leads to an OOM, eg:
java.lang.OutOfMemoryError: Java heap space
at scala.collection.mutable.ListBuffer.scala$collection$mutable$ListBuffer$$freshFrom(ListBuffer.scala:129)
at scala.collection.mutable.ListBuffer.addAll(ListBuffer.scala:147)
at scala.collection.mutable.ListBuffer.addAll(ListBuffer.scala:40)
at scala.collection.mutable.Growable.$plus$plus$eq(Growable.scala:69)
at scala.collection.mutable.Growable.$plus$plus$eq$(Growable.scala:69)
at scala.collection.mutable.AbstractBuffer.$plus$plus$eq(Buffer.scala:314)
at org.http4s.Header$.org$http4s$Header$ToRaw$$anon$10$$_$$lessinit$greater$$anonfun$2(Header.scala:192)
at org.http4s.Header$ToRaw$$anon$10$$Lambda/0x00001fe001239c50.apply(Unknown Source)
at scala.collection.immutable.List.foreach(List.scala:334)
at org.http4s.Header$ToRaw$$anon$10.<init>(Header.scala:192)
at org.http4s.Header$ToRaw$.scalaCollectionSeqToRaw(Header.scala:195)
at org.http4s.Headers$.apply(Headers.scala:220)
at org.http4s.ember.core.h2.PseudoHeaders$.headersToRequestNoBody(PseudoHeaders.scala:95)
at org.http4s.ember.core.h2.H2Stream.receiveHeaders$$anonfun$1$$anonfun$2$$anonfun$3$$anonfun$2(H2Stream.scala:248)
at org.http4s.ember.core.h2.H2Stream$$Lambda/0x00001fe001511fd8.apply(Unknown Source)
at cats.effect.IOFiber.runLoop(IOFiber.scala:429)
at cats.effect.IOFiber.autoCedeR(IOFiber.scala:1460)
at cats.effect.IOFiber.run(IOFiber.scala:129)
at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:935)
Fix
The Hpack handling code has a configurable max header size parameter, but it does not include indexed headers in that accounting, allowing the attack to bypass the limit. There is not any configuration available in current http4s versions that can be enabled to prevent this attack short of disabling http2.
A fix has been tested locally that threads the maxHeaderSize setting from the server builder into the Hpack code. Using this, connections can be prematurely terminated once the decoded data size exceeds the maxHeaderSize that users can already configure.
Workarounds
If you can't upgrade immediately:
- Disable HTTP/2 in Ember backends
- Record
GHSA-vmm3-xgcx-67hm- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-409
- Updated
- 2026-11-02
NVD
8.2
Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, an unauthenticated HTTP/2 peer can cause an out-of-memory denial of service in the Ember backend with HTTP/2 enabled. The Hpack wrapper in ember-core/shared/src/main/scala/org/http4s/ember/core/h2/Hpack.scala concatenates HEADERS and CONTINUATION frame fragments and decodes them into a single List, but maxHeaderSize accounting does not include indexed headers or HPACK per-header overhead. A small compressed header block can therefore expand into a much larger decoded representation that remains in memory for processing. Servers exposed to untrusted HTTP/2 traffic and clients directed to an untrusted HTTP/2 server are affected, and concurrent malicious connections can exhaust the process heap. This issue is fixed in versions 0.23.35 and 1.0.0-M47.
- Record
CVE-2026-54556- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Weakness
- CWE-409
- Updated
- 2026-11-02
OSV
8.2
Http4s: HTTP/2 Denial of Service with Ember Backend
Http4s is a Scala interface for HTTP services. Prior to 0.23.35 and 1.0.0-M47, an unauthenticated HTTP/2 peer can cause an out-of-memory denial of service in the Ember backend with HTTP/2 enabled. The Hpack wrapper in ember-core/shared/src/main/scala/org/http4s/ember/core/h2/Hpack.scala concatenates HEADERS and CONTINUATION frame fragments and decodes them into a single List, but maxHeaderSize accounting does not include indexed headers or HPACK per-header overhead. A small compressed header block can therefore expand into a much larger decoded representation that remains in memory for processing. Servers exposed to untrusted HTTP/2 traffic and clients directed to an untrusted HTTP/2 server are affected, and concurrent malicious connections can exhaust the process heap. This issue is fixed in versions 0.23.35 and 1.0.0-M47.
- Record
CVE-2026-54556- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-409
- Updated
- 2026-11-02
OSVGHSA-vmm3-xgcx-67hm
8.2
http4s has HTTP/2 Denial of Service with Ember Backend
Summary
http4s 0.23.x and 1.0 servers running ember with http2 enabled are vulnerable to a denial of service attack using a HPACK bomb vulnerability recently disclosed as affecting other http2 servers.
Impact
Denial of Service:
- Affects any http4s server running the ember backend with HTTP/2 enabled that is exposed to untrusted traffic.
- Affects any http4s client running the ember backend with HTTP/2 enabled that can be directed to an untrusted server.
Details
The issue occurs in the Hpack wrapper. Ember concatenates the header and continuation frames before decoding all headers at once. When the code decodes the attack payload, the relatively small packets decode to a significantly larger amount of data which is returned as a single List which is then held in memory for further processing. With enough concurrent connections (~5 with a 2GB heap in testing) this leads to an OOM, eg:
java.lang.OutOfMemoryError: Java heap space
at scala.collection.mutable.ListBuffer.scala$collection$mutable$ListBuffer$$freshFrom(ListBuffer.scala:129)
at scala.collection.mutable.ListBuffer.addAll(ListBuffer.scala:147)
at scala.collection.mutable.ListBuffer.addAll(ListBuffer.scala:40)
at scala.collection.mutable.Growable.$plus$plus$eq(Growable.scala:69)
at scala.collection.mutable.Growable.$plus$plus$eq$(Growable.scala:69)
at scala.collection.mutable.AbstractBuffer.$plus$plus$eq(Buffer.scala:314)
at org.http4s.Header$.org$http4s$Header$ToRaw$$anon$10$$_$$lessinit$greater$$anonfun$2(Header.scala:192)
at org.http4s.Header$ToRaw$$anon$10$$Lambda/0x00001fe001239c50.apply(Unknown Source)
at scala.collection.immutable.List.foreach(List.scala:334)
at org.http4s.Header$ToRaw$$anon$10.<init>(Header.scala:192)
at org.http4s.Header$ToRaw$.scalaCollectionSeqToRaw(Header.scala:195)
at org.http4s.Headers$.apply(Headers.scala:220)
at org.http4s.ember.core.h2.PseudoHeaders$.headersToRequestNoBody(PseudoHeaders.scala:95)
at org.http4s.ember.core.h2.H2Stream.receiveHeaders$$anonfun$1$$anonfun$2$$anonfun$3$$anonfun$2(H2Stream.scala:248)
at org.http4s.ember.core.h2.H2Stream$$Lambda/0x00001fe001511fd8.apply(Unknown Source)
at cats.effect.IOFiber.runLoop(IOFiber.scala:429)
at cats.effect.IOFiber.autoCedeR(IOFiber.scala:1460)
at cats.effect.IOFiber.run(IOFiber.scala:129)
at cats.effect.unsafe.WorkerThread.run(WorkerThread.scala:935)
Fix
The Hpack handling code has a configurable max header size parameter, but it does not include indexed headers in that accounting, allowing the attack to bypass the limit. There is not any configuration available in current http4s versions that can be enabled to prevent this attack short of disabling http2.
A fix has been tested locally that threads the maxHeaderSize setting from the server builder into the Hpack code. Using this, connections can be prematurely terminated once the decoded data size exceeds the maxHeaderSize that users can already configure.
Workarounds
If you can't upgrade immediately:
- Disable HTTP/2 in Ember backends
- Record
GHSA-vmm3-xgcx-67hm- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-409
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
org.http4s:http4s-ember-core_2.12Maven |
through 0.23.34 | 0.23.35 |
org.http4s:http4s-ember-core_2.13Maven |
1.0.0-M1 up to 1.0.0-M46 | 1.0.0-M46 |
org.http4s:http4s-ember-core_3Maven |
through 0.23.34 | 0.23.35 |
org.http4s:http4s-ember-core_3Maven |
1.0.0-M1 up to 1.0.0-M46 | 1.0.0-M46 |
org.http4s:http4s-ember-core_2.13Maven |
through 0.23.34 | 0.23.35 |
org.http4s:http4s-ember-core_2.12Maven |
before 0.23.35, plus listed versions 0.10.0-M100.21.00.21.0-M20.21.0-M30.21.0-M4 Show 45 moreShow less0.21.0-M50.21.0-M60.21.0-RC10.21.0-RC20.21.0-RC30.21.0-RC40.21.0-RC50.21.10.21.110.21.120.21.130.21.140.21.150.21.160.21.170.21.180.21.190.21.20.21.200.21.210.21.220.21.230.21.240.21.250.21.260.21.270.21.280.21.290.21.30.21.300.21.310.21.320.21.330.21.340.21.40.21.50.21.60.21.70.21.80.21.90.22-129-24d065b0.22-143-49b5a8d0.22-53-01128f50.22-96-55d31840.22.0 |
0.23.35 |
org.http4s:http4s-ember-core_2.13Maven |
1.0.0-M1 up to 1.0.0-M47, plus listed versions 1.0.0-M101.0.0-M111.0.0-M131.0.0-M141.0.0-M15 Show 38 moreShow less1.0.0-M161.0.0-M171.0.0-M181.0.0-M191.0.0-M21.0.0-M201.0.0-M211.0.0-M221.0.0-M231.0.0-M241.0.0-M251.0.0-M271.0.0-M281.0.0-M291.0.0-M31.0.0-M301.0.0-M311.0.0-M321.0.0-M331.0.0-M341.0.0-M351.0.0-M361.0.0-M371.0.0-M381.0.0-M391.0.0-M41.0.0-M401.0.0-M411.0.0-M421.0.0-M431.0.0-M441.0.0-M451.0.0-M461.0.0-M51.0.0-M61.0.0-M71.0.0-M81.0.0-M9 |
1.0.0-M47 |
org.http4s:http4s-ember-core_3Maven |
before 0.23.35, plus listed versions 0.22.00.22.0-M80.22.0-RC10.22.10.22.10 Show 45 moreShow less0.22.110.22.120.22.130.22.140.22.150.22.20.22.30.22.40.22.50.22.60.22.70.22.80.22.90.23.00.23.0-M10.23.0-RC10.23.10.23.100.23.110.23.120.23.130.23.140.23.150.23.160.23.170.23.180.23.190.23.19-RC10.23.19-RC20.23.19-RC30.23.20.23.200.23.210.23.220.23.230.23.240.23.250.23.260.23.270.23.280.23.290.23.30.23.300.23.310.23.32 |
0.23.35 |
org.http4s:http4s-ember-core_3Maven |
1.0.0-M1 up to 1.0.0-M47, plus listed versions 1.0.0-M221.0.0-M231.0.0-M241.0.0-M251.0.0-M27 Show 19 moreShow less1.0.0-M281.0.0-M291.0.0-M301.0.0-M311.0.0-M321.0.0-M331.0.0-M341.0.0-M351.0.0-M361.0.0-M371.0.0-M381.0.0-M391.0.0-M401.0.0-M411.0.0-M421.0.0-M431.0.0-M441.0.0-M451.0.0-M46 |
1.0.0-M47 |
org.http4s:http4s-ember-core_2.13Maven |
before 0.23.35, plus listed versions 0.10.0-M100.21.00.21.0-M20.21.0-M30.21.0-M4 Show 45 moreShow less0.21.0-M50.21.0-M60.21.0-RC10.21.0-RC20.21.0-RC30.21.0-RC40.21.0-RC50.21.10.21.110.21.120.21.130.21.140.21.150.21.160.21.170.21.180.21.190.21.20.21.200.21.210.21.220.21.230.21.240.21.250.21.260.21.270.21.280.21.290.21.30.21.300.21.310.21.320.21.330.21.340.21.40.21.50.21.60.21.70.21.80.21.90.22-129-24d065b0.22-143-49b5a8d0.22-53-01128f50.22-96-55d31840.22.0 |
0.23.35 |
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-54556 is a high vulnerability (CVSS 8.2) in Http4s, published August 26, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.52%, the 44th percentile. Fixed in org.http4s:http4s-ember-core_2.12 0.23.35.
References
github.com/http4s/http4s/security/advisories/GHSA-vmm3-xgcx-67hm
github.com/http4s/http4s/commit/6e8eccd64a6a74ab4811897881e95e0e1b3a818e
github.com/http4s/http4s/releases/tag/v0.23.35
github.com/http4s/http4s/releases/tag/v1.0.0-M47
github.com/advisories/GHSA-vmm3-xgcx-67hm
github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54556.json
nvd.nist.gov/vuln/detail/CVE-2026-54556
github.com/http4s/http4s
Left out here: 136 versions. The JSON record has them.