CVE-2026-55831
ADVISORY - githubSummary
Summary
Netty's SPDY SETTINGS decoder accepts a peer-declared SETTINGS entry count up to the 24-bit frame-length limit and materializes every unique setting ID in DefaultSpdySettingsFrame without an implementation-level count cap. A remote SPDY/3.1 peer can send one syntactically valid roughly 2 MiB SETTINGS frame that creates 262144 map entries, amplifying network input into heap growth and ordered-map insertion work.
Details
Inbound SPDY bytes enter SpdyFrameCodec.decode() and are passed directly to the frame decoder. The decoder reads the peer-controlled flags and 24-bit frame length from the common header, then accepts SETTINGS frames with only length >= 4. For SETTINGS payloads, it reads the peer-controlled numSettings field and validates only that the remaining payload is divisible into 8-byte entries and exactly matches that count. Each accepted entry then supplies an attacker-controlled 24-bit ID and value, and the normal delegate path forwards it into spdySettingsFrame.setValue(). The sink is DefaultSpdySettingsFrame: it backs settings with a TreeMap, checks only that IDs fit the SPDY 24-bit maximum, and inserts a new Setting for each previously unseen ID. There is no count budget between the wire-format count validation and the TreeMap insertion site.
PoC
run with
bash ./poc/run.sh
expected output:
NETTY_SPDY_SETTINGS_COUNT_MAP_TRIGGERED settings_count=262144 wire_bytes=2097164 approx_heap_delta=17692272 first_value=1 last_value=262144
The NETTY_SPDY_SETTINGS_COUNT_MAP_TRIGGERED line means the harness decoded the crafted SETTINGS frame and observed all 262144 peer-selected IDs in the resulting settings map. The wire_bytes=2097164, first_value=1, and last_value=262144 fields distinguish this from a setup failure: they show the exact oversized frame was accepted and fully materialized.
Impact
remote unauthenticated network peer that can speak SPDY/3.1 to a Netty pipeline containing SpdyFrameCodec can trigger resource-exhaustion denial of service. The required guards are satisfied by a complete valid SETTINGS frame using the expected SPDY version, a length of 4 + numSettings * 8, and IDs within the accepted 24-bit range; the verified PoC uses numSettings=262144 and wire_bytes=2097164. On that input, Netty materializes 262144 attacker-controlled entries in a TreeMap-backed DefaultSpdySettingsFrame, with local runs observing about 17-18 MiB of heap growth per decoded frame plus CPU work for ordered-map insertion.
Common Weakness Enumeration (CWE)
Uncontrolled Resource Consumption
GitHub
3.9
CVSS SCORE
7.5highDebian
-
Ubuntu
-
CVSS SCORE
N/AmediumChainguard
CGA-2xw2-crqm-mqgc
-
minimos
MINI-2fgj-rjg5-4665
-
minimos
MINI-2q7r-wp73-3j4h
-
minimos
MINI-3jqg-xhwr-f5cv
-
minimos
MINI-3qxw-26qr-hjm4
-
minimos
MINI-4jxj-79rg-p75m
-
minimos
MINI-4x9c-53xv-hx3h
-
minimos
MINI-55pm-hf4m-8p44
-
minimos
MINI-56h7-fc2q-qgpj
-
minimos
MINI-5757-qrxg-ch7f
-
minimos
MINI-5r7g-9rc2-3582
-
minimos
MINI-6f57-4g24-3cf7
-
minimos
MINI-6fv2-v8fg-h9v3
-
minimos
MINI-6xgr-r5h8-jvrc
-
minimos
MINI-77gp-r3h8-cvgj
-
minimos
MINI-7w86-7hqj-p89j
-
minimos
MINI-8249-fvcp-x426
-
minimos
MINI-8fpx-ffj3-29vw
-
minimos
MINI-8pmf-85gf-xqqx
-
minimos
MINI-8wm4-3g38-2gwm
-
minimos
MINI-9px2-5c45-xgjh
-
minimos
MINI-cc5p-773j-cx49
-
minimos
MINI-cg82-72w2-67x4
-
minimos
MINI-cwc6-j6pf-f65p
-
minimos
MINI-f8wg-7c53-6323
-
minimos
MINI-fccp-rr7r-rm5m
-
minimos
MINI-fg45-pqm8-x9wg
-
minimos
MINI-frhv-fw69-8j3j
-
minimos
MINI-g4h2-3rmc-w74q
-
minimos
MINI-g94w-3mmv-222v
-
minimos
MINI-gjvv-gpjc-fp5h
-
minimos
MINI-gpx7-jr5v-gpv3
-
minimos
MINI-h5pg-q9g3-cg8c
-
minimos
MINI-h9c8-mv42-c9qp
-
minimos
MINI-jjf3-wjxh-mjrm
-
minimos
MINI-jxc8-xvjf-6x7h
-
minimos
MINI-m695-c9jj-rw85
-
minimos
MINI-mq9r-mfmf-9w9c
-
minimos
MINI-pg6g-rpxv-84w2
-
minimos
MINI-qgh6-h7v2-33gp
-
minimos
MINI-qxv6-gqgr-73hx
-
minimos
MINI-rc3f-mcgv-g546
-
minimos
MINI-rxhf-7jxc-xcgp
-
minimos
MINI-v3f4-w963-4m23
-
minimos
MINI-w5r8-g734-rgwc
-
minimos
MINI-x584-7798-x4cj
-
minimos
MINI-xm8j-r44q-5m25
-