squid: CVE-2016-4553

client_side.cc in Squid before 3.5.18 and 4.x before 4.0.10
does not properly ignore the Host header when absolute-URI
is provided, which allows remote attackers to conduct
cache-poisoning attacks via an HTTP request.

http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-4553

Backported upstream patch:
http://www.squid-cache.org/Versions/v3/3.5/changesets/squid-3.5-14039.patch

Signed-off-by: Catalin Enache <catalin.enache@windriver.com>
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
Signed-off-by: Joe MacDonald <joe_macdonald@mentor.com>
(cherry picked from commit d46c89ae44c811b64b117613072698601e483b32)
Signed-off-by: Armin Kuster <akuster808@gmail.com>
This commit is contained in:
Catalin Enache 2016-05-23 15:49:34 +03:00 committed by Armin Kuster
parent bee5bfb29d
commit 7166a2daec
2 changed files with 52 additions and 0 deletions

View File

@ -0,0 +1,51 @@
From 41ccaa04bb445f52bdb671ef6fbf994634b6efbe Mon Sep 17 00:00:00 2001
From: Catalin Enache <catalin.enache@windriver.com>
Date: Mon, 23 May 2016 12:47:39 +0300
Subject: [PATCH] Bug 4501: HTTP/1.1: normalize Host header
Upstream-Status: Backport
CVE: CVE-2016-4553
When absolute-URI is provided Host header should be ignored. However some
code still uses Host directly so normalize it using the URL authority
value before doing any further request processing.
For now preserve the case where Host is completely absent. That matters
to the CVE-2009-0801 protection.
This also has the desirable side effect of removing multiple or duplicate
Host header entries, and invalid port values.
Signed-off-by: Catalin Enache <catalin.enache@windriver.com>
---
src/client_side.cc | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/src/client_side.cc b/src/client_side.cc
index 8c41c21..36a27de 100644
--- a/src/client_side.cc
+++ b/src/client_side.cc
@@ -2652,6 +2652,20 @@ clientProcessRequest(ConnStateData *conn, HttpParser *hp, ClientSocketContext *c
clientProcessRequestFinished(conn, request);
return;
}
+
+ // when absolute-URI is provided Host header should be ignored. However
+ // some code still uses Host directly so normalize it.
+ // For now preserve the case where Host is completely absent. That matters.
+ if (request->header.has(HDR_HOST)) {
+ const char *host = request->header.getStr(HDR_HOST);
+ SBuf authority(request->GetHost());
+ if (request->port != urlDefaultPort(request->url.getScheme()))
+ authority.appendf(":%d", request->port);
+ debugs(33, 5, "URL domain " << authority << " overrides header Host: " << host);
+ // URL authority overrides Host header
+ request->header.delById(HDR_HOST);
+ request->header.putStr(HDR_HOST, authority.c_str());
+ }
}
// Some blobs below are still HTTP-specific, but we would have to rewrite
--
2.7.4

View File

@ -20,6 +20,7 @@ SRC_URI = "http://www.squid-cache.org/Versions/v${MAJ_VER}/${MIN_VER}/${BPN}-${P
file://run-ptest \
file://volatiles.03_squid \
file://CVE-2016-3947.patch \
file://CVE-2016-4553.patch \
"
LIC_FILES_CHKSUM = "file://COPYING;md5=c492e2d6d32ec5c1aad0e0609a141ce9 \