CVE-2026-103399: Libsoup: soupserver: http/1 request smuggling via undrained expect: 100-continue body

Published Sep 30, 2026
·
Updated

A flaw was found in SoupServer (libsoup). When an HTTP/1.x client sends a request with Expect: 100-continue and a request body, and SoupServer returns an early final (non-1xx) response before the body is read, the server neither drains the declared body bytes nor closes the connection. On a keep-alive connection, those leftover bytes are interpreted as a subsequent HTTP request. A remote, unauthenticated attacker can place a complete HTTP request in the body and cause SoupServer to process that smuggled request, leading to unintended request handling.

Other sources

HTTP/1 request-smuggling desync in SoupServer: when a client sends Expect: 100-continue with a Content-Length body and SoupServer emits an early final (non-1xx) response before reading the body (e.g. 401 from SoupAuthDomain, or any handler that sets a final status at the headers stage), libsoup marks the read side DONE without draining the declared body bytes and without sending Connection: close. On a keep-alive connection those leftover body bytes are then parsed as the next HTTP request, so a complete second request placed in the body is smuggled and executed (CWE-444 / RFC 9112 framing violation).

Verified upstream on libsoup 3.7.1 / current HEAD: one crafted connection to an auth-protected path yields 401 then 200, and the smuggled handler runs. Defect location: libsoup/server/http1/soup-server-message-io-http1.c iowrite() STATEHEADERS Expect: 100-continue path (readstate -> DONE without drain/close).

Distinct from CVE-2026-1760 (chunked + keep-alive close) and CVE-2026-1801 (malformed chunk headers). Upstream: https://gitlab.gnome.org/GNOME/libsoup/-/workitems/539. Reporter: Jianqiang (Stark) Li. Embargo: No. Patch discussed upstream; fixed release not yet shipped.

— Red Hat

Libsoup: soupserver: http/1 request smuggling via undrained expect: 100-continue body

— Microsoft

Affected Software

18 affected componentsFixes available
Gnome libsoup=3.7.1
debian/libsoup2.4*
debian/libsoup2.4*
debian/libsoup3*
debian/libsoup3*
debian/libsoup2.4<=2.74.3-1+deb12u1, <=2.74.3-10.1
debian/libsoup3<=3.2.3-0+deb12u2, <=3.6.5-3
3.8.0-3
ubuntu/libsoup2.4*
ubuntu/libsoup2.4*
ubuntu/libsoup2.4*
ubuntu/libsoup2.4*
ubuntu/libsoup3*
ubuntu/libsoup2.4*
ubuntu/libsoup3*
ubuntu/libsoup2.4*
ubuntu/libsoup3*
ubuntu/libsoup3*
ubuntu/libsoup2.4*

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade debian/libsoup3 to a version that resolves this vulnerability.

    Fixed in 3.8.0-3

Event History

Sep 30, 2026
Data Sourced
via Red Hat·02:45 PM
DescriptionSeverityAffected Software
CVE Published
via MITRE·05:42 PM
Data Sourced
via MITRE·05:42 PM
DescriptionSeverityWeakness
Data Sourced
via OSV·06:18 PM
DescriptionSeverityAffected Software
Data Sourced
via NVD·06:18 PM
DescriptionSeverityWeakness
Oct 3, 2026
Data Sourced
via Microsoft·08:31 AM
DescriptionSeverityWeakness

Frequently Asked Questions

1

Which deployments are exposed to this issue?

Deployments using SoupServer that accept HTTP/1.x keep-alive connections are exposed when a request with Expect: 100-continue can receive an early final, non-1xx response before its declared body is read. Examples include authentication paths returning 401 through SoupAuthDomain and handlers that set a final status while processing headers.

2

What must an attacker send to exploit the flaw?

An unauthenticated remote attacker needs to send an HTTP/1.x request with Expect: 100-continue and a Content-Length body on a keep-alive connection. The body must contain a complete HTTP request, and the initial request must trigger an early final response before the server consumes that body.

3

How can I determine whether a request path is affected?

Review SoupServer request paths for cases where the server returns a final non-1xx status at the headers stage without reading the declared request body. In particular, test whether a 401 or other early response to an Expect: 100-continue request leaves the connection open and processes body bytes as a subsequent request.

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