Patch attached. Patch applied against Pound-2.6.tgz -- Tom Fitzhenry
On Mon, Dec 1, 2014, at 02:23 PM, Tom Fitzhenry wrote: > # Steps to reproduce > 1. Copy the attached `pound.cfg` to `/etc/pound/` > 2. Copy the attached `pound-test-cert.pem` to `/etc/ssl/private/` > 3. Open a TCP port on port 8080: `netcat -t -l -p 8080` > 4. `service pound start` > 5. Make a TLS (not SSL!) request: `curl --tlsv1 --ciphers 'AES128-SHA' > -k https://127.0.0.1:8443/` > 6. Look at the stdout of netcat, and see the value of HTTP request > header X-SSL-cipher that pound has injected into the request > > ## Expected > The connection is reported to be TLS > > ## Actual > The connection is reported to be SSLv3: "AES128-SHA SSLv3 Kx=RSA Au=RSA > Enc=AES(128) Mac=SHA1" > > Wireshark debugging confirms that the curl connection is indeed a TLS > connection, rather than a SSLv3 connection. > > # Impact > When trying to determine the impact of disabling SSLv3 (re POODLE), we > searched > our logs for how many clients used SSLv3, and this bug caused us to > believe we > had more SSLv3 traffic than we actually did. > > # Why this is reported to be SSLv3 > Looking into the pound code[0], X-SSL-cipher is populated with the > result of SSL_CIPHER_description(). > In SSL_CIPHER_description() "The TLSv1.0 ciphers are flagged with > SSLv3."[1]. > The AES ciphers are TLSv1 ciphers, and hence are reported as SSLv3 by > pound/openssl. > > # Proposed fix > Add a X-SSL-version header, using SSL_get_version()[2]. I can produce a > patch for this, if it is considered an acceptable change. > > I originally raised this against Ubuntu's bug tracker[3], but have since > found this mailing list, so am posting it here. > > 0. > https://github.com/mandiant/pound/blob/a3705bc06e44ec4a229fd38760d6c04c43ced6b6/http.c#L943 > 1. https://www.openssl.org/docs/ssl/SSL_CIPHER_get_name.html > 2. https://www.openssl.org/docs/ssl/SSL_get_version.html > 3. https://bugs.launchpad.net/ubuntu/+source/pound/+bug/1398007 > > -- > Tom Fitzhenry > Email had 2 attachments: > + pound.cfg > 1k (application/octet-stream) > + pound-test-cert.pem > 2k (application/x-x509-ca-cert)
From d8caa2629ad0c9adeb16c45fd6cc5d11da3bbad2 Mon Sep 17 00:00:00 2001 From: Tom Fitzhenry <[email protected]> Date: Mon, 1 Dec 2014 22:32:43 +0000 Subject: [PATCH] Add X-SSL-version header Uses https://www.openssl.org/docs/ssl/SSL_get_version.html , so the value of X-SSL-version is one of {SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2,unknown} --- http.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/http.c b/http.c index bb2ce8b..caa89e3 100755 --- a/http.c +++ b/http.c @@ -953,6 +953,7 @@ do_http(thr_arg *arg) /* if SSL put additional headers for client certificate */ if(cur_backend->be_type == 0 && ssl != NULL) { SSL_CIPHER *cipher; + const char *protocolVersion; if((cipher = SSL_get_current_cipher(ssl)) != NULL) { SSL_CIPHER_description(cipher, buf, MAXBUF - 1); @@ -968,6 +969,18 @@ do_http(thr_arg *arg) } } + if((protocolVersion = SSL_get_version(ssl)) != NULL) { + if(BIO_printf(be, "X-SSL-version: %s\r\n", protocolVersion) <= 0) { + str_be(buf, MAXBUF - 1, cur_backend); + end_req = cur_time(); + logmsg(LOG_WARNING, "(%lx) e500 error write X-SSL-version to %s: %s (%.3f sec)", + pthread_self(), buf, strerror(errno), (end_req - start_req) / 1000000.0); + err_reply(cl, h500, lstn->err500); + clean_all(); + return; + } + } + if(lstn->clnt_check > 0 && x509 != NULL && (bb = BIO_new(BIO_s_mem())) != NULL) { X509_NAME_print_ex(bb, X509_get_subject_name(x509), 8, XN_FLAG_ONELINE & ~ASN1_STRFLGS_ESC_MSB); get_line(bb, buf, MAXBUF); -- 2.2.0
