Sync from SUSE:SLFO:Main apache2 revision addbe510a07221a22827f860a472748a
This commit is contained in:
parent
80a23ce35f
commit
e467032439
74
apache2-CVE-2023-38709.patch
Normal file
74
apache2-CVE-2023-38709.patch
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
Index: httpd-2.4.58/modules/http/http_filters.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/http/http_filters.c
|
||||||
|
+++ httpd-2.4.58/modules/http/http_filters.c
|
||||||
|
@@ -1353,6 +1353,9 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
|
||||||
|
*/
|
||||||
|
apr_table_clear(r->headers_out);
|
||||||
|
apr_table_clear(r->err_headers_out);
|
||||||
|
+ r->content_type = r->content_encoding = NULL;
|
||||||
|
+ r->content_languages = NULL;
|
||||||
|
+ r->clength = r->chunked = 0;
|
||||||
|
apr_brigade_cleanup(b);
|
||||||
|
|
||||||
|
/* Don't recall ap_die() if we come back here (from its own internal
|
||||||
|
@@ -1369,8 +1372,6 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
|
||||||
|
APR_BRIGADE_INSERT_TAIL(b, e);
|
||||||
|
e = apr_bucket_eos_create(c->bucket_alloc);
|
||||||
|
APR_BRIGADE_INSERT_TAIL(b, e);
|
||||||
|
- r->content_type = r->content_encoding = NULL;
|
||||||
|
- r->content_languages = NULL;
|
||||||
|
ap_set_content_length(r, 0);
|
||||||
|
recursive_error = 1;
|
||||||
|
}
|
||||||
|
@@ -1397,6 +1398,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
|
||||||
|
if (!apr_is_empty_table(r->err_headers_out)) {
|
||||||
|
r->headers_out = apr_table_overlay(r->pool, r->err_headers_out,
|
||||||
|
r->headers_out);
|
||||||
|
+ apr_table_clear(r->err_headers_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1416,6 +1418,17 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
|
||||||
|
fixup_vary(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Control cachability for non-cacheable responses if not already set by
|
||||||
|
+ * some other part of the server configuration.
|
||||||
|
+ */
|
||||||
|
+ if (r->no_cache && !apr_table_get(r->headers_out, "Expires")) {
|
||||||
|
+ char *date = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
|
||||||
|
+ ap_recent_rfc822_date(date, r->request_time);
|
||||||
|
+ apr_table_addn(r->headers_out, "Expires", date);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Now remove any ETag response header field if earlier processing
|
||||||
|
* says so (such as a 'FileETag None' directive).
|
||||||
|
@@ -1428,6 +1441,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
|
||||||
|
basic_http_header_check(r, &protocol);
|
||||||
|
ap_set_keepalive(r);
|
||||||
|
|
||||||
|
+ /* 204/304 responses don't have content related headers */
|
||||||
|
if (AP_STATUS_IS_HEADER_ONLY(r->status)) {
|
||||||
|
apr_table_unset(r->headers_out, "Transfer-Encoding");
|
||||||
|
apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
@@ -1470,16 +1484,6 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_
|
||||||
|
apr_table_setn(r->headers_out, "Content-Language", field);
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * Control cachability for non-cacheable responses if not already set by
|
||||||
|
- * some other part of the server configuration.
|
||||||
|
- */
|
||||||
|
- if (r->no_cache && !apr_table_get(r->headers_out, "Expires")) {
|
||||||
|
- char *date = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
|
||||||
|
- ap_recent_rfc822_date(date, r->request_time);
|
||||||
|
- apr_table_addn(r->headers_out, "Expires", date);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* This is a hack, but I can't find anyway around it. The idea is that
|
||||||
|
* we don't want to send out 0 Content-Lengths if it is a head request.
|
||||||
|
* This happens when modules try to outsmart the server, and return
|
191
apache2-CVE-2024-24795.patch
Normal file
191
apache2-CVE-2024-24795.patch
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
Index: httpd-2.4.58/include/util_script.h
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/include/util_script.h
|
||||||
|
+++ httpd-2.4.58/include/util_script.h
|
||||||
|
@@ -225,6 +225,8 @@ AP_DECLARE(int) ap_scan_script_header_er
|
||||||
|
*/
|
||||||
|
AP_DECLARE(void) ap_args_to_table(request_rec *r, apr_table_t **table);
|
||||||
|
|
||||||
|
+#define AP_TRUST_CGILIKE_CL_ENVVAR "ap_trust_cgilike_cl"
|
||||||
|
+
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Index: httpd-2.4.58/modules/aaa/mod_authnz_fcgi.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/aaa/mod_authnz_fcgi.c
|
||||||
|
+++ httpd-2.4.58/modules/aaa/mod_authnz_fcgi.c
|
||||||
|
@@ -571,6 +571,14 @@ static apr_status_t handle_response(cons
|
||||||
|
"parsing -> %d/%d",
|
||||||
|
fn, status, r->status);
|
||||||
|
|
||||||
|
+ /* FCGI has its own body framing mechanism which we don't
|
||||||
|
+ * match against any provided Content-Length, so let the
|
||||||
|
+ * core determine C-L vs T-E based on what's actually sent.
|
||||||
|
+ */
|
||||||
|
+ if (!apr_table_get(r->subprocess_env, AP_TRUST_CGILIKE_CL_ENVVAR))
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ apr_table_unset(r->headers_out, "Transfer-Encoding");
|
||||||
|
+
|
||||||
|
if (rspbuf) { /* caller wants to see response body,
|
||||||
|
* if any
|
||||||
|
*/
|
||||||
|
Index: httpd-2.4.58/modules/generators/mod_cgi.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/generators/mod_cgi.c
|
||||||
|
+++ httpd-2.4.58/modules/generators/mod_cgi.c
|
||||||
|
@@ -935,9 +935,18 @@ static int cgi_handler(request_rec *r)
|
||||||
|
char sbuf[MAX_STRING_LEN];
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- if ((ret = ap_scan_script_header_err_brigade_ex(r, bb, sbuf,
|
||||||
|
- APLOG_MODULE_INDEX)))
|
||||||
|
- {
|
||||||
|
+ ret = ap_scan_script_header_err_brigade_ex(r, bb, sbuf,
|
||||||
|
+ APLOG_MODULE_INDEX);
|
||||||
|
+
|
||||||
|
+ /* xCGI has its own body framing mechanism which we don't
|
||||||
|
+ * match against any provided Content-Length, so let the
|
||||||
|
+ * core determine C-L vs T-E based on what's actually sent.
|
||||||
|
+ */
|
||||||
|
+ if (!apr_table_get(r->subprocess_env, AP_TRUST_CGILIKE_CL_ENVVAR))
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ apr_table_unset(r->headers_out, "Transfer-Encoding");
|
||||||
|
+
|
||||||
|
+ if (ret != OK) {
|
||||||
|
ret = log_script(r, conf, ret, dbuf, sbuf, bb, script_err);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Index: httpd-2.4.58/modules/generators/mod_cgid.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/generators/mod_cgid.c
|
||||||
|
+++ httpd-2.4.58/modules/generators/mod_cgid.c
|
||||||
|
@@ -1616,9 +1616,18 @@ static int cgid_handler(request_rec *r)
|
||||||
|
b = apr_bucket_eos_create(c->bucket_alloc);
|
||||||
|
APR_BRIGADE_INSERT_TAIL(bb, b);
|
||||||
|
|
||||||
|
- if ((ret = ap_scan_script_header_err_brigade_ex(r, bb, sbuf,
|
||||||
|
- APLOG_MODULE_INDEX)))
|
||||||
|
- {
|
||||||
|
+ ret = ap_scan_script_header_err_brigade_ex(r, bb, sbuf,
|
||||||
|
+ APLOG_MODULE_INDEX);
|
||||||
|
+
|
||||||
|
+ /* xCGI has its own body framing mechanism which we don't
|
||||||
|
+ * match against any provided Content-Length, so let the
|
||||||
|
+ * core determine C-L vs T-E based on what's actually sent.
|
||||||
|
+ */
|
||||||
|
+ if (!apr_table_get(r->subprocess_env, AP_TRUST_CGILIKE_CL_ENVVAR))
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ apr_table_unset(r->headers_out, "Transfer-Encoding");
|
||||||
|
+
|
||||||
|
+ if (ret != OK) {
|
||||||
|
ret = log_script(r, conf, ret, dbuf, sbuf, bb, NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Index: httpd-2.4.58/modules/proxy/ajp_header.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/proxy/ajp_header.c
|
||||||
|
+++ httpd-2.4.58/modules/proxy/ajp_header.c
|
||||||
|
@@ -17,6 +17,8 @@
|
||||||
|
#include "ajp_header.h"
|
||||||
|
#include "ajp.h"
|
||||||
|
|
||||||
|
+#include "util_script.h"
|
||||||
|
+
|
||||||
|
APLOG_USE_MODULE(proxy_ajp);
|
||||||
|
|
||||||
|
static const char *response_trans_headers[] = {
|
||||||
|
@@ -669,6 +671,14 @@ static apr_status_t ajp_unmarshal_respon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* AJP has its own body framing mechanism which we don't
|
||||||
|
+ * match against any provided Content-Length, so let the
|
||||||
|
+ * core determine C-L vs T-E based on what's actually sent.
|
||||||
|
+ */
|
||||||
|
+ if (!apr_table_get(r->subprocess_env, AP_TRUST_CGILIKE_CL_ENVVAR))
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ apr_table_unset(r->headers_out, "Transfer-Encoding");
|
||||||
|
+
|
||||||
|
return APR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Index: httpd-2.4.58/modules/proxy/mod_proxy_fcgi.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/proxy/mod_proxy_fcgi.c
|
||||||
|
+++ httpd-2.4.58/modules/proxy/mod_proxy_fcgi.c
|
||||||
|
@@ -779,6 +779,15 @@ recv_again:
|
||||||
|
|
||||||
|
status = ap_scan_script_header_err_brigade_ex(r, ob,
|
||||||
|
NULL, APLOG_MODULE_INDEX);
|
||||||
|
+
|
||||||
|
+ /* FCGI has its own body framing mechanism which we don't
|
||||||
|
+ * match against any provided Content-Length, so let the
|
||||||
|
+ * core determine C-L vs T-E based on what's actually sent.
|
||||||
|
+ */
|
||||||
|
+ if (!apr_table_get(r->subprocess_env, AP_TRUST_CGILIKE_CL_ENVVAR))
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ apr_table_unset(r->headers_out, "Transfer-Encoding");
|
||||||
|
+
|
||||||
|
/* suck in all the rest */
|
||||||
|
if (status != OK) {
|
||||||
|
apr_bucket *tmp_b;
|
||||||
|
Index: httpd-2.4.58/modules/proxy/mod_proxy_scgi.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/proxy/mod_proxy_scgi.c
|
||||||
|
+++ httpd-2.4.58/modules/proxy/mod_proxy_scgi.c
|
||||||
|
@@ -390,6 +390,14 @@ static int pass_response(request_rec *r,
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* SCGI has its own body framing mechanism which we don't
|
||||||
|
+ * match against any provided Content-Length, so let the
|
||||||
|
+ * core determine C-L vs T-E based on what's actually sent.
|
||||||
|
+ */
|
||||||
|
+ if (!apr_table_get(r->subprocess_env, AP_TRUST_CGILIKE_CL_ENVVAR))
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ apr_table_unset(r->headers_out, "Transfer-Encoding");
|
||||||
|
+
|
||||||
|
conf = ap_get_module_config(r->per_dir_config, &proxy_scgi_module);
|
||||||
|
if (conf->sendfile && conf->sendfile != scgi_sendfile_off) {
|
||||||
|
short err = 1;
|
||||||
|
Index: httpd-2.4.58/modules/proxy/mod_proxy_uwsgi.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/proxy/mod_proxy_uwsgi.c
|
||||||
|
+++ httpd-2.4.58/modules/proxy/mod_proxy_uwsgi.c
|
||||||
|
@@ -404,6 +404,12 @@ static int uwsgi_response(request_rec *r
|
||||||
|
return HTTP_BAD_GATEWAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* T-E wins over C-L */
|
||||||
|
+ if (apr_table_get(r->headers_out, "Transfer-Encoding")) {
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ backend->close = 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if ((buf = apr_table_get(r->headers_out, "Content-Type"))) {
|
||||||
|
ap_set_content_type(r, apr_pstrdup(r->pool, buf));
|
||||||
|
}
|
||||||
|
Index: httpd-2.4.58/modules/http/http_filters.c
|
||||||
|
===================================================================
|
||||||
|
--- httpd-2.4.58.orig/modules/http/http_filters.c
|
||||||
|
+++ httpd-2.4.58/modules/http/http_filters.c
|
||||||
|
@@ -778,6 +778,18 @@ static APR_INLINE int check_headers(requ
|
||||||
|
struct check_header_ctx ctx;
|
||||||
|
core_server_config *conf =
|
||||||
|
ap_get_core_module_config(r->server->module_config);
|
||||||
|
+ const char *val;
|
||||||
|
+
|
||||||
|
+ if ((val = apr_table_get(r->headers_out, "Transfer-Encoding"))) {
|
||||||
|
+ if (apr_table_get(r->headers_out, "Content-Length")) {
|
||||||
|
+ apr_table_unset(r->headers_out, "Content-Length");
|
||||||
|
+ r->connection->keepalive = AP_CONN_CLOSE;
|
||||||
|
+ }
|
||||||
|
+ if (!ap_is_chunked(r->pool, val)) {
|
||||||
|
+ r->connection->keepalive = AP_CONN_CLOSE;
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ctx.r = r;
|
||||||
|
ctx.strict = (conf->http_conformance != AP_HTTP_CONFORMANCE_UNSAFE);
|
45
apache2-CVE-2024-27316.patch
Normal file
45
apache2-CVE-2024-27316.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
Index: modules/http2/h2_session.c
|
||||||
|
===================================================================
|
||||||
|
--- a/modules/http2/h2_session.c (revision 1916778)
|
||||||
|
+++ b/modules/http2/h2_session.c (revision 1916779)
|
||||||
|
@@ -319,9 +319,13 @@
|
||||||
|
|
||||||
|
status = h2_stream_add_header(stream, (const char *)name, namelen,
|
||||||
|
(const char *)value, valuelen);
|
||||||
|
- if (status != APR_SUCCESS
|
||||||
|
- && (!stream->rtmp
|
||||||
|
- || stream->rtmp->http_status == H2_HTTP_STATUS_UNSET)) {
|
||||||
|
+ if (status != APR_SUCCESS &&
|
||||||
|
+ (!stream->rtmp ||
|
||||||
|
+ stream->rtmp->http_status == H2_HTTP_STATUS_UNSET ||
|
||||||
|
+ /* We accept a certain amount of failures in order to reply
|
||||||
|
+ * with an informative HTTP error response like 413. But if the
|
||||||
|
+ * client is too wrong, we fail the request a RESET of the stream */
|
||||||
|
+ stream->request_headers_failed > 100)) {
|
||||||
|
return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
Index: modules/http2/h2_stream.c
|
||||||
|
===================================================================
|
||||||
|
--- a/modules/http2/h2_stream.c (revision 1916778)
|
||||||
|
+++ b/modules/http2/h2_stream.c (revision 1916779)
|
||||||
|
@@ -813,6 +813,7 @@
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (error) {
|
||||||
|
+ ++stream->request_headers_failed;
|
||||||
|
set_error_response(stream, error);
|
||||||
|
return APR_EINVAL;
|
||||||
|
}
|
||||||
|
Index: modules/http2/h2_stream.h
|
||||||
|
===================================================================
|
||||||
|
--- a/modules/http2/h2_stream.h (revision 1916778)
|
||||||
|
+++ b/modules/http2/h2_stream.h (revision 1916779)
|
||||||
|
@@ -91,6 +91,7 @@
|
||||||
|
struct h2_request *rtmp; /* request being assembled */
|
||||||
|
apr_table_t *trailers_in; /* optional, incoming trailers */
|
||||||
|
int request_headers_added; /* number of request headers added */
|
||||||
|
+ int request_headers_failed; /* number of request headers failed to add */
|
||||||
|
|
||||||
|
#if AP_HAS_RESPONSE_BUCKETS
|
||||||
|
ap_bucket_response *response; /* the final, non-interim response or NULL */
|
@ -1,3 +1,15 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Apr 30 13:44:03 UTC 2024 - pgajdos@suse.com
|
||||||
|
|
||||||
|
- security update
|
||||||
|
- added patches
|
||||||
|
fix CVE-2023-38709 [bsc#1222330], HTTP response splitting
|
||||||
|
+ apache2-CVE-2023-38709.patch
|
||||||
|
fix CVE-2024-24795 [bsc#1222332], HTTP Response Splitting in multiple modules
|
||||||
|
+ apache2-CVE-2024-24795.patch
|
||||||
|
fix CVE-2024-27316 [bsc#1221401], HTTP/2 CONTINUATION frames can be utilized for DoS attacks
|
||||||
|
+ apache2-CVE-2024-27316.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Oct 19 14:23:08 UTC 2023 - David Anes <david.anes@suse.com>
|
Thu Oct 19 14:23:08 UTC 2023 - David Anes <david.anes@suse.com>
|
||||||
|
|
||||||
|
@ -190,6 +190,12 @@ Patch100: apache-test-application-xml-type.patch
|
|||||||
# even if in live system I do not experience this inconsistency, let's turn off
|
# even if in live system I do not experience this inconsistency, let's turn off
|
||||||
# these variables from the test
|
# these variables from the test
|
||||||
Patch101: apache-test-turn-off-variables-in-ssl-var-lookup.patch
|
Patch101: apache-test-turn-off-variables-in-ssl-var-lookup.patch
|
||||||
|
# CVE-2023-38709 [bsc#1222330], HTTP response splitting
|
||||||
|
Patch102: apache2-CVE-2023-38709.patch
|
||||||
|
# CVE-2024-27316 [bsc#1221401], HTTP/2 CONTINUATION frames can be utilized for DoS attacks
|
||||||
|
Patch103: apache2-CVE-2024-27316.patch
|
||||||
|
# CVE-2024-24795 [bsc#1222332], HTTP Response Splitting in multiple modules
|
||||||
|
Patch104: apache2-CVE-2024-24795.patch
|
||||||
BuildRequires: apache-rpm-macros-control
|
BuildRequires: apache-rpm-macros-control
|
||||||
#Since 2.4.7 the event MPM requires apr 1.5.0 or later.
|
#Since 2.4.7 the event MPM requires apr 1.5.0 or later.
|
||||||
BuildRequires: apr-devel >= 1.5.0
|
BuildRequires: apr-devel >= 1.5.0
|
||||||
@ -320,6 +326,9 @@ provides HTTP services in sync with the current HTTP standards.
|
|||||||
%patch4 -p1
|
%patch4 -p1
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
%patch101 -p1
|
%patch101 -p1
|
||||||
|
%patch102 -p1
|
||||||
|
%patch103 -p1
|
||||||
|
%patch104 -p1
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUILD
|
# BUILD
|
||||||
|
Loading…
Reference in New Issue
Block a user