Pingora HTTP/2 server memory exhaustion through unbounded default header-list and concurrent-stream limits
Pingora versions prior to 0.8.1 used the h2 crate's default HTTP/2 server limits, a 16 MiB decoded header-list size and no limit on concurrent streams, unless the application set its own. A remote, unauthenticated client can send 1-byte HPACK references to a near-empty header, making the server allocate hundreds of thousands of header fields per stream across an unlimited number of streams on one connection, and use HTTP/2 flow control to keep those streams open. This can exhaust memory and degrade or terminate the Pingora process. This affects any Pingora service that terminates HTTP/2 (h2 or h2c) without explicitly setting `max_header_list_size` and `max_concurrent_streams`. The reporter showed that a single connection could get a Pingora process with a 2 GiB memory limit OOM-killed. This flaw was corrected in commit d193c8d49b8b7c1c1ede93183759caa4f6906bbd. When no `H2Options` are supplied, Pingora now advertises and enforces a 64 KiB decoded header-list limit and at most 100 concurrent streams per connection. Users should upgrade to Pingora >= 0.8.1. Applications that supply their own `H2Options` are not covered by these defaults and must set `max_header_list_size` and `max_concurrent_streams` explicitly, or start from `pingora_core::protocols::http::v2::server::default_h2_options()`. `H2Options::default()` does not include these limits. Note: Cloudflare CDN customers were unaffected, as internal Pingora services at Cloudflare do not have HTTP/2 clients.
- Products
- pingora-core
- Affected versions
- Not specified
- Fixed versions
- 0.8.1
- CVEs
- CVE-2026-105297
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 1 Nov 2026, 12:00 UTC · Revision 1
Source evidence
Pingora HTTP/2 server memory exhaustion through unbounded default header-list and concurrent-stream limits
core-osv · Original sourcePublished 20 Oct 2026, 12:00 UTC
Pingora versions prior to 0.8.1 used the h2 crate's default HTTP/2 server limits, a 16 MiB decoded header-list size and no limit on concurrent streams, unless the application set its own. A remote, unauthenticated client can send 1-byte HPACK references to a near-empty header, making the server allocate hundreds of thousands of header fields per stream across an unlimited number of streams on one connection, and use HTTP/2 flow control to keep those streams open. This can exhaust memory and degrade or terminate the Pingora process. This affects any Pingora service that terminates HTTP/2 (h2 or h2c) without explicitly setting `max_header_list_size` and `max_concurrent_streams`. The reporter showed that a single connection could get a Pingora process with a 2 GiB memory limit OOM-killed. This flaw was corrected in commit d193c8d49b8b7c1c1ede93183759caa4f6906bbd. When no `H2Options` are supplied, Pingora now advertises and enforces a 64 KiB decoded header-list limit and at most 100 concurrent streams per connection. Users should upgrade to Pingora >= 0.8.1. Applications that supply their own `H2Options` are not covered by these defaults and must set `max_header_list_size` and `max_concurrent_streams` explicitly, or start from `pingora_core::protocols::http::v2::server::default_h2_options()`. `H2Options::default()` does not include these limits. Note: Cloudflare CDN customers were unaffected, as internal Pingora services at Cloudflare do not have HTTP/2 clients.
osv:RUSTSEC-2026-0389
pingora-core
Fixed versions: 0.8.1
Complete source record
{
"id": "07bb6a6b660a22d36627d9202cb111690bbfdd077768d32545105aa51b2ed4d2",
"url": "https://osv.dev/vulnerability/RUSTSEC-2026-0389",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Pingora HTTP/2 server memory exhaustion through unbounded default header-list and concurrent-stream limits",
"summary": "Pingora versions prior to 0.8.1 used the h2 crate's default HTTP/2 server limits, a 16 MiB decoded header-list size and no limit on concurrent streams, unless the application set its own. A remote, unauthenticated client can send 1-byte HPACK references to a near-empty header, making the server allocate hundreds of thousands of header fields per stream across an unlimited number of streams on one connection, and use HTTP/2 flow control to keep those streams open. This can exhaust memory and degrade or terminate the Pingora process. This affects any Pingora service that terminates HTTP/2 (h2 or h2c) without explicitly setting `max_header_list_size` and `max_concurrent_streams`. The reporter showed that a single connection could get a Pingora process with a 2 GiB memory limit OOM-killed. This flaw was corrected in commit d193c8d49b8b7c1c1ede93183759caa4f6906bbd. When no `H2Options` are supplied, Pingora now advertises and enforces a 64 KiB decoded header-list limit and at most 100 concurrent streams per connection. Users should upgrade to Pingora >= 0.8.1. Applications that supply their own `H2Options` are not covered by these defaults and must set `max_header_list_size` and `max_concurrent_streams` explicitly, or start from `pingora_core::protocols::http::v2::server::default_h2_options()`. `H2Options::default()` does not include these limits. Note: Cloudflare CDN customers were unaffected, as internal Pingora services at Cloudflare do not have HTTP/2 clients.",
"evidence": "osv:RUSTSEC-2026-0389",
"products": [
{
"name": {
"value": "pingora-core",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "0.8.1",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "high",
"structured": {
"id": "RUSTSEC-2026-0389",
"aliases": [
"CVE-2026-105297",
"GHSA-7gpj-mj4q-x62x",
"RUSTSEC-2026-0389"
],
"metrics": [
{
"type": "CVSS_V4",
"score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N"
}
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "0.0.0-0"
},
{
"fixed": "0.8.1"
}
]
}
],
"package": {
"name": "pingora-core",
"purl": "pkg:cargo/pingora-core",
"ecosystem": "crates.io"
},
"database_specific": {
"cvss": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"source": "https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0389.json",
"categories": [
"denial-of-service"
],
"informational": null
},
"ecosystem_specific": {
"affects": {
"os": [],
"arch": [],
"functions": []
},
"affected_functions": null
}
}
],
"modified": "2026-10-26T11:15:11.357540777Z",
"provider": "osv",
"references": [
"https://crates.io/crates/pingora-core",
"https://rustsec.org/advisories/RUSTSEC-2026-0389.html",
"https://github.com/cloudflare/pingora/commit/d193c8d49b8b7c1c1ede93183759caa4f6906bbd"
],
"provider_metadata": {
"license": "CC0-1.0"
}
},
"related_cves": [
{
"value": "CVE-2026-105297",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 450319,
"published_at": "2026-10-20T12:00:00+00:00"
}