TCP/HTTP proxy and load balancer for high availability environments
CentOS Sources
2018-10-08 7d625a50ec51075d9a75406d1ace745a5459aab9
import rh-haproxy18-haproxy-1.8.4-3.el7
1 files added
1 files modified
96 ■■■■■ changed files
SOURCES/0002-BUG-CRITICAL-hpack-fix-improper-sign-check-header-index.patch 89 ●●●●● patch | view | raw | blame | history
SPECS/haproxy.spec 7 ●●●● patch | view | raw | blame | history
SOURCES/0002-BUG-CRITICAL-hpack-fix-improper-sign-check-header-index.patch
New file
@@ -0,0 +1,89 @@
From c927543d746e3eaef3e9ef09af2ff9b3c4a83d6c Mon Sep 17 00:00:00 2001
From: Willy Tarreau <w@1wt.eu>
Date: Mon, 17 Sep 2018 14:07:33 +0200
Subject: BUG/CRITICAL: hpack: fix improper sign check on the header index
 value
MIME-Version: 1.0
Content-Type: text/plain; charset=latin1
Content-Transfer-Encoding: 8bit
Tim Düsterhus found using afl-fuzz that some parts of the HPACK decoder
use incorrect bounds checking which do not catch negative values after
a type cast. The first culprit is hpack_valid_idx() which takes a signed
int and is fed with an unsigned one, but a few others are affected as
well due to being designed to work with an uint16_t as in the table
header, thus not being able to detect the high offset bits, though they
are not exposed if hpack_valid_idx() is fixed.
The impact is that the HPACK decoder can be crashed by an out-of-bounds
read. The only work-around without this patch is to disable H2 in the
configuration.
This patch addresses all of these issues at once. It must be backported
to 1.8.
---
 include/common/hpack-tbl.h | 6 +++---
 src/hpack-dec.c            | 2 +-
 src/hpack-tbl.c            | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/common/hpack-tbl.h b/include/common/hpack-tbl.h
index ffa866b..385f386 100644
--- a/include/common/hpack-tbl.h
+++ b/include/common/hpack-tbl.h
@@ -155,7 +155,7 @@ static inline const struct hpack_dte *hpack_get_dte(const struct hpack_dht *dht,
 }
 /* returns non-zero if <idx> is valid for table <dht> */
-static inline int hpack_valid_idx(const struct hpack_dht *dht, uint16_t idx)
+static inline int hpack_valid_idx(const struct hpack_dht *dht, uint32_t idx)
 {
     return idx < dht->used + HPACK_SHT_SIZE;
 }
@@ -181,7 +181,7 @@ static inline struct ist hpack_get_value(const struct hpack_dht *dht, const stru
 }
 /* takes an idx, returns the associated name */
-static inline struct ist hpack_idx_to_name(const struct hpack_dht *dht, int idx)
+static inline struct ist hpack_idx_to_name(const struct hpack_dht *dht, uint32_t idx)
 {
     const struct hpack_dte *dte;
@@ -196,7 +196,7 @@ static inline struct ist hpack_idx_to_name(const struct hpack_dht *dht, int idx)
 }
 /* takes an idx, returns the associated value */
-static inline struct ist hpack_idx_to_value(const struct hpack_dht *dht, int idx)
+static inline struct ist hpack_idx_to_value(const struct hpack_dht *dht, uint32_t idx)
 {
     const struct hpack_dte *dte;
diff --git a/src/hpack-dec.c b/src/hpack-dec.c
index dfbcaff..99d40f9 100644
--- a/src/hpack-dec.c
+++ b/src/hpack-dec.c
@@ -110,7 +110,7 @@ static inline int hpack_idx_to_phdr(uint32_t idx)
  * allocated there. In case of allocation failure, returns a string whose
  * pointer is NULL.
  */
-static inline struct ist hpack_alloc_string(struct chunk *store, int idx, struct ist in)
+static inline struct ist hpack_alloc_string(struct chunk *store, uint32_t idx, struct ist in)
 {
     struct ist out;
diff --git a/src/hpack-tbl.c b/src/hpack-tbl.c
index 9d6b764..e2d4426 100644
--- a/src/hpack-tbl.c
+++ b/src/hpack-tbl.c
@@ -113,7 +113,7 @@ static inline unsigned int hpack_dht_get_tail(const struct hpack_dht *dht)
 /* dump the whole dynamic header table */
 static void hpack_dht_dump(const struct hpack_dht *dht)
 {
-    int i;
+    unsigned int i;
     unsigned int slot;
     char name[4096], value[4096];
--
1.7.12.1
SPECS/haproxy.spec
@@ -17,7 +17,7 @@
Name:           %{?scl_prefix}haproxy
Version:        1.8.4
Release:        2%{?dist}
Release:        3%{?dist}
Summary:        TCP/HTTP proxy and load balancer for high availability environments
Group:          System Environment/Daemons
@@ -32,6 +32,7 @@
Source5:        halog.1
Patch1: 0001-BUG-CRITICAL-h2-fix-incorrect-frame-length-check.patch
Patch2: 0002-BUG-CRITICAL-hpack-fix-improper-sign-check-header-index.patch
BuildRequires:  pcre-devel
BuildRequires:  zlib-devel
@@ -70,6 +71,7 @@
%prep
%setup -q -n %{pkg_name}-%{version}
%patch1 -p1
%patch2 -p1
%build
regparm_opts=
@@ -201,6 +203,9 @@
%endif
%changelog
* Wed Sep 19 2018 Ryan O'Hara <rohara@redhat.com> - 1.8.4-3
- Fix improper sign check on the header index value (#1630502)
* Tue May 01 2018 Ryan O'Hara <rohara@redhat.com> - 1.8.4-2
- Fix incorrect HTTP/2 frame length check (#1569808)