CVE-2026-35469: SpdyStream: DOS on CRI

Published Apr 13, 2026
·
Updated

spdystream is a Go library for multiplexing streams over SPDY connections. In versions 0.5.0 and below, the SPDY/3 frame parser does not validate attacker-controlled counts and lengths before allocating memory. Three allocation paths are affected: the SETTINGS frame entry count, the header count in parseHeaderValueBlock, and individual header field sizes — all read as 32-bit integers and used directly as allocation sizes with no bounds checking. Because SPDY header blocks are zlib-compressed, a small on-the-wire payload can decompress into large attacker-controlled values. A remote peer that can send SPDY frames to a service using spdystream can exhaust process memory and cause an out-of-memory crash with a single crafted control frame. This issue has been fixed in version 0.5.1.

Other sources

Summary: Possible DOS in SPDY streaming code, used for attach, exec and port forwarding.

Requirements To Exploit: Access to the kubelet's endpoint (granted through nodes/proxy) or access to any of portforward, exec, or attach to pods. These all can be represented by the cluster roles

pods/portforward (create)

pods/exec (create)

pods/attach (create)

nodes/proxy (get/create)

Component Affected: Kubelet, CRI-O, kube-apiserver

Version Affected: Openshift 4.21.4 and below

Patch Available: yes

Version Fixed: none yet

Cvss: (Based on [https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator]). Please note that only the Base Score Metrics are required by the incident response team.

Impact: Based on the https://access.redhat.com/security/updates/classification , what do you think would be the impact and why? This helps a lot the analyst to understand why such a report must be or not considered Moderate/Important or even Critical.

Steps To Reproduce: apply:

— apiVersion: v1 kind: ServiceAccount metadata: name: poc-sa-portforward namespace: default — apiVersion: [rbac.authorization.k8s.io/v1:(http://rbac.authorization.k8s.io/v1)(http://rbac.authorization.k8s.io/v1)] kind: Role metadata: name: poc-role-portforward namespace: default rules:

apiGroups: [""] resources: ["pods/portforward"] verbs: ["create"] — apiVersion: [rbac.authorization.k8s.io/v1:(http://rbac.authorization.k8s.io/v1)(http://rbac.authorization.k8s.io/v1)] kind: RoleBinding metadata: name: poc-rb-portforward namespace: default subjects:

kind: ServiceAccount name: poc-sa-portforward namespace: default roleRef: kind: Role name: poc-role-portforward apiGroup: rbac.authorization.k8s.io — apiVersion: v1 kind: Pod metadata: name: poc-target namespace: default spec: containers:

name: nginx image: nginx:alpine

set env:

export APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' | sed 's|https://||')

export TOKEN=$(kubectl create token poc-sa-portforward)

export POD=poc-target

run attached pocportforward.py

Mitigation: disable the above cluster roles from untrusted users.

Embargo Reason: Coordination with three upstream communities: containerd, CRI-O, kubernetes

Original Report: https://github.com/moby/spdystream/security/advisories/GHSA-pc3f-x583-g7j2

Red Hat

The SPDY/3 frame parser in spdystream does not validate attacker-controlled counts and lengths before allocating memory. A remote peer that can send SPDY frames to a service using spdystream can cause the process to allocate gigabytes of memory with a small number of malformed control frames, leading to an out-of-memory crash.   Three allocation paths in the receive side are affected: 1. SETTINGS entry count -- The SETTINGS frame reader reads a 32-bit numSettings from the payload and allocates a slice of that size without checking it against the declared frame length. An attacker can set numSettings to a value far exceeding the actual payload, triggering a large allocation before any setting data is read.   2. Header count -- parseHeaderValueBlock reads a 32-bit numHeaders from the decompressed header block and allocates an http.Header map of that size with no upper bound.   3. Header field size -- Individual header name and value lengths are read as 32-bit integers and used directly as allocation sizes with no validation.   Because SPDY header blocks are zlib-compressed, a small on-the-wire payload can decompress into attacker-controlled bytes that the parser interprets as 32-bit counts and lengths. A single crafted frame is enough to exhaust process memory. Impact  Any program that accepts SPDY connections using spdystream -- directly or through a dependent library -- is affected. A remote peer that can send SPDY frames to the service can crash the process with a single crafted SPDY control frame, causing denial of service. Affected versions  github.com/moby/spdystream <= v0.5.0 Fix  v0.5.1 addresses the receive-side allocation bugs and adds related hardening:   Core fixes:   - SETTINGS entry-count validation -- The SETTINGS frame reader now checks that numSettings is consistent with the declared frame length (numSettings <= (length-4)/8) before allocating.   - Header count limit -- parseHeaderValueBlock enforces a maximum number of headers per frame (default: 1000).   - Header field size limit -- Individual header name and value lengths are checked against a per-field size limit (default: 1 MiB) before allocation.   - Connection closure on protocol error -- The connection read loop now closes the underlying net.Conn when it encounters an InvalidControlFrame error, preventing further exploitation on the same connection.   Additional hardening:   - Write-side bounds checks -- All frame write methods now verify that payloads fit within the 24-bit length field, preventing the library from producing invalid frames.   Configurable limits:   - Callers can adjust the defaults using NewConnectionWithOptions or the lower-level spdy.NewFramerWithOptions with functional options: WithMaxControlFramePayloadSize, WithMaxHeaderFieldSize, and WithMaxHeaderCount.

GitHub

Affected Software

13 affected componentsFixes available
go/github.com/moby/spdystream<=0.5.0
0.5.1
Microsoft azl3 containerd2 0.0.0-1
Microsoft azl3 kubernetes 1.30.10-23
Microsoft azl3 kubevirt 1.7.1-2
Microsoft azl3 moby-containerd-cc 1.7.7-11
Microsoft azl3 kured 1.15.0-3
Microsoft azl3 docker-buildx 0.14.0-11
Microsoft azl3 docker-compose 2.27.0-9
Microsoft azl3 keda 2.14.1-11
Microsoft azl3 cert-manager 1.12.15-6
Microsoft azl3 containerized-data-importer 1.62.0-3
Microsoft azl3 cri-tools 1.32.0-4
IBM IBM® Db2® on Cloud Pak for Data and Db2 Warehouse on Cloud Pak for Data<=v4.8 v5.0v5.1v5.2v5.3

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade go/github.com/moby/spdystream to a version that resolves this vulnerability.

    Fixed in 0.5.1
  2. Upgrade

    Upgrade github.com/moby/spdystream to a version that resolves this vulnerability.

    Fixed in 0.5.1
  3. Configuration

    When creating the SPDY framer, use functional options to cap control-frame payloads (e.g., WithMaxControlFramePayloadSize) so attackers cannot trigger large allocations via SETTINGS/control frames.

    spdy.NewFramerWithOptions (github.com/moby/spdystream) WithMaxControlFramePayloadSize = set a maximum control frame payload size (default described as existing)
  4. Configuration

    Use the functional option WithMaxHeaderFieldSize to enforce a per-field size limit (default stated as 1 MiB) to prevent oversized header name/value allocations.

    spdy.NewFramerWithOptions (github.com/moby/spdystream) WithMaxHeaderFieldSize = set a per-header field size limit (default: 1 MiB as stated)
  5. Configuration

    Use the functional option WithMaxHeaderCount to enforce the maximum number of headers per frame (default stated as 1000) to prevent attacker-controlled header-count allocations.

    spdy.NewFramerWithOptions (github.com/moby/spdystream) WithMaxHeaderCount = set a maximum number of headers per frame (default: 1000 as stated)
  6. Configuration

    Disable the cluster roles that allow access to kubelet endpoints via nodes/proxy and access to pods/portforward, pods/exec, and pods/attach from untrusted users (the text explicitly says to disable those cluster roles from untrusted users).

    Kubernetes RBAC disable cluster roles from untrusted users (RBAC rules/rolebindings) = disallow these roles for untrusted users
  7. Compensating control

    If available for your spdystream integration, ensure the connection read loop closes the underlying net.Conn upon protocol errors (the material states the parser now closes the connection on protocol error) to prevent continued exploitation attempts on the same connection.

Event History

Apr 13, 2026
Data Sourced
via Red Hat·03:53 AM
DescriptionSeverityAffected Software
Apr 16, 2026
Advisory Published
via GitHub·08:44 PM
Data Sourced
via GitHub·08:44 PM
DescriptionWeaknessAffected Software
CVE Published
via MITRE·09:19 PM
Data Sourced
via MITRE·09:19 PM
DescriptionWeakness
Data Sourced
via NVD·10:16 PM
DescriptionSeverityWeakness
Apr 17, 2026
Data Sourced
via Microsoft·08:01 AM
DescriptionSeverityWeaknessAffected Software
Updated
via Microsoft·08:01 AM
SeverityAffected Software
Updated
via Microsoft·08:01 AM
DescriptionSeverity
Jun 19, 2026
Data Sourced
via IBM·12:00 AM
DescriptionAffected Software

Parent advisories

This vulnerability appears in the following advisories.

Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2026-35469?

CVE-2026-35469 has a high severity due to its potential for denial of service attacks.

2

How do I fix CVE-2026-35469?

To fix CVE-2026-35469, upgrade the affected library to version 0.5.1 or later.

3

What is the impact of CVE-2026-35469?

CVE-2026-35469 can lead to denial of service by exploiting improper memory allocation.

4

Which versions of spdystream are affected by CVE-2026-35469?

Versions 0.5.0 and below of the spdystream library are affected by CVE-2026-35469.

5

What software uses spdystream and is affected by CVE-2026-35469?

The azl3 containerd2 product by Microsoft is one of the software that uses spdystream and is affected by CVE-2026-35469.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203