Cloudanix VulnDB

CVE-2024-24791

High · 7.5

CVSS

7.5

EPSS

1.4%

Published

Jul 2, 2024

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

A flaw in a common software component used for building web services could allow an attacker to disrupt service and make the application unavailable to users.

Exploitation
Remote Unauthenticated
Attacker needs
None
Complexity
Low
Impact
Denial Of Service
Component
Library
Class
Denial of service
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

The vulnerability resides in Go's net/http HTTP/1.1 client, which improperly handles server responses to requests containing an 'Expect: 100-continue' header. If a server responds with a final status code (e.g., 200 OK) instead of the expected '100 Continue' informational response, the client connection is left in a corrupted, unusable state. The next request sent over this persistent connection will fail, leading to connection state desynchronization.

Why it matters to the business

This flaw can be exploited to cause a denial of service (DoS) against applications that use Go's reverse proxy functionality. An attacker can effectively poison the connection pool of a reverse proxy, causing subsequent legitimate user requests to fail. This leads to service degradation or complete unavailability, impacting user experience, damaging brand reputation, and potentially causing financial loss for services that rely on high availability.

How an attack unfolds

An unauthenticated remote attacker targets a public-facing Go application acting as a reverse proxy (using net/http/httputil.ReverseProxy). The attacker sends a specially crafted HTTP request with the header 'Expect: 100-continue'. The proxy forwards this to a backend service. If the backend responds with any status other than '100 Continue', the proxy's connection handling logic fails, leaving the connection in an invalid state but returning it to the pool. The next legitimate user whose request is assigned this poisoned connection will experience an error. By repeating this process, the attacker can exhaust the pool of valid connections, denying service to all users.

How to fix it

The vulnerability is addressed in Go versions 1.22.5 and 1.21.12. To remediate, developers must recompile affected applications using a patched version of the Go toolchain and deploy the resulting updated binaries. There is no known workaround; upgrading the Go version used for the build is the only effective mitigation.

How to confirm the fix worked

To validate the fix, verify that all relevant Go applications have been rebuilt with Go version 1.22.5, 1.21.12, or a newer version. Check build logs, CI/CD pipeline configurations, and deployed binary metadata to confirm the use of a patched toolchain. To test for exposure, a security team can run a controlled test against a non-production environment by sending a request with 'Expect: 100-continue' that elicits a non-100 response, and then verifying that subsequent requests on the same connection succeed as expected.

Typical attack path

  1. An attacker identifies a target application built with Go that acts as a reverse proxy.
  2. The attacker sends an HTTP request to the proxy that includes the 'Expect: 100-continue' header.
  3. The proxy forwards the request to its backend service.
  4. The backend service responds with a final status code (e.g., 200 OK, 404 Not Found) instead of '100 Continue'.
  5. The proxy mishandles this response, corrupting the state of the underlying TCP connection.
  6. The corrupted connection is returned to the proxy's connection pool for reuse.
  7. A legitimate user's request is routed over the corrupted connection and fails.
  8. The attacker repeats the process, poisoning more connections and escalating the denial of service.

How to detect it

Monitor logs from Go-based reverse proxies and load balancers for an unusual increase in connection errors, dropped connections, or HTTP 5xx error codes. An attack may be in progress if you observe incoming requests containing the 'Expect: 100-continue' header that are correlated with subsequent, unrelated request failures. Correlating proxy and backend application logs can help identify instances where a non-100 response to a request with an 'Expect' header is followed by connection errors.

  • "Expect: 100-continue"

What your security team should do

  • Identify all Go applications in your environment, particularly public-facing reverse proxies, API gateways, and load balancers, as they are the primary targets.
  • Use a Software Bill of Materials (SBOM) or dependency scanner to find all applications built with vulnerable Go versions (prior to 1.22.5 and 1.21.12).
  • Prioritize patching for internet-exposed services and critical internal proxies to prevent service disruption.
  • Engage with development teams to ensure they upgrade their Go toolchain and redeploy all affected applications.

The record

The net/http HTTP/1.1 client mishandled the case where a server responds to a request with an "Expect: 100-continue" header with a non-informational (200 or higher) status. This mishandling could leave a client connection in an invalid state, where the next request sent on the connection will fail. An attacker sending a request to a net/http/httputil.ReverseProxy proxy can exploit this mishandling to cause a denial of service by sending "Expect: 100-continue" requests which elicit a non-informational response from the backend. Each such request leaves the proxy with an invalid connection, and causes one subsequent request using that connection to fail.

Affected packages

Ecosystem Package Introduced Fixed
Go stdlib 0 1.21.12
AlmaLinux:8 aardvark-dns 0 2:1.10.0-1.module_el8.10.0+3792+03eaed9c
AlmaLinux:8 aardvark-dns 0 2:1.10.0-1.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 aardvark-dns 0 2:1.10.0-1.module_el8.10.0+3876+e55593a8
AlmaLinux:8 buildah 0 2:1.33.8-4.module_el8.10.0+3876+e55593a8
AlmaLinux:8 buildah-tests 0 2:1.33.8-4.module_el8.10.0+3876+e55593a8
AlmaLinux:8 cockpit-podman 0 84.1-1.module_el8.10.0+3876+e55593a8
AlmaLinux:8 conmon 0 3:2.1.10-1.module_el8.10.0+3845+87b84552
AlmaLinux:8 conmon 0 3:2.1.10-1.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 conmon 0 3:2.1.10-1.module_el8.10.0+3876+e55593a8
AlmaLinux:8 container-selinux 0 2:2.229.0-2.module_el8.10.0+3876+e55593a8
AlmaLinux:8 containernetworking-plugins 0 1:1.4.0-5.module_el8.10.0+3876+e55593a8
AlmaLinux:8 containers-common 0 2:1-82.module_el8.10.0+3876+e55593a8
AlmaLinux:8 crit 0 3.18-5.module_el8.10.0+3845+87b84552
AlmaLinux:8 crit 0 3.18-5.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 crit 0 3.18-5.module_el8.10.0+3876+e55593a8
AlmaLinux:8 criu 0 3.18-5.module_el8.10.0+3845+87b84552
AlmaLinux:8 criu 0 3.18-5.module_el8.10.0+3876+e55593a8
AlmaLinux:8 criu-devel 0 3.18-5.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 criu-devel 0 3.18-5.module_el8.10.0+3876+e55593a8
AlmaLinux:8 criu-libs 0 3.18-5.module_el8.10.0+3845+87b84552
AlmaLinux:8 criu-libs 0 3.18-5.module_el8.10.0+3876+e55593a8
AlmaLinux:8 crun 0 1.14.3-2.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 crun 0 1.14.3-2.module_el8.10.0+3876+e55593a8
AlmaLinux:8 delve 0 1.21.2-4.module_el8.10.0+3895+92d465e0
AlmaLinux:8 fuse-overlayfs 0 1.13-1.module_el8.10.0+3792+03eaed9c
AlmaLinux:8 fuse-overlayfs 0 1.13-1.module_el8.10.0+3859+6ae70a0e
AlmaLinux:8 go-toolset 0 1.21.13-1.module_el8.10.0+3895+92d465e0
AlmaLinux:8 golang 0 1.21.13-2.module_el8.10.0+3895+92d465e0
AlmaLinux:8 golang-bin 0 1.21.13-2.module_el8.10.0+3895+92d465e0
AlmaLinux:8 golang-docs 0 1.21.13-2.module_el8.10.0+3895+92d465e0
AlmaLinux:8 golang-misc 0 1.21.13-2.module_el8.10.0+3895+92d465e0
AlmaLinux:8 golang-src 0 1.21.13-2.module_el8.10.0+3895+92d465e0
AlmaLinux:8 golang-tests 0 1.21.13-2.module_el8.10.0+3895+92d465e0
AlmaLinux:8 grafana 0 9.2.10-18.el8_10
AlmaLinux:8 grafana-selinux 0 9.2.10-18.el8_10
AlmaLinux:8 libslirp 0 4.4.0-2.module_el8.10.0+3845+87b84552
AlmaLinux:8 libslirp 0 4.4.0-2.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 libslirp 0 4.4.0-2.module_el8.10.0+3876+e55593a8
AlmaLinux:8 libslirp-devel 0 4.4.0-2.module_el8.10.0+3845+87b84552
AlmaLinux:8 libslirp-devel 0 4.4.0-2.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 libslirp-devel 0 4.4.0-2.module_el8.10.0+3876+e55593a8
AlmaLinux:8 netavark 0 2:1.10.3-1.module_el8.10.0+3845+87b84552
AlmaLinux:8 netavark 0 2:1.10.3-1.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 netavark 0 2:1.10.3-1.module_el8.10.0+3876+e55593a8
AlmaLinux:8 oci-seccomp-bpf-hook 0 1.2.10-1.module_el8.10.0+3792+03eaed9c
AlmaLinux:8 oci-seccomp-bpf-hook 0 1.2.10-1.module_el8.10.0+3876+e55593a8
AlmaLinux:8 podman 0 4:4.9.4-13.module_el8.10.0+3898+7a25cb1a
AlmaLinux:8 podman-catatonit 0 4:4.9.4-13.module_el8.10.0+3898+7a25cb1a
AlmaLinux:8 podman-docker 0 4:4.9.4-13.module_el8.10.0+3898+7a25cb1a
AlmaLinux:8 podman-gvproxy 0 4:4.9.4-13.module_el8.10.0+3898+7a25cb1a
AlmaLinux:8 podman-plugins 0 4:4.9.4-13.module_el8.10.0+3898+7a25cb1a
AlmaLinux:8 podman-remote 0 4:4.9.4-13.module_el8.10.0+3898+7a25cb1a
AlmaLinux:8 podman-tests 0 4:4.9.4-13.module_el8.10.0+3898+7a25cb1a
AlmaLinux:8 python3-criu 0 3.18-5.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 python3-criu 0 3.18-5.module_el8.10.0+3876+e55593a8
AlmaLinux:8 python3-podman 0 4.9.0-2.module_el8.10.0+3876+e55593a8
AlmaLinux:8 runc 0 1:1.1.12-4.module_el8.10.0+3876+e55593a8
AlmaLinux:8 skopeo 0 2:1.14.5-3.module_el8.10.0+3876+e55593a8
AlmaLinux:8 skopeo-tests 0 2:1.14.5-3.module_el8.10.0+3876+e55593a8
AlmaLinux:8 slirp4netns 0 1.2.3-1.module_el8.10.0+3845+87b84552
AlmaLinux:8 slirp4netns 0 1.2.3-1.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 slirp4netns 0 1.2.3-1.module_el8.10.0+3876+e55593a8
AlmaLinux:8 toolbox 0 0.0.99.5-2.module_el8.10.0+3845+87b84552
AlmaLinux:8 toolbox 0 0.0.99.5-2.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 toolbox 0 0.0.99.5-2.module_el8.10.0+3876+e55593a8
AlmaLinux:8 toolbox-tests 0 0.0.99.5-2.module_el8.10.0+3845+87b84552
AlmaLinux:8 toolbox-tests 0 0.0.99.5-2.module_el8.10.0+3858+6ad51f9f
AlmaLinux:8 udica 0 0.2.6-21.module_el8.10.0+3876+e55593a8
AlmaLinux:9 buildah 0 2:1.37.2-1.el9
AlmaLinux:9 buildah-tests 0 2:1.37.2-1.el9
AlmaLinux:9 containernetworking-plugins 0 1:1.5.1-2.el9
AlmaLinux:9 git-lfs 0 3.6.1-1.el9
AlmaLinux:9 go-toolset 0 1.21.13-3.el9_4
AlmaLinux:9 golang 0 1.21.13-3.el9_4
AlmaLinux:9 golang-bin 0 1.21.13-3.el9_4
AlmaLinux:9 golang-docs 0 1.21.13-3.el9_4
AlmaLinux:9 golang-misc 0 1.21.13-3.el9_4
AlmaLinux:9 golang-src 0 1.21.13-3.el9_4
AlmaLinux:9 golang-tests 0 1.21.13-3.el9_4
AlmaLinux:9 grafana 0 10.2.6-4.el9
AlmaLinux:9 grafana-selinux 0 10.2.6-4.el9
AlmaLinux:9 skopeo 0 2:1.16.1-1.el9
AlmaLinux:9 skopeo-tests 0 2:1.16.1-1.el9
AlmaLinux:9 toolbox 0 0.0.99.5-5.el9
AlmaLinux:9 toolbox-tests 0 0.0.99.5-5.el9
Bitnami golang 0 1.21.12
Chainguard aactl 0 0.4.12-r15
Chainguard actions-runner-controller 0 0.9.3-r1
Chainguard actions-runner-controller-compat 0 0.9.3-r1
Chainguard actions-runner-controller-fips 0 0.9.3-r1
Chainguard actions-runner-controller-fips-compat 0 0.9.3-r1
Chainguard addon-resizer 0 1.8.22-r1
Chainguard addon-resizer-compat 0 1.8.22-r1
Chainguard addon-resizer-fips 0 1.8.22-r1
Chainguard addon-resizer-fips-compat 0 1.8.22-r1
Chainguard age 0 1.2.0-r1
Chainguard amass 0 4.2.0-r12
Chainguard argo-cd-fips-2.9 0 2.9.14-r8
Chainguard argo-cd-fips-2.9-compat 0 2.9.14-r8
Chainguard argo-cd-fips-2.9-repo-server 0 2.9.14-r8
Chainguard argo-workflow-cli 0 3.6.5-r2
Chainguard argo-workflow-controller 0 3.6.5-r2
Chainguard argo-workflow-controller-compat 0 3.6.5-r2
Chainguard argo-workflow-executor 0 3.6.5-r2
Chainguard argo-workflow-executor-compat 0 3.6.5-r2
Chainguard argo-workflows 0 3.6.5-r2
Chainguard argo-workflows-known-hosts 0 3.6.5-r2
Chainguard argo-workflows-ui 0 3.6.5-r2
Chainguard atlantis 0 0.28.3-r1
Chainguard atlantis-fips 0 0.28.3-r2
Chainguard authservice 0 1.0.1-r1
Chainguard authservice-compat 0 1.0.1-r1
Chainguard authservice-fips 0 1.0.1-r1
Chainguard authservice-fips-compat 0 1.0.1-r1
Chainguard aws-ebs-csi-driver 0 1.32.0-r1
Chainguard aws-ebs-csi-driver-fips 0 1.32.0-r1
Chainguard aws-efs-csi-driver 0 2.0.5-r1
Chainguard aws-efs-csi-driver-fips 0 1.7.0-r12
Chainguard aws-flb-cloudwatch 0 1.9.4-r12
Chainguard aws-flb-cloudwatch-compat 0 1.9.4-r12
Chainguard aws-flb-firehose 0 1.7.2-r12
Chainguard aws-flb-firehose-compat 0 1.7.2-r12
Chainguard aws-flb-kinesis 0 1.10.2-r13
Chainguard aws-flb-kinesis-compat 0 1.10.2-r13
Chainguard aws-load-balancer-controller 0 2.8.1-r2
Chainguard aws-load-balancer-controller-compat 0 2.8.1-r2
Chainguard aws-load-balancer-controller-fips 0 2.8.1-r1
Chainguard aws-network-policy-agent 0 1.1.2-r1
Chainguard aws-network-policy-agent-compat 0 1.1.2-r1
Chainguard azcopy-fips 0 10.25.1-r1
Chainguard azure-aad-pod-identity-mic 0 1.8.17-r11
Chainguard azure-aad-pod-identity-nmi 0 1.8.17-r11
Chainguard bank-vaults 0 1.20.4-r17
Chainguard bank-vaults-fips 0 1.20.4-r14
Chainguard bank-vaults-template 0 1.20.4-r17
Chainguard bank-vaults-template-fips 0 1.20.4-r14
Chainguard bazelisk 0 1.20.0-r4
Chainguard bazelisk-default 0 1.20.0-r4
Chainguard bincapz 0 0.13.2-r1
Chainguard bom 0 0.6.0-r7
Chainguard boring-registry 0 0.14.0-r4
Chainguard boring-registry-fips 0 0.14.0-r6
Chainguard buf 0 1.34.0-r1
Chainguard buildah 0 1.36.0-r2
Chainguard caddy 0 2.8.4-r2
Chainguard caddy-fips 0 2.8.4-r2
Chainguard caddy-man 0 2.8.4-r2
Chainguard caddy-src 0 2.8.4-r2
Chainguard cadvisor 0 0.49.1-r9
Chainguard cadvisor-compat 0 0.49.1-r9
Chainguard cadvisor-fips 0 0.49.1-r8
Chainguard calico 0 3.28.0-r4
Chainguard calico-apiserver 0 3.28.0-r4
Chainguard calico-app-policy 0 3.28.0-r4
Chainguard calico-cni 0 3.28.0-r4
Chainguard calico-cni-compat 0 3.28.0-r4
Chainguard calico-felix 0 3.28.0-r4
Chainguard calico-key-cert-provisioner 0 3.28.0-r4
Chainguard calico-kube-controllers 0 3.28.0-r4
Chainguard calico-node 0 3.28.0-r4
Chainguard calico-pod2daemon 0 3.28.0-r4
Chainguard calico-pod2daemon-flexvol-compat 0 3.28.0-r4
Chainguard calico-typha-client 0 3.28.0-r4
Chainguard calico-typhad 0 3.28.0-r4
Chainguard calicoctl 0 3.28.0-r4
Chainguard capslock 0 0.2.3-r1
Chainguard cass-operator 0 1.21.1-r1
Chainguard cass-operator-compat 0 1.21.1-r1
Chainguard cass-operator-config 0 1.21.1-r1
Chainguard cass-operator-fips-no-pvc-delete 0 1.21.1-r1
Chainguard cass-operator-fips-no-pvc-delete-compat 0 1.21.1-r1
Chainguard cert-exporter 0 2.12.0-r7
Chainguard cert-exporter-fips 0 2.12.0-r8
Chainguard cert-manager-1.12 0 1.12.12-r2
Chainguard cert-manager-1.12-acmesolver 0 1.12.12-r2
Chainguard cert-manager-1.12-cainjector 0 1.12.12-r2
Chainguard cert-manager-1.12-controller 0 1.12.12-r2
Chainguard cert-manager-1.12-webhook 0 1.12.12-r2
Chainguard cert-manager-1.14 0 1.14.7-r2
Chainguard cert-manager-1.14-acmesolver 0 1.14.7-r2
Chainguard cert-manager-1.14-cainjector 0 1.14.7-r2
Chainguard cert-manager-1.14-controller 0 1.14.7-r2
Chainguard cert-manager-1.14-startupapicheck 0 1.14.7-r2
Chainguard cert-manager-1.14-webhook 0 1.14.7-r2
Chainguard cert-manager-1.15 0 1.15.1-r1
Chainguard cert-manager-1.15-acmesolver 0 1.15.1-r1
Chainguard cert-manager-1.15-cainjector 0 1.15.1-r1
Chainguard cert-manager-1.15-controller 0 1.15.1-r1
Chainguard cert-manager-1.15-startupapicheck 0 1.15.1-r1
Chainguard cert-manager-1.15-webhook 0 1.15.1-r1
Chainguard cert-manager-acmesolver-1.12 0 1.12.12-r2
Chainguard cert-manager-acmesolver-1.12-bitnami-compat 0 1.12.12-r2
Chainguard cert-manager-acmesolver-1.12-iamguarded-compat 0 1.12.12-r2
Chainguard cert-manager-acmesolver-1.15 0 1.15.1-r1
Chainguard cert-manager-acmesolver-1.15-bitnami-compat 0 1.15.1-r1
Chainguard cert-manager-acmesolver-1.15-iamguarded-compat 0 1.15.1-r1
Chainguard cert-manager-acmesolver-fips-1.12 0 1.12.12-r2
Chainguard cert-manager-acmesolver-fips-1.15 0 1.15.1-r1
Chainguard cert-manager-cainjector-1.12 0 1.12.12-r2

Related vulnerabilities