|
From 1af6a324c3206902f69bd2c9838e94ffb4cee3ae Mon Sep 17 00:00:00 2001
|
|
From: Lukas Tribus <luky-37@hotmail.com>
|
|
Date: Thu, 5 Nov 2015 13:59:30 +0100
|
|
Subject: [PATCH 02/10] BUG/MINOR: acl: don't use record layer in req_ssl_ver
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
The initial record layer version in a SSL handshake may be set to TLSv1.0
|
|
or similar for compatibility reasons, this is allowed as per RFC5246
|
|
Appendix E.1 [1]. Some implementations are Openssl [2] and NSS [3].
|
|
|
|
A related issue has been fixed some time ago in commit 57d229747
|
|
("BUG/MINOR: acl: req_ssl_sni fails with SSLv3 record version").
|
|
|
|
Fix this by using the real client hello version instead of the record
|
|
layer version.
|
|
|
|
This was reported by Julien Vehent and analyzed by Cyril Bonté.
|
|
The initial patch is from Julien Vehent as well.
|
|
|
|
This should be backported to stable series, the req_ssl_ver keyword was
|
|
first introduced in 1.3.16.
|
|
|
|
[1] https://tools.ietf.org/html/rfc5246#appendix-E.1
|
|
[2] https://github.com/openssl/openssl/commit/4a1cf50187659e60c5867ecbbc36e37b2605d2c3
|
|
[3] https://bugzilla.mozilla.org/show_bug.cgi?id=774547
|
|
(cherry picked from commit c93242cab986087f06a4655d14fec18eecb7f5f4)
|
|
(cherry picked from commit b048a6eb3d9cb518e4a378e20ba2a801afec553c)
|
|
---
|
|
src/payload.c | 11 +++++++----
|
|
1 file changed, 7 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/payload.c b/src/payload.c
|
|
index f62163c..b8f1ca3 100644
|
|
--- a/src/payload.c
|
|
+++ b/src/payload.c
|
|
@@ -148,21 +148,24 @@ smp_fetch_req_ssl_ver(struct proxy *px, struct session *s, void *l7, unsigned in
|
|
data = (const unsigned char *)s->req->buf->p;
|
|
if ((*data >= 0x14 && *data <= 0x17) || (*data == 0xFF)) {
|
|
/* SSLv3 header format */
|
|
- if (bleft < 5)
|
|
+ if (bleft < 11)
|
|
goto too_short;
|
|
|
|
- version = (data[1] << 16) + data[2]; /* version: major, minor */
|
|
+ version = (data[1] << 16) + data[2]; /* record layer version: major, minor */
|
|
msg_len = (data[3] << 8) + data[4]; /* record length */
|
|
|
|
/* format introduced with SSLv3 */
|
|
if (version < 0x00030000)
|
|
goto not_ssl;
|
|
|
|
- /* message length between 1 and 2^14 + 2048 */
|
|
- if (msg_len < 1 || msg_len > ((1<<14) + 2048))
|
|
+ /* message length between 6 and 2^14 + 2048 */
|
|
+ if (msg_len < 6 || msg_len > ((1<<14) + 2048))
|
|
goto not_ssl;
|
|
|
|
bleft -= 5; data += 5;
|
|
+
|
|
+ /* return the client hello client version, not the record layer version */
|
|
+ version = (data[4] << 16) + data[5]; /* client hello version: major, minor */
|
|
} else {
|
|
/* SSLv2 header format, only supported for hello (msg type 1) */
|
|
int rlen, plen, cilen, silen, chlen;
|
|
--
|
|
2.4.10
|
|
|