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.

There has been some discussion on the mailing list related to the
necessity for haproxy to validate HTTP chunk extensions. These
extensions have never really been used, so haproxy previously simply
discarded them when request are forwarded. However, they are used today
in attempts to spot differences between HTTP stacks and try to exploit
them. And some vulnerable parsers were indeed found on other
implementations. Thus, it has been decided that from the next 3.4
release, haproxy will check chunk extensions if present and contain an
invalid quoted format. If this is the case, the request is not forwarded
and the connection is now aborted prematurely. In order to avoid any
theoretical last-minute surprise for users upgrading from 3.3 to 3.4-LTS
in a few months, it was decided to backport it to 3.3 so that both
branches are identical regarding this stricter check.

In SSL configuration, "@system-ca" parameter can be used to refer to the
trusted CAs of the system. The documentation also mentions that the
environment variable SSL_CERT_DIR can be used to override its value.
However, this was not taken into account by the haproxy SSL subsystem.
This is now correctly interpreted.

Another fix was made on QUIC related to retransmission. During the
handshake, if a server receives duplicated client crypto data, it can
assume there was a packet loss. To speed up the handshake completion,
the server may immediately retransmit its inflight crypto data. However,
the QUIC specification indicates that this should only be performed once
per connection to avoid excessive transmission. This control was
accidentely removed when rewritting crypto data handling with gaps. This
version restores the original behavior which limits immediate
retransmission per connection.

An internal fix was made for legacy applets to ensure that their I/O
handlers is never called after the shut operation. This improves the
consistency of the API when writing applets. Note that on 3.3 it is
harmeless as all applets are already converted to the newer
architecture.

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, which is the default method since 3.3.

In a related issue, it was reported that "balance random" isn't quite
fair for low loads on many servers (i.e. much less total connections
than servers, resulting in most servers being at 0 or 1 connection),
because the comparison on the current load isn't a discriminant anymore
For this reason the algorithm now also uses the recent server activity
(request rate) as a second discriminant so as to more fairly distribute
the load to all servers.

The task profiling is a debugging tool for the haproxy scheduler. It has
been extended in 3.3 to also monitor time spent waiting on locks.
However, this comes with a performance regression noticeable on highly
loaded systems. This is unfortunate as some users have started to
activate task profiling by default, as this can be an interesting way to
monitor the process. To allow users to continue to use such setups, task
profiling has been adjusted so that now value "on" or "auto" does not
monitor lock usage. This can be enabled by using the extra keyword
"lock". There is also an another value "memory", usable for time spent
waiting for memory allocation.

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
"tune.quic.listen off" 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
      tune.quic.listen off

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.3/src/
   Git repository   : https://git.haproxy.org/git/haproxy-3.3.git/
   Git Web browsing : https://git.haproxy.org/?p=haproxy-3.3.git
   Changelog        : https://www.haproxy.org/download/3.3/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 (4):
      BUG/MINOR: quic: ensure handshake speed up is only run once per conn
      BUG/MINOR: backend: fix access on shared counters array
      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 (1):
      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

William Lallemand (1):
      BUG/MINOR: ssl: SSL_CERT_DIR environment variable doesn't affect haproxy

Willy Tarreau (10):
      MEDIUM: h1: strictly verify quoting in chunk extensions
      CLEANUP: haproxy: fix bad line wrapping in run_poll_loop()
      BUG/MINOR: cpu-topo: count cores not cpus to distinguish core types
      CLEANUP: lb-chash: free lb_nodes from chash's deinit(), not global
      BUG/MEDIUM: lb-chash: always properly initialize lb_nodes with dynamic 
servers
      DOC: config: mention the limitation on server id range for consistent hash
      MEDIUM: backend: make "balance random" consider req rate when loads are 
equal
      MINOR: activity: support setting/clearing lock/memory watching for task 
profiling
      MEDIUM: activity: apply and use new finegrained task profiling settings
      MINOR: activity: allow to switch per-task lock/memory profiling at runtime

---

-- 
Amaury Denoyelle


Reply via email to