Hi,

This release comes a bit earlier than expected. The reason is that it
contains two major fixes related to QUIC. These bugs were reported by
Asim Viladi Oglu Manizada and can be exploited to remotely trigger a
crash of the process. So please upgrade immediately if you're using QUIC
listeners. Note that by default, QUIC is not enabled, so only users with
explicit QUIC bind lines added in the configuration are vulnerable. Use
the following command on your config files to find matching lines :

  $ grep '^[^#]*bind.*quic' <config_file>

The two patches are related to the QUIC packet parsing code. The first
case is an integer overflow when handling a token and is assigned to
CVE-2026-26081 report. The second one happens when decoding the frame
type and causes an infinite loop which triggers the haproxy watchdog. It
is assigned to CVE-2026-26080 report. If you want more details, please
refer to the following article from the haproxy.com blog :

  https://www.haproxy.com/blog/cves-2026-quic-denial-of-service

Aside from these two major patches, this release comes with a series of
other less important fixes. Here is the traditional summary of them.

Previously, a client abort during a pending SSL connection could not be
interrupted prior to the handshake completion, which result in a wasted
CPU usage. Now, if "option abortonclose" is set, the connection can be
aborted prior to any heavy computation. This is explicitely not
performed if the option is not present, as this could break health
checks from other haproxy or even other components.

An internal fix was made for applets to ensure that their I/O handlers
is never called after the shut operation. Previously, this was not the
case, in violation with the applets API. This could cause unexpected
issues. One of them affected the prometheus exporter, with a crash
encountered when accessing a corrupted server instance. With the API now
strictly enforces, this is no longer the case.

A bug was discovered on the haproxy task scheduler which could prevent a
sleeping thread from being woken up to accept new connections. This bug
is in fact really rare, as it only happens when the haproxy process is
totally idle and without any outgoing connections, which never happen in
real case scenarii.

In 3.0, a new server setting "hash-key" has been introduced for extra
configuration of the consistent hash load balancing method. However, due
to an internal code issue, this was not properly taken into account for
dynamic servers added via the runtime API. Thus, load-balancing server
init module has been updated to fix the issue and prevent any similar
ones in the future. Along with this change, documentation related to
"hash-key" has been extended when using "id", which is the default
value. This now includes a description to indicate that only the 28
lowest bit of the server ID are taken into account, so anything above
268435456 will generate duplicate keys. This also affects "random"
load-balancing algorithm.

The CPU policy "performance" and "efficiency" have been fixed as the
calculation was wrongly based on the number of CPUs instead of cores.
This resulted in an inefficient process allocation on some platform,
most notably with intel's 14th gen CPUs which combine efficiency and
performance cores.

An issue prevented haproxy startup on FreeBSD when using nameservers
with the TCP protocol. The function which parses network addresses has
been adjusted and the problem is now solved.

This is the end of the changes for this release. Once again, users
relying on QUIC have to update immediately. If this is not possible due
to a delay constraint, know that you can add the keyword "no-quic" in
the global section : this effectively disables any QUIC listeners in the
configuration without having to comment each QUIC bind lines, rendering
the process immune to the crashes.

  global
      no-quic

In any case, every users is advised to update to benefit from all the
latest improvements listed here.

Many thanks to Asim Viladi Oglu Manizada for having found the QUIC
security bugs and reaching us. His analysis was very detailled and
helped us to solve quickly the issues. Finally, thanks also to every
other contributer on this release.

#############################################################################################
Please find the usual URLs below :
   Site index       : https://www.haproxy.org/
   Documentation    : https://docs.haproxy.org/
   Wiki             : https://github.com/haproxy/wiki/wiki
   Discourse        : https://discourse.haproxy.org/
   Slack channel    : https://slack.haproxy.org/
   Issue tracker    : https://github.com/haproxy/haproxy/issues
   Q&A from devs    : https://github.com/orgs/haproxy/discussions
   Sources          : https://www.haproxy.org/download/3.2/src/
   Git repository   : https://git.haproxy.org/git/haproxy-3.2.git/
   Git Web browsing : https://git.haproxy.org/?p=haproxy-3.2.git
   Changelog        : https://www.haproxy.org/download/3.2/src/CHANGELOG
   Dataplane API    : 
https://github.com/haproxytech/dataplaneapi/releases/latest
   Pending bugs     : https://www.haproxy.org/l/pending-bugs
   Reviewed bugs    : https://www.haproxy.org/l/reviewed-bugs
   Code reports     : https://www.haproxy.org/l/code-reports
   Latest builds    : https://www.haproxy.org/l/dev-packages

---
Complete changelog :
Amaury Denoyelle (2):
      BUG/MAJOR: quic: reject invalid token
      BUG/MAJOR: quic: fix parsing frame type

Aperence (1):
      BUG/MINOR: config: Fix setting of alt_proto

Christopher Faulet (2):
      BUG/MAJOR: applet: Don't call I/O handler if the applet was shut
      BUG/MEDIUM: applet: Fix test on shut flags for legacy applets

Egor Shestakov (3):
      DOC: internals: cleanup few typos in master-worker documentation
      BUG/MINOR: startup: fix allocation error message of progname string
      BUG/MINOR: startup: handle a possible strdup() failure

Olivier Houchard (1):
      BUG/MEDIUM: threads: Atomically set TH_FL_SLEEPING and clr FL_NOTIFIED

Willy Tarreau (6):
      MINOR: rawsock: introduce CO_RFL_TRY_HARDER to detect closures on 
complete reads
      MEDIUM: ssl: don't always process pending handshakes on closed connections
      CLEANUP: haproxy: fix bad line wrapping in run_poll_loop()
      BUG/MINOR: cpu-topo: count cores not cpus to distinguish core types
      BUG/MEDIUM: lb-chash: always properly initialize lb_nodes with dynamic 
servers
      DOC: config: mention the limitation on server id range for consistent hash

---

-- 
Amaury Denoyelle


Reply via email to