diff options
author | Arno Töll <debian@toell.net> | 2011-12-18 20:37:18 +0100 |
---|---|---|
committer | Arno Töll <arno@debian.org> | 2012-11-21 23:30:04 +0100 |
commit | 3ba85dd1f41b3623be7ff55548a75d6e9393ba11 (patch) | |
tree | cd885a415c08c3c9e9e1aacdac3f17a366b0aabf | |
parent | 97c46fb716594ff23f436209580b8424a926d7e3 (diff) | |
download | lighttpd-3ba85dd1f41b3623be7ff55548a75d6e9393ba11.tar.gz |
Imported Debian patch 1.4.28-2+squeeze1debian/1.4.28-2+squeeze1
-rw-r--r-- | debian/NEWS | 21 | ||||
-rw-r--r-- | debian/changelog | 11 | ||||
-rw-r--r-- | debian/conf-available/10-ssl.conf | 3 | ||||
-rw-r--r-- | debian/patches/debian-changes-1.4.28-2 | 535 | ||||
-rw-r--r-- | debian/patches/fix-CVE-2011-4362.patch | 37 | ||||
-rw-r--r-- | debian/patches/series | 2 | ||||
-rw-r--r-- | debian/patches/ssl-mitigate-beast.patch | 67 | ||||
-rwxr-xr-x[-rw-r--r--] | ltmain.sh | 0 | ||||
-rw-r--r-- | src/configparser.c | 80 | ||||
-rw-r--r-- | src/mod_ssi_exprparser.c | 38 | ||||
-rwxr-xr-x[-rw-r--r--] | tests/core-404-handler.t | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | tests/symlink.t | 0 |
12 files changed, 735 insertions, 59 deletions
diff --git a/debian/NEWS b/debian/NEWS index 9a3548e..c31c290 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,3 +1,24 @@ +lighttpd (1.4.28-2+squeeze1) stable-security; urgency=high + + This releases includes an option to force Lighttpd to honor the cipher order + in ssl.cipher-list. This mitigates the effects of a SSL CBC attack commonly + referred to as "BEAST attack". See [1] and CVE-2011-3389 for more details. + + To minimze the risk of this attack it is recommended either to disable all CBC + ciphers (beware: this will break older clients), or pursue clients to use safe + ciphers where possible at least. To do so, set + + ssl.ciphers = "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM" + ssl.honor-cipher-order = "enable" + + in your /etc/lighttpd/conf-available/10-ssl.conf file or on any SSL enabled + host you configured. If you did not change this file previously, this upgrade + will update it automatically. + + [1] http://blog.ivanristic.com/2011/10/mitigating-the-beast-attack-on-tls.html + + -- Arno Töll <debian@toell.net> Sun, 18 Dec 2011 21:20:12 +0100 + lighttpd (1.4.23-1) unstable; urgency=low spawn-fcgi is now separate package. Please install "spawn-fcgi" package if diff --git a/debian/changelog b/debian/changelog index 1d3a0b5..bfa16d1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +lighttpd (1.4.28-2+squeeze1) stable-security; urgency=high + + * Backport security issues from 1.4.30: + + Fix integer overflow (CVE-2011-4362) + + Fix attack vector as disclosed by the SSL BEAST attack (related: + CVE-2011-3389). Note: If you are upgrading from an older version you need + to change your configuration to mitigate effects of the attack. See the + corresponding NEWS file for details. + + -- Arno Töll <debian@toell.net> Sun, 18 Dec 2011 20:37:18 +0100 + lighttpd (1.4.28-2) unstable; urgency=medium [ Olaf van der Spek ] diff --git a/debian/conf-available/10-ssl.conf b/debian/conf-available/10-ssl.conf index 4656d86..34f3912 100644 --- a/debian/conf-available/10-ssl.conf +++ b/debian/conf-available/10-ssl.conf @@ -3,4 +3,7 @@ $SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/server.pem" + + ssl.cipher-list = "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM" + ssl.honor-cipher-order = "enable" } diff --git a/debian/patches/debian-changes-1.4.28-2 b/debian/patches/debian-changes-1.4.28-2 new file mode 100644 index 0000000..d165d10 --- /dev/null +++ b/debian/patches/debian-changes-1.4.28-2 @@ -0,0 +1,535 @@ +Description: Upstream changes introduced in version 1.4.28-2 + This patch has been created by dpkg-source during the package build. + Here's the last changelog entry, hopefully it gives details on why + those changes were made: + . + lighttpd (1.4.28-2) unstable; urgency=medium + . + [ Olaf van der Spek ] + * Use relative instead of absolute links for conf-enabled (closes: #541645) + * Fix /doc/ for IPv6 (closes: #512583) + . + [ Krzysztof Krzyżaniak (eloy) ] + * Added patch patches/silence-errors.diff (closes: #601177) + . + The person named in the Author field signed this changelog entry. +Author: Krzysztof Krzyżaniak (eloy) <eloy@debian.org> +Bug-Debian: http://bugs.debian.org/512583 +Bug-Debian: http://bugs.debian.org/541645 +Bug-Debian: http://bugs.debian.org/601177 + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: <vendor|upstream|other>, <url of original patch> +Bug: <url in upstream bugtracker> +Bug-Debian: http://bugs.debian.org/<bugnumber> +Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber> +Forwarded: <no|not-needed|url proving that it has been forwarded> +Reviewed-By: <name and email of someone who approved the patch> +Last-Update: <YYYY-MM-DD> + +--- lighttpd-1.4.28.orig/src/configparser.c ++++ lighttpd-1.4.28/src/configparser.c +@@ -4,7 +4,7 @@ + /* First off, code is include which follows the "include" declaration + ** in the input file. */ + #include <stdio.h> +-#line 5 "../../src/configparser.y" ++#line 5 "./configparser.y" + + #include "configfile.h" + #include "buffer.h" +@@ -518,42 +518,42 @@ static void yy_destructor(YYCODETYPE yym + case 23: + case 24: + case 25: +-#line 144 "../../src/configparser.y" ++#line 144 "./configparser.y" + { buffer_free((yypminor->yy0)); } + #line 523 "configparser.c" + break; + case 35: +-#line 135 "../../src/configparser.y" ++#line 135 "./configparser.y" + { (yypminor->yy41)->free((yypminor->yy41)); } + #line 528 "configparser.c" + break; + case 36: +-#line 136 "../../src/configparser.y" ++#line 136 "./configparser.y" + { (yypminor->yy41)->free((yypminor->yy41)); } + #line 533 "configparser.c" + break; + case 37: +-#line 137 "../../src/configparser.y" ++#line 137 "./configparser.y" + { (yypminor->yy41)->free((yypminor->yy41)); } + #line 538 "configparser.c" + break; + case 39: +-#line 138 "../../src/configparser.y" ++#line 138 "./configparser.y" + { array_free((yypminor->yy40)); } + #line 543 "configparser.c" + break; + case 40: +-#line 139 "../../src/configparser.y" ++#line 139 "./configparser.y" + { array_free((yypminor->yy40)); } + #line 548 "configparser.c" + break; + case 41: +-#line 140 "../../src/configparser.y" ++#line 140 "./configparser.y" + { buffer_free((yypminor->yy43)); } + #line 553 "configparser.c" + break; + case 42: +-#line 141 "../../src/configparser.y" ++#line 141 "./configparser.y" + { buffer_free((yypminor->yy43)); } + #line 558 "configparser.c" + break; +@@ -823,7 +823,7 @@ static void yy_reduce( + /* No destructor defined for global */ + break; + case 5: +-#line 117 "../../src/configparser.y" ++#line 117 "./configparser.y" + { yymsp[-1].minor.yy78 = NULL; } + #line 828 "configparser.c" + yy_destructor(1,&yymsp[0].minor); +@@ -838,7 +838,7 @@ static void yy_reduce( + yy_destructor(1,&yymsp[0].minor); + break; + case 9: +-#line 146 "../../src/configparser.y" ++#line 146 "./configparser.y" + { + if (ctx->ok) { + buffer_copy_string_buffer(yymsp[0].minor.yy41->key, yymsp[-2].minor.yy43); +@@ -866,7 +866,7 @@ static void yy_reduce( + yy_destructor(2,&yymsp[-1].minor); + break; + case 10: +-#line 170 "../../src/configparser.y" ++#line 170 "./configparser.y" + { + array *vars = ctx->current->value; + data_unset *du; +@@ -909,7 +909,7 @@ static void yy_reduce( + yy_destructor(3,&yymsp[-1].minor); + break; + case 11: +-#line 209 "../../src/configparser.y" ++#line 209 "./configparser.y" + { + if (strchr(yymsp[0].minor.yy0->ptr, '.') == NULL) { + yygotominor.yy43 = buffer_init_string("var."); +@@ -924,7 +924,7 @@ static void yy_reduce( + #line 924 "configparser.c" + break; + case 12: +-#line 221 "../../src/configparser.y" ++#line 221 "./configparser.y" + { + yygotominor.yy41 = configparser_merge_data(yymsp[-2].minor.yy41, yymsp[0].minor.yy41); + if (NULL == yygotominor.yy41) { +@@ -938,7 +938,7 @@ static void yy_reduce( + yy_destructor(5,&yymsp[-1].minor); + break; + case 13: +-#line 231 "../../src/configparser.y" ++#line 231 "./configparser.y" + { + yygotominor.yy41 = yymsp[0].minor.yy41; + yymsp[0].minor.yy41 = NULL; +@@ -946,7 +946,7 @@ static void yy_reduce( + #line 946 "configparser.c" + break; + case 14: +-#line 236 "../../src/configparser.y" ++#line 236 "./configparser.y" + { + yygotominor.yy41 = NULL; + if (strncmp(yymsp[0].minor.yy43->ptr, "env.", sizeof("env.") - 1) == 0) { +@@ -976,7 +976,7 @@ static void yy_reduce( + #line 976 "configparser.c" + break; + case 15: +-#line 263 "../../src/configparser.y" ++#line 263 "./configparser.y" + { + yygotominor.yy41 = (data_unset *)data_string_init(); + buffer_copy_string_buffer(((data_string *)(yygotominor.yy41))->value, yymsp[0].minor.yy0); +@@ -986,7 +986,7 @@ static void yy_reduce( + #line 986 "configparser.c" + break; + case 16: +-#line 270 "../../src/configparser.y" ++#line 270 "./configparser.y" + { + yygotominor.yy41 = (data_unset *)data_integer_init(); + ((data_integer *)(yygotominor.yy41))->value = strtol(yymsp[0].minor.yy0->ptr, NULL, 10); +@@ -996,7 +996,7 @@ static void yy_reduce( + #line 996 "configparser.c" + break; + case 17: +-#line 276 "../../src/configparser.y" ++#line 276 "./configparser.y" + { + yygotominor.yy41 = (data_unset *)data_array_init(); + array_free(((data_array *)(yygotominor.yy41))->value); +@@ -1006,7 +1006,7 @@ static void yy_reduce( + #line 1006 "configparser.c" + break; + case 18: +-#line 282 "../../src/configparser.y" ++#line 282 "./configparser.y" + { + yygotominor.yy40 = array_init(); + } +@@ -1015,7 +1015,7 @@ static void yy_reduce( + yy_destructor(9,&yymsp[0].minor); + break; + case 19: +-#line 285 "../../src/configparser.y" ++#line 285 "./configparser.y" + { + yygotominor.yy40 = yymsp[-1].minor.yy40; + yymsp[-1].minor.yy40 = NULL; +@@ -1025,7 +1025,7 @@ static void yy_reduce( + yy_destructor(9,&yymsp[0].minor); + break; + case 20: +-#line 290 "../../src/configparser.y" ++#line 290 "./configparser.y" + { + if (buffer_is_empty(yymsp[0].minor.yy41->key) || + NULL == array_get_element(yymsp[-2].minor.yy40, yymsp[0].minor.yy41->key->ptr)) { +@@ -1046,7 +1046,7 @@ static void yy_reduce( + yy_destructor(10,&yymsp[-1].minor); + break; + case 21: +-#line 307 "../../src/configparser.y" ++#line 307 "./configparser.y" + { + yygotominor.yy40 = yymsp[-1].minor.yy40; + yymsp[-1].minor.yy40 = NULL; +@@ -1055,7 +1055,7 @@ static void yy_reduce( + yy_destructor(10,&yymsp[0].minor); + break; + case 22: +-#line 312 "../../src/configparser.y" ++#line 312 "./configparser.y" + { + yygotominor.yy40 = array_init(); + array_insert_unique(yygotominor.yy40, yymsp[0].minor.yy41); +@@ -1064,7 +1064,7 @@ static void yy_reduce( + #line 1064 "configparser.c" + break; + case 23: +-#line 318 "../../src/configparser.y" ++#line 318 "./configparser.y" + { + yygotominor.yy41 = yymsp[0].minor.yy41; + yymsp[0].minor.yy41 = NULL; +@@ -1072,7 +1072,7 @@ static void yy_reduce( + #line 1072 "configparser.c" + break; + case 24: +-#line 322 "../../src/configparser.y" ++#line 322 "./configparser.y" + { + buffer_copy_string_buffer(yymsp[0].minor.yy41->key, yymsp[-2].minor.yy43); + buffer_free(yymsp[-2].minor.yy43); +@@ -1090,7 +1090,7 @@ static void yy_reduce( + case 26: + break; + case 27: +-#line 334 "../../src/configparser.y" ++#line 334 "./configparser.y" + { + data_config *dc; + dc = (data_config *)array_get_element(ctx->srv->config_context, "global"); +@@ -1101,7 +1101,7 @@ static void yy_reduce( + yy_destructor(12,&yymsp[0].minor); + break; + case 28: +-#line 341 "../../src/configparser.y" ++#line 341 "./configparser.y" + { + data_config *cur; + +@@ -1119,7 +1119,7 @@ static void yy_reduce( + yy_destructor(14,&yymsp[0].minor); + break; + case 29: +-#line 352 "../../src/configparser.y" ++#line 352 "./configparser.y" + { + if (yymsp[-3].minor.yy78->context_ndx >= yymsp[0].minor.yy78->context_ndx) { + fprintf(stderr, "unreachable else condition\n"); +@@ -1136,7 +1136,7 @@ static void yy_reduce( + yy_destructor(15,&yymsp[-1].minor); + break; + case 30: +-#line 364 "../../src/configparser.y" ++#line 364 "./configparser.y" + { + yygotominor.yy78 = yymsp[0].minor.yy78; + yymsp[0].minor.yy78 = NULL; +@@ -1144,7 +1144,7 @@ static void yy_reduce( + #line 1144 "configparser.c" + break; + case 31: +-#line 369 "../../src/configparser.y" ++#line 369 "./configparser.y" + { + data_config *cur; + +@@ -1162,7 +1162,7 @@ static void yy_reduce( + yy_destructor(14,&yymsp[0].minor); + break; + case 32: +-#line 380 "../../src/configparser.y" ++#line 380 "./configparser.y" + { + data_config *dc; + buffer *b, *rvalue, *op; +@@ -1318,7 +1318,7 @@ static void yy_reduce( + yy_destructor(19,&yymsp[-2].minor); + break; + case 33: +-#line 529 "../../src/configparser.y" ++#line 529 "./configparser.y" + { + yygotominor.yy27 = CONFIG_COND_EQ; + } +@@ -1326,7 +1326,7 @@ static void yy_reduce( + yy_destructor(20,&yymsp[0].minor); + break; + case 34: +-#line 532 "../../src/configparser.y" ++#line 532 "./configparser.y" + { + yygotominor.yy27 = CONFIG_COND_MATCH; + } +@@ -1334,7 +1334,7 @@ static void yy_reduce( + yy_destructor(21,&yymsp[0].minor); + break; + case 35: +-#line 535 "../../src/configparser.y" ++#line 535 "./configparser.y" + { + yygotominor.yy27 = CONFIG_COND_NE; + } +@@ -1342,7 +1342,7 @@ static void yy_reduce( + yy_destructor(22,&yymsp[0].minor); + break; + case 36: +-#line 538 "../../src/configparser.y" ++#line 538 "./configparser.y" + { + yygotominor.yy27 = CONFIG_COND_NOMATCH; + } +@@ -1350,7 +1350,7 @@ static void yy_reduce( + yy_destructor(23,&yymsp[0].minor); + break; + case 37: +-#line 542 "../../src/configparser.y" ++#line 542 "./configparser.y" + { + yygotominor.yy43 = NULL; + if (ctx->ok) { +@@ -1370,7 +1370,7 @@ static void yy_reduce( + #line 1370 "configparser.c" + break; + case 38: +-#line 559 "../../src/configparser.y" ++#line 559 "./configparser.y" + { + if (ctx->ok) { + if (0 != config_parse_file(ctx->srv, ctx, yymsp[0].minor.yy43->ptr)) { +@@ -1384,7 +1384,7 @@ static void yy_reduce( + yy_destructor(24,&yymsp[-1].minor); + break; + case 39: +-#line 569 "../../src/configparser.y" ++#line 569 "./configparser.y" + { + if (ctx->ok) { + if (0 != config_parse_cmd(ctx->srv, ctx, yymsp[0].minor.yy43->ptr)) { +@@ -1424,7 +1424,7 @@ static void yy_parse_failed( + while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +-#line 108 "../../src/configparser.y" ++#line 108 "./configparser.y" + + ctx->ok = 0; + +--- lighttpd-1.4.28.orig/src/mod_ssi_exprparser.c ++++ lighttpd-1.4.28/src/mod_ssi_exprparser.c +@@ -4,7 +4,7 @@ + /* First off, code is include which follows the "include" declaration + ** in the input file. */ + #include <stdio.h> +-#line 6 "../../src/mod_ssi_exprparser.y" ++#line 6 "./mod_ssi_exprparser.y" + + #include "mod_ssi_expr.h" + #include "buffer.h" +@@ -347,7 +347,7 @@ static void yy_destructor(YYCODETYPE yym + case 10: + case 11: + case 12: +-#line 22 "../../src/mod_ssi_exprparser.y" ++#line 22 "./mod_ssi_exprparser.y" + { buffer_free((yypminor->yy0)); } + #line 352 "mod_ssi_exprparser.c" + break; +@@ -578,7 +578,7 @@ static void yy_reduce( + ** break; + */ + case 0: +-#line 29 "../../src/mod_ssi_exprparser.y" ++#line 29 "./mod_ssi_exprparser.y" + { + ctx->val.bo = ssi_val_tobool(yymsp[0].minor.yy29); + ctx->val.type = SSI_TYPE_BOOL; +@@ -588,7 +588,7 @@ static void yy_reduce( + #line 588 "mod_ssi_exprparser.c" + break; + case 1: +-#line 36 "../../src/mod_ssi_exprparser.y" ++#line 36 "./mod_ssi_exprparser.y" + { + int cmp; + +@@ -617,14 +617,14 @@ static void yy_reduce( + #line 617 "mod_ssi_exprparser.c" + break; + case 2: +-#line 61 "../../src/mod_ssi_exprparser.y" ++#line 61 "./mod_ssi_exprparser.y" + { + yygotominor.yy29 = yymsp[0].minor.yy29; + } + #line 624 "mod_ssi_exprparser.c" + break; + case 3: +-#line 64 "../../src/mod_ssi_exprparser.y" ++#line 64 "./mod_ssi_exprparser.y" + { + int e; + +@@ -639,7 +639,7 @@ static void yy_reduce( + yy_destructor(1,&yymsp[-1].minor); + break; + case 4: +-#line 75 "../../src/mod_ssi_exprparser.y" ++#line 75 "./mod_ssi_exprparser.y" + { + int e; + +@@ -654,7 +654,7 @@ static void yy_reduce( + yy_destructor(2,&yymsp[-1].minor); + break; + case 5: +-#line 86 "../../src/mod_ssi_exprparser.y" ++#line 86 "./mod_ssi_exprparser.y" + { + int e; + +@@ -668,7 +668,7 @@ static void yy_reduce( + yy_destructor(9,&yymsp[-1].minor); + break; + case 6: +-#line 95 "../../src/mod_ssi_exprparser.y" ++#line 95 "./mod_ssi_exprparser.y" + { + yygotominor.yy29 = yymsp[-1].minor.yy29; + } +@@ -677,7 +677,7 @@ static void yy_reduce( + yy_destructor(11,&yymsp[0].minor); + break; + case 7: +-#line 99 "../../src/mod_ssi_exprparser.y" ++#line 99 "./mod_ssi_exprparser.y" + { + yygotominor.yy29 = ssi_val_init(); + yygotominor.yy29->str = yymsp[0].minor.yy19; +@@ -686,14 +686,14 @@ static void yy_reduce( + #line 686 "mod_ssi_exprparser.c" + break; + case 8: +-#line 105 "../../src/mod_ssi_exprparser.y" ++#line 105 "./mod_ssi_exprparser.y" + { + yygotominor.yy19 = yymsp[0].minor.yy0; + } + #line 693 "mod_ssi_exprparser.c" + break; + case 9: +-#line 109 "../../src/mod_ssi_exprparser.y" ++#line 109 "./mod_ssi_exprparser.y" + { + yygotominor.yy19 = yymsp[-1].minor.yy19; + buffer_append_string_buffer(yygotominor.yy19, yymsp[0].minor.yy0); +@@ -702,37 +702,37 @@ static void yy_reduce( + #line 702 "mod_ssi_exprparser.c" + break; + case 10: +-#line 115 "../../src/mod_ssi_exprparser.y" ++#line 115 "./mod_ssi_exprparser.y" + { yygotominor.yy8 = SSI_COND_EQ; } + #line 707 "mod_ssi_exprparser.c" + yy_destructor(3,&yymsp[0].minor); + break; + case 11: +-#line 116 "../../src/mod_ssi_exprparser.y" ++#line 116 "./mod_ssi_exprparser.y" + { yygotominor.yy8 = SSI_COND_NE; } + #line 713 "mod_ssi_exprparser.c" + yy_destructor(4,&yymsp[0].minor); + break; + case 12: +-#line 117 "../../src/mod_ssi_exprparser.y" ++#line 117 "./mod_ssi_exprparser.y" + { yygotominor.yy8 = SSI_COND_LE; } + #line 719 "mod_ssi_exprparser.c" + yy_destructor(8,&yymsp[0].minor); + break; + case 13: +-#line 118 "../../src/mod_ssi_exprparser.y" ++#line 118 "./mod_ssi_exprparser.y" + { yygotominor.yy8 = SSI_COND_GE; } + #line 725 "mod_ssi_exprparser.c" + yy_destructor(6,&yymsp[0].minor); + break; + case 14: +-#line 119 "../../src/mod_ssi_exprparser.y" ++#line 119 "./mod_ssi_exprparser.y" + { yygotominor.yy8 = SSI_COND_LT; } + #line 731 "mod_ssi_exprparser.c" + yy_destructor(7,&yymsp[0].minor); + break; + case 15: +-#line 120 "../../src/mod_ssi_exprparser.y" ++#line 120 "./mod_ssi_exprparser.y" + { yygotominor.yy8 = SSI_COND_GT; } + #line 737 "mod_ssi_exprparser.c" + yy_destructor(5,&yymsp[0].minor); +@@ -764,7 +764,7 @@ static void yy_parse_failed( + while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +-#line 14 "../../src/mod_ssi_exprparser.y" ++#line 14 "./mod_ssi_exprparser.y" + + ctx->ok = 0; + diff --git a/debian/patches/fix-CVE-2011-4362.patch b/debian/patches/fix-CVE-2011-4362.patch new file mode 100644 index 0000000..cf39e6c --- /dev/null +++ b/debian/patches/fix-CVE-2011-4362.patch @@ -0,0 +1,37 @@ +--- a/src/http_auth.c ++++ b/src/http_auth.c +@@ -89,7 +89,7 @@ + ch = in[0]; + /* run through the whole string, converting as we go */ + for (i = 0; i < in_len; i++) { +- ch = in[i]; ++ ch = (unsigned char) in[i]; + + if (ch == '\0') break; + +--- a/tests/mod-auth.t ++++ b/tests/mod-auth.t +@@ -8,7 +8,7 @@ + + use strict; + use IO::Socket; +-use Test::More tests => 14; ++use Test::More tests => 15; + use LightyTest; + + my $tf = LightyTest->new(); +@@ -25,6 +25,14 @@ + + $t->{REQUEST} = ( <<EOF + GET /server-status HTTP/1.0 ++Authorization: Basic \x80mFuOmphb ++EOF ++ ); ++$t->{RESPONSE} = [ { 'HTTP-Protocol' => 'HTTP/1.0', 'HTTP-Status' => 401 } ]; ++ok($tf->handle_http($t) == 0, 'Basic-Auth: Invalid base64 Auth-token'); ++ ++$t->{REQUEST} = ( <<EOF ++GET /server-status HTTP/1.0 + Authorization: Basic amFuOmphb + EOF + ); diff --git a/debian/patches/series b/debian/patches/series index a2c5449..8441374 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,4 @@ silence-errors.diff +fix-CVE-2011-4362.patch +ssl-mitigate-beast.patch debian-changes-1.4.28-2 diff --git a/debian/patches/ssl-mitigate-beast.patch b/debian/patches/ssl-mitigate-beast.patch new file mode 100644 index 0000000..9a8e6b0 --- /dev/null +++ b/debian/patches/ssl-mitigate-beast.patch @@ -0,0 +1,67 @@ +--- a/src/base.h ++++ b/src/base.h +@@ -275,6 +275,7 @@ + buffer *ssl_pemfile; + buffer *ssl_ca_file; + buffer *ssl_cipher_list; ++ unsigned short ssl_honor_cipher_order; /* determine SSL cipher in server-preferred order, not client-order */ + unsigned short ssl_use_sslv2; + unsigned short ssl_verifyclient; + unsigned short ssl_verifyclient_enforce; +--- a/src/configfile.c ++++ b/src/configfile.c +@@ -102,6 +102,7 @@ + { "ssl.verifyclient.exportcert", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER }, /* 60 */ + + { "server.set-v6only", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_CONNECTION }, /* 61 */ ++ { "ssl.honor-cipher-order", NULL, T_CONFIG_BOOLEAN, T_CONFIG_SCOPE_SERVER}, /* 62 */ + + { "server.host", "use server.bind instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, + { "server.docroot", "use server.document-root instead", T_CONFIG_DEPRECATED, T_CONFIG_SCOPE_UNSET }, +@@ -171,6 +172,7 @@ + s->max_write_idle = 360; + s->use_xattr = 0; + s->is_ssl = 0; ++ s->ssl_honor_cipher_order = 1; + s->ssl_use_sslv2 = 0; + s->use_ipv6 = 0; + s->set_v6only = 1; +@@ -246,6 +248,7 @@ + cv[58].destination = &(s->ssl_verifyclient_depth); + cv[59].destination = s->ssl_verifyclient_username; + cv[60].destination = &(s->ssl_verifyclient_export_cert); ++ cv[62].destination = &(s->ssl_honor_cipher_order); + + srv->config_storage[i] = s; + +@@ -324,6 +327,7 @@ + #endif + PATCH(ssl_ca_file); + PATCH(ssl_cipher_list); ++ PATCH(ssl_honor_cipher_order); + PATCH(ssl_use_sslv2); + PATCH(etag_use_inode); + PATCH(etag_use_mtime); +@@ -388,6 +392,8 @@ + #endif + } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.ca-file"))) { + PATCH(ssl_ca_file); ++ } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.honor-cipher-order"))) { ++ PATCH(ssl_honor_cipher_order); + } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.use-sslv2"))) { + PATCH(ssl_use_sslv2); + } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("ssl.cipher-list"))) { +--- a/src/network.c ++++ b/src/network.c +@@ -552,6 +552,11 @@ + ERR_error_string(ERR_get_error(), NULL)); + return -1; + } ++ ++ if (s->ssl_honor_cipher_order) { ++ SSL_CTX_set_options(s->ssl_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE); ++ } ++ + } + + if (!buffer_is_empty(s->ssl_ca_file)) { diff --git a/ltmain.sh b/ltmain.sh index d88da2c..d88da2c 100644..100755 --- a/ltmain.sh +++ b/ltmain.sh diff --git a/src/configparser.c b/src/configparser.c index 808cd66..24e973b 100644 --- a/src/configparser.c +++ b/src/configparser.c @@ -4,7 +4,7 @@ /* First off, code is include which follows the "include" declaration ** in the input file. */ #include <stdio.h> -#line 5 "./configparser.y" +#line 5 "../../src/configparser.y" #include "configfile.h" #include "buffer.h" @@ -518,42 +518,42 @@ static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){ case 23: case 24: case 25: -#line 144 "./configparser.y" +#line 144 "../../src/configparser.y" { buffer_free((yypminor->yy0)); } #line 523 "configparser.c" break; case 35: -#line 135 "./configparser.y" +#line 135 "../../src/configparser.y" { (yypminor->yy41)->free((yypminor->yy41)); } #line 528 "configparser.c" break; case 36: -#line 136 "./configparser.y" +#line 136 "../../src/configparser.y" { (yypminor->yy41)->free((yypminor->yy41)); } #line 533 "configparser.c" break; case 37: -#line 137 "./configparser.y" +#line 137 "../../src/configparser.y" { (yypminor->yy41)->free((yypminor->yy41)); } #line 538 "configparser.c" break; case 39: -#line 138 "./configparser.y" +#line 138 "../../src/configparser.y" { array_free((yypminor->yy40)); } #line 543 "configparser.c" break; case 40: -#line 139 "./configparser.y" +#line 139 "../../src/configparser.y" { array_free((yypminor->yy40)); } #line 548 "configparser.c" break; case 41: -#line 140 "./configparser.y" +#line 140 "../../src/configparser.y" { buffer_free((yypminor->yy43)); } #line 553 "configparser.c" break; case 42: -#line 141 "./configparser.y" +#line 141 "../../src/configparser.y" { buffer_free((yypminor->yy43)); } #line 558 "configparser.c" break; @@ -823,7 +823,7 @@ static void yy_reduce( /* No destructor defined for global */ break; case 5: -#line 117 "./configparser.y" +#line 117 "../../src/configparser.y" { yymsp[-1].minor.yy78 = NULL; } #line 828 "configparser.c" yy_destructor(1,&yymsp[0].minor); @@ -838,7 +838,7 @@ static void yy_reduce( yy_destructor(1,&yymsp[0].minor); break; case 9: -#line 146 "./configparser.y" +#line 146 "../../src/configparser.y" { if (ctx->ok) { buffer_copy_string_buffer(yymsp[0].minor.yy41->key, yymsp[-2].minor.yy43); @@ -866,7 +866,7 @@ static void yy_reduce( yy_destructor(2,&yymsp[-1].minor); break; case 10: -#line 170 "./configparser.y" +#line 170 "../../src/configparser.y" { array *vars = ctx->current->value; data_unset *du; @@ -909,7 +909,7 @@ static void yy_reduce( yy_destructor(3,&yymsp[-1].minor); break; case 11: -#line 209 "./configparser.y" +#line 209 "../../src/configparser.y" { if (strchr(yymsp[0].minor.yy0->ptr, '.') == NULL) { yygotominor.yy43 = buffer_init_string("var."); @@ -924,7 +924,7 @@ static void yy_reduce( #line 924 "configparser.c" break; case 12: -#line 221 "./configparser.y" +#line 221 "../../src/configparser.y" { yygotominor.yy41 = configparser_merge_data(yymsp[-2].minor.yy41, yymsp[0].minor.yy41); if (NULL == yygotominor.yy41) { @@ -938,7 +938,7 @@ static void yy_reduce( yy_destructor(5,&yymsp[-1].minor); break; case 13: -#line 231 "./configparser.y" +#line 231 "../../src/configparser.y" { yygotominor.yy41 = yymsp[0].minor.yy41; yymsp[0].minor.yy41 = NULL; @@ -946,7 +946,7 @@ static void yy_reduce( #line 946 "configparser.c" break; case 14: -#line 236 "./configparser.y" +#line 236 "../../src/configparser.y" { yygotominor.yy41 = NULL; if (strncmp(yymsp[0].minor.yy43->ptr, "env.", sizeof("env.") - 1) == 0) { @@ -976,7 +976,7 @@ static void yy_reduce( #line 976 "configparser.c" break; case 15: -#line 263 "./configparser.y" +#line 263 "../../src/configparser.y" { yygotominor.yy41 = (data_unset *)data_string_init(); buffer_copy_string_buffer(((data_string *)(yygotominor.yy41))->value, yymsp[0].minor.yy0); @@ -986,7 +986,7 @@ static void yy_reduce( #line 986 "configparser.c" break; case 16: -#line 270 "./configparser.y" +#line 270 "../../src/configparser.y" { yygotominor.yy41 = (data_unset *)data_integer_init(); ((data_integer *)(yygotominor.yy41))->value = strtol(yymsp[0].minor.yy0->ptr, NULL, 10); @@ -996,7 +996,7 @@ static void yy_reduce( #line 996 "configparser.c" break; case 17: -#line 276 "./configparser.y" +#line 276 "../../src/configparser.y" { yygotominor.yy41 = (data_unset *)data_array_init(); array_free(((data_array *)(yygotominor.yy41))->value); @@ -1006,7 +1006,7 @@ static void yy_reduce( #line 1006 "configparser.c" break; case 18: -#line 282 "./configparser.y" +#line 282 "../../src/configparser.y" { yygotominor.yy40 = array_init(); } @@ -1015,7 +1015,7 @@ static void yy_reduce( yy_destructor(9,&yymsp[0].minor); break; case 19: -#line 285 "./configparser.y" +#line 285 "../../src/configparser.y" { yygotominor.yy40 = yymsp[-1].minor.yy40; yymsp[-1].minor.yy40 = NULL; @@ -1025,7 +1025,7 @@ static void yy_reduce( yy_destructor(9,&yymsp[0].minor); break; case 20: -#line 290 "./configparser.y" +#line 290 "../../src/configparser.y" { if (buffer_is_empty(yymsp[0].minor.yy41->key) || NULL == array_get_element(yymsp[-2].minor.yy40, yymsp[0].minor.yy41->key->ptr)) { @@ -1046,7 +1046,7 @@ static void yy_reduce( yy_destructor(10,&yymsp[-1].minor); break; case 21: -#line 307 "./configparser.y" +#line 307 "../../src/configparser.y" { yygotominor.yy40 = yymsp[-1].minor.yy40; yymsp[-1].minor.yy40 = NULL; @@ -1055,7 +1055,7 @@ static void yy_reduce( yy_destructor(10,&yymsp[0].minor); break; case 22: -#line 312 "./configparser.y" +#line 312 "../../src/configparser.y" { yygotominor.yy40 = array_init(); array_insert_unique(yygotominor.yy40, yymsp[0].minor.yy41); @@ -1064,7 +1064,7 @@ static void yy_reduce( #line 1064 "configparser.c" break; case 23: -#line 318 "./configparser.y" +#line 318 "../../src/configparser.y" { yygotominor.yy41 = yymsp[0].minor.yy41; yymsp[0].minor.yy41 = NULL; @@ -1072,7 +1072,7 @@ static void yy_reduce( #line 1072 "configparser.c" break; case 24: -#line 322 "./configparser.y" +#line 322 "../../src/configparser.y" { buffer_copy_string_buffer(yymsp[0].minor.yy41->key, yymsp[-2].minor.yy43); buffer_free(yymsp[-2].minor.yy43); @@ -1090,7 +1090,7 @@ static void yy_reduce( case 26: break; case 27: -#line 334 "./configparser.y" +#line 334 "../../src/configparser.y" { data_config *dc; dc = (data_config *)array_get_element(ctx->srv->config_context, "global"); @@ -1101,7 +1101,7 @@ static void yy_reduce( yy_destructor(12,&yymsp[0].minor); break; case 28: -#line 341 "./configparser.y" +#line 341 "../../src/configparser.y" { data_config *cur; @@ -1119,7 +1119,7 @@ static void yy_reduce( yy_destructor(14,&yymsp[0].minor); break; case 29: -#line 352 "./configparser.y" +#line 352 "../../src/configparser.y" { if (yymsp[-3].minor.yy78->context_ndx >= yymsp[0].minor.yy78->context_ndx) { fprintf(stderr, "unreachable else condition\n"); @@ -1136,7 +1136,7 @@ static void yy_reduce( yy_destructor(15,&yymsp[-1].minor); break; case 30: -#line 364 "./configparser.y" +#line 364 "../../src/configparser.y" { yygotominor.yy78 = yymsp[0].minor.yy78; yymsp[0].minor.yy78 = NULL; @@ -1144,7 +1144,7 @@ static void yy_reduce( #line 1144 "configparser.c" break; case 31: -#line 369 "./configparser.y" +#line 369 "../../src/configparser.y" { data_config *cur; @@ -1162,7 +1162,7 @@ static void yy_reduce( yy_destructor(14,&yymsp[0].minor); break; case 32: -#line 380 "./configparser.y" +#line 380 "../../src/configparser.y" { data_config *dc; buffer *b, *rvalue, *op; @@ -1318,7 +1318,7 @@ static void yy_reduce( yy_destructor(19,&yymsp[-2].minor); break; case 33: -#line 529 "./configparser.y" +#line 529 "../../src/configparser.y" { yygotominor.yy27 = CONFIG_COND_EQ; } @@ -1326,7 +1326,7 @@ static void yy_reduce( yy_destructor(20,&yymsp[0].minor); break; case 34: -#line 532 "./configparser.y" +#line 532 "../../src/configparser.y" { yygotominor.yy27 = CONFIG_COND_MATCH; } @@ -1334,7 +1334,7 @@ static void yy_reduce( yy_destructor(21,&yymsp[0].minor); break; case 35: -#line 535 "./configparser.y" +#line 535 "../../src/configparser.y" { yygotominor.yy27 = CONFIG_COND_NE; } @@ -1342,7 +1342,7 @@ static void yy_reduce( yy_destructor(22,&yymsp[0].minor); break; case 36: -#line 538 "./configparser.y" +#line 538 "../../src/configparser.y" { yygotominor.yy27 = CONFIG_COND_NOMATCH; } @@ -1350,7 +1350,7 @@ static void yy_reduce( yy_destructor(23,&yymsp[0].minor); break; case 37: -#line 542 "./configparser.y" +#line 542 "../../src/configparser.y" { yygotominor.yy43 = NULL; if (ctx->ok) { @@ -1370,7 +1370,7 @@ static void yy_reduce( #line 1370 "configparser.c" break; case 38: -#line 559 "./configparser.y" +#line 559 "../../src/configparser.y" { if (ctx->ok) { if (0 != config_parse_file(ctx->srv, ctx, yymsp[0].minor.yy43->ptr)) { @@ -1384,7 +1384,7 @@ static void yy_reduce( yy_destructor(24,&yymsp[-1].minor); break; case 39: -#line 569 "./configparser.y" +#line 569 "../../src/configparser.y" { if (ctx->ok) { if (0 != config_parse_cmd(ctx->srv, ctx, yymsp[0].minor.yy43->ptr)) { @@ -1424,7 +1424,7 @@ static void yy_parse_failed( while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); /* Here code is inserted which will be executed whenever the ** parser fails */ -#line 108 "./configparser.y" +#line 108 "../../src/configparser.y" ctx->ok = 0; diff --git a/src/mod_ssi_exprparser.c b/src/mod_ssi_exprparser.c index 36b0c74..6a0373d 100644 --- a/src/mod_ssi_exprparser.c +++ b/src/mod_ssi_exprparser.c @@ -4,7 +4,7 @@ /* First off, code is include which follows the "include" declaration ** in the input file. */ #include <stdio.h> -#line 6 "./mod_ssi_exprparser.y" +#line 6 "../../src/mod_ssi_exprparser.y" #include "mod_ssi_expr.h" #include "buffer.h" @@ -347,7 +347,7 @@ static void yy_destructor(YYCODETYPE yymajor, YYMINORTYPE *yypminor){ case 10: case 11: case 12: -#line 22 "./mod_ssi_exprparser.y" +#line 22 "../../src/mod_ssi_exprparser.y" { buffer_free((yypminor->yy0)); } #line 352 "mod_ssi_exprparser.c" break; @@ -578,7 +578,7 @@ static void yy_reduce( ** break; */ case 0: -#line 29 "./mod_ssi_exprparser.y" +#line 29 "../../src/mod_ssi_exprparser.y" { ctx->val.bo = ssi_val_tobool(yymsp[0].minor.yy29); ctx->val.type = SSI_TYPE_BOOL; @@ -588,7 +588,7 @@ static void yy_reduce( #line 588 "mod_ssi_exprparser.c" break; case 1: -#line 36 "./mod_ssi_exprparser.y" +#line 36 "../../src/mod_ssi_exprparser.y" { int cmp; @@ -617,14 +617,14 @@ static void yy_reduce( #line 617 "mod_ssi_exprparser.c" break; case 2: -#line 61 "./mod_ssi_exprparser.y" +#line 61 "../../src/mod_ssi_exprparser.y" { yygotominor.yy29 = yymsp[0].minor.yy29; } #line 624 "mod_ssi_exprparser.c" break; case 3: -#line 64 "./mod_ssi_exprparser.y" +#line 64 "../../src/mod_ssi_exprparser.y" { int e; @@ -639,7 +639,7 @@ static void yy_reduce( yy_destructor(1,&yymsp[-1].minor); break; case 4: -#line 75 "./mod_ssi_exprparser.y" +#line 75 "../../src/mod_ssi_exprparser.y" { int e; @@ -654,7 +654,7 @@ static void yy_reduce( yy_destructor(2,&yymsp[-1].minor); break; case 5: -#line 86 "./mod_ssi_exprparser.y" +#line 86 "../../src/mod_ssi_exprparser.y" { int e; @@ -668,7 +668,7 @@ static void yy_reduce( yy_destructor(9,&yymsp[-1].minor); break; case 6: -#line 95 "./mod_ssi_exprparser.y" +#line 95 "../../src/mod_ssi_exprparser.y" { yygotominor.yy29 = yymsp[-1].minor.yy29; } @@ -677,7 +677,7 @@ static void yy_reduce( yy_destructor(11,&yymsp[0].minor); break; case 7: -#line 99 "./mod_ssi_exprparser.y" +#line 99 "../../src/mod_ssi_exprparser.y" { yygotominor.yy29 = ssi_val_init(); yygotominor.yy29->str = yymsp[0].minor.yy19; @@ -686,14 +686,14 @@ static void yy_reduce( #line 686 "mod_ssi_exprparser.c" break; case 8: -#line 105 "./mod_ssi_exprparser.y" +#line 105 "../../src/mod_ssi_exprparser.y" { yygotominor.yy19 = yymsp[0].minor.yy0; } #line 693 "mod_ssi_exprparser.c" break; case 9: -#line 109 "./mod_ssi_exprparser.y" +#line 109 "../../src/mod_ssi_exprparser.y" { yygotominor.yy19 = yymsp[-1].minor.yy19; buffer_append_string_buffer(yygotominor.yy19, yymsp[0].minor.yy0); @@ -702,37 +702,37 @@ static void yy_reduce( #line 702 "mod_ssi_exprparser.c" break; case 10: -#line 115 "./mod_ssi_exprparser.y" +#line 115 "../../src/mod_ssi_exprparser.y" { yygotominor.yy8 = SSI_COND_EQ; } #line 707 "mod_ssi_exprparser.c" yy_destructor(3,&yymsp[0].minor); break; case 11: -#line 116 "./mod_ssi_exprparser.y" +#line 116 "../../src/mod_ssi_exprparser.y" { yygotominor.yy8 = SSI_COND_NE; } #line 713 "mod_ssi_exprparser.c" yy_destructor(4,&yymsp[0].minor); break; case 12: -#line 117 "./mod_ssi_exprparser.y" +#line 117 "../../src/mod_ssi_exprparser.y" { yygotominor.yy8 = SSI_COND_LE; } #line 719 "mod_ssi_exprparser.c" yy_destructor(8,&yymsp[0].minor); break; case 13: -#line 118 "./mod_ssi_exprparser.y" +#line 118 "../../src/mod_ssi_exprparser.y" { yygotominor.yy8 = SSI_COND_GE; } #line 725 "mod_ssi_exprparser.c" yy_destructor(6,&yymsp[0].minor); break; case 14: -#line 119 "./mod_ssi_exprparser.y" +#line 119 "../../src/mod_ssi_exprparser.y" { yygotominor.yy8 = SSI_COND_LT; } #line 731 "mod_ssi_exprparser.c" yy_destructor(7,&yymsp[0].minor); break; case 15: -#line 120 "./mod_ssi_exprparser.y" +#line 120 "../../src/mod_ssi_exprparser.y" { yygotominor.yy8 = SSI_COND_GT; } #line 737 "mod_ssi_exprparser.c" yy_destructor(5,&yymsp[0].minor); @@ -764,7 +764,7 @@ static void yy_parse_failed( while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); /* Here code is inserted which will be executed whenever the ** parser fails */ -#line 14 "./mod_ssi_exprparser.y" +#line 14 "../../src/mod_ssi_exprparser.y" ctx->ok = 0; diff --git a/tests/core-404-handler.t b/tests/core-404-handler.t index 599ade2..599ade2 100644..100755 --- a/tests/core-404-handler.t +++ b/tests/core-404-handler.t diff --git a/tests/symlink.t b/tests/symlink.t index 9b275bd..9b275bd 100644..100755 --- a/tests/symlink.t +++ b/tests/symlink.t |