!97 fix CVE2022-29404, CVE2022-30556
From: @JerrfyChern Reviewed-by: @zengwefeng Signed-off-by: @zengwefeng
This commit is contained in:
commit
b2d06d4f2d
51
backport-CVE-2022-29404.patch
Normal file
51
backport-CVE-2022-29404.patch
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
From 92499e20034485c5e2d29cb85940e309573d976e Mon Sep 17 00:00:00 2001
|
||||||
|
From: covener <covener@apache.org>
|
||||||
|
Date: Wed Jun 1 12:30:46 2022 UTC
|
||||||
|
Subject: [PATCH] use a liberal default limit for LimitRequestBody of 1GB
|
||||||
|
|
||||||
|
---
|
||||||
|
modules/http/http_filters.c | 7 +++++++
|
||||||
|
server/core.c | 2 +-
|
||||||
|
2 files changed, 8 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c
|
||||||
|
index 325cf53..f25d6f0 100644
|
||||||
|
--- a/modules/http/http_filters.c
|
||||||
|
+++ b/modules/http/http_filters.c
|
||||||
|
@@ -1717,6 +1717,7 @@ AP_DECLARE(int) ap_setup_client_block(request_rec *r, int read_policy)
|
||||||
|
{
|
||||||
|
const char *tenc = apr_table_get(r->headers_in, "Transfer-Encoding");
|
||||||
|
const char *lenp = apr_table_get(r->headers_in, "Content-Length");
|
||||||
|
+ apr_off_t limit_req_body = ap_get_limit_req_body(r);
|
||||||
|
|
||||||
|
r->read_body = read_policy;
|
||||||
|
r->read_chunked = 0;
|
||||||
|
@@ -1755,6 +1756,12 @@ AP_DECLARE(int) ap_setup_client_block(request_rec *r, int read_policy)
|
||||||
|
return HTTP_REQUEST_ENTITY_TOO_LARGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (limit_req_body > 0 && (r->remaining > limit_req_body)) {
|
||||||
|
+ /* will be logged when the body is discarded */
|
||||||
|
+ return HTTP_REQUEST_ENTITY_TOO_LARGE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+
|
||||||
|
#ifdef AP_DEBUG
|
||||||
|
{
|
||||||
|
/* Make sure ap_getline() didn't leave any droppings. */
|
||||||
|
diff --git a/server/core.c b/server/core.c
|
||||||
|
index 720b9a5..4e7acc8 100644
|
||||||
|
--- a/server/core.c
|
||||||
|
+++ b/server/core.c
|
||||||
|
@@ -65,7 +65,7 @@
|
||||||
|
|
||||||
|
/* LimitRequestBody handling */
|
||||||
|
#define AP_LIMIT_REQ_BODY_UNSET ((apr_off_t) -1)
|
||||||
|
-#define AP_DEFAULT_LIMIT_REQ_BODY ((apr_off_t) 0)
|
||||||
|
+#define AP_DEFAULT_LIMIT_REQ_BODY ((apr_off_t) 1<<30)
|
||||||
|
|
||||||
|
/* LimitXMLRequestBody handling */
|
||||||
|
#define AP_LIMIT_UNSET ((long) -1)
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
243
backport-CVE-2022-30556.patch
Normal file
243
backport-CVE-2022-30556.patch
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
From 11a3fcbf9e64239d8fe8402d941bbdcbc4532c88 Mon Sep 17 00:00:00 2001
|
||||||
|
From: covener <covener@apache.org>
|
||||||
|
Date: Wed Jun 1 12:36:13 2022 UTC
|
||||||
|
Subject: [PATCH] use filters consistently
|
||||||
|
|
||||||
|
---
|
||||||
|
modules/lua/lua_request.c | 141 +++++++++++++++++-----------------------------
|
||||||
|
1 file changed, 51 insertions(+), 90 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/modules/lua/lua_request.c b/modules/lua/lua_request.c
|
||||||
|
index a3e3b61..be0f5b7 100644
|
||||||
|
--- a/modules/lua/lua_request.c
|
||||||
|
+++ b/modules/lua/lua_request.c
|
||||||
|
@@ -2227,23 +2227,20 @@ static int lua_websocket_greet(lua_State *L)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static apr_status_t lua_websocket_readbytes(conn_rec* c, char* buffer,
|
||||||
|
- apr_off_t len)
|
||||||
|
+static apr_status_t lua_websocket_readbytes(conn_rec* c,
|
||||||
|
+ apr_bucket_brigade *brigade,
|
||||||
|
+ char* buffer, apr_off_t len)
|
||||||
|
{
|
||||||
|
- apr_bucket_brigade *brigade = apr_brigade_create(c->pool, c->bucket_alloc);
|
||||||
|
+ apr_size_t delivered;
|
||||||
|
apr_status_t rv;
|
||||||
|
+
|
||||||
|
rv = ap_get_brigade(c->input_filters, brigade, AP_MODE_READBYTES,
|
||||||
|
APR_BLOCK_READ, len);
|
||||||
|
if (rv == APR_SUCCESS) {
|
||||||
|
- if (!APR_BRIGADE_EMPTY(brigade)) {
|
||||||
|
- apr_bucket* bucket = APR_BRIGADE_FIRST(brigade);
|
||||||
|
- const char* data = NULL;
|
||||||
|
- apr_size_t data_length = 0;
|
||||||
|
- rv = apr_bucket_read(bucket, &data, &data_length, APR_BLOCK_READ);
|
||||||
|
- if (rv == APR_SUCCESS) {
|
||||||
|
- memcpy(buffer, data, len);
|
||||||
|
- }
|
||||||
|
- apr_bucket_delete(bucket);
|
||||||
|
+ delivered = len;
|
||||||
|
+ rv = apr_brigade_flatten(brigade, buffer, &delivered);
|
||||||
|
+ if ((rv == APR_SUCCESS) && (delivered < len)) {
|
||||||
|
+ rv = APR_INCOMPLETE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apr_brigade_cleanup(brigade);
|
||||||
|
@@ -2273,35 +2270,28 @@ static int lua_websocket_peek(lua_State *L)
|
||||||
|
|
||||||
|
static int lua_websocket_read(lua_State *L)
|
||||||
|
{
|
||||||
|
- apr_socket_t *sock;
|
||||||
|
apr_status_t rv;
|
||||||
|
int do_read = 1;
|
||||||
|
int n = 0;
|
||||||
|
- apr_size_t len = 1;
|
||||||
|
apr_size_t plen = 0;
|
||||||
|
unsigned short payload_short = 0;
|
||||||
|
apr_uint64_t payload_long = 0;
|
||||||
|
unsigned char *mask_bytes;
|
||||||
|
char byte;
|
||||||
|
- int plaintext;
|
||||||
|
-
|
||||||
|
+ apr_bucket_brigade *brigade;
|
||||||
|
+ conn_rec* c;
|
||||||
|
|
||||||
|
request_rec *r = ap_lua_check_request_rec(L, 1);
|
||||||
|
- plaintext = ap_lua_ssl_is_https(r->connection) ? 0 : 1;
|
||||||
|
-
|
||||||
|
+ c = r->connection;
|
||||||
|
|
||||||
|
mask_bytes = apr_pcalloc(r->pool, 4);
|
||||||
|
- sock = ap_get_conn_socket(r->connection);
|
||||||
|
+
|
||||||
|
+ brigade = apr_brigade_create(r->pool, c->bucket_alloc);
|
||||||
|
|
||||||
|
while (do_read) {
|
||||||
|
do_read = 0;
|
||||||
|
/* Get opcode and FIN bit */
|
||||||
|
- if (plaintext) {
|
||||||
|
- rv = apr_socket_recv(sock, &byte, &len);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- rv = lua_websocket_readbytes(r->connection, &byte, 1);
|
||||||
|
- }
|
||||||
|
+ rv = lua_websocket_readbytes(c, brigade, &byte, 1);
|
||||||
|
if (rv == APR_SUCCESS) {
|
||||||
|
unsigned char ubyte, fin, opcode, mask, payload;
|
||||||
|
ubyte = (unsigned char)byte;
|
||||||
|
@@ -2311,12 +2301,7 @@ static int lua_websocket_read(lua_State *L)
|
||||||
|
opcode = ubyte & 0xf;
|
||||||
|
|
||||||
|
/* Get the payload length and mask bit */
|
||||||
|
- if (plaintext) {
|
||||||
|
- rv = apr_socket_recv(sock, &byte, &len);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- rv = lua_websocket_readbytes(r->connection, &byte, 1);
|
||||||
|
- }
|
||||||
|
+ rv = lua_websocket_readbytes(c, brigade, &byte, 1);
|
||||||
|
if (rv == APR_SUCCESS) {
|
||||||
|
ubyte = (unsigned char)byte;
|
||||||
|
/* Mask is the first bit */
|
||||||
|
@@ -2327,40 +2312,25 @@ static int lua_websocket_read(lua_State *L)
|
||||||
|
|
||||||
|
/* Extended payload? */
|
||||||
|
if (payload == 126) {
|
||||||
|
- len = 2;
|
||||||
|
- if (plaintext) {
|
||||||
|
- /* XXX: apr_socket_recv does not receive len bits, only up to len bits! */
|
||||||
|
- rv = apr_socket_recv(sock, (char*) &payload_short, &len);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- rv = lua_websocket_readbytes(r->connection,
|
||||||
|
- (char*) &payload_short, 2);
|
||||||
|
- }
|
||||||
|
- payload_short = ntohs(payload_short);
|
||||||
|
+ rv = lua_websocket_readbytes(c, brigade,
|
||||||
|
+ (char*) &payload_short, 2);
|
||||||
|
|
||||||
|
- if (rv == APR_SUCCESS) {
|
||||||
|
- plen = payload_short;
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
+ if (rv != APR_SUCCESS) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ plen = ntohs(payload_short);
|
||||||
|
}
|
||||||
|
/* Super duper extended payload? */
|
||||||
|
if (payload == 127) {
|
||||||
|
- len = 8;
|
||||||
|
- if (plaintext) {
|
||||||
|
- rv = apr_socket_recv(sock, (char*) &payload_long, &len);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- rv = lua_websocket_readbytes(r->connection,
|
||||||
|
- (char*) &payload_long, 8);
|
||||||
|
- }
|
||||||
|
- if (rv == APR_SUCCESS) {
|
||||||
|
- plen = ap_ntoh64(&payload_long);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
+ rv = lua_websocket_readbytes(c, brigade,
|
||||||
|
+ (char*) &payload_long, 8);
|
||||||
|
+
|
||||||
|
+ if (rv != APR_SUCCESS) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ plen = ap_ntoh64(&payload_long);
|
||||||
|
}
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(03210)
|
||||||
|
"Websocket: Reading %" APR_SIZE_T_FMT " (%s) bytes, masking is %s. %s",
|
||||||
|
@@ -2369,46 +2339,26 @@ static int lua_websocket_read(lua_State *L)
|
||||||
|
mask ? "on" : "off",
|
||||||
|
fin ? "This is a final frame" : "more to follow");
|
||||||
|
if (mask) {
|
||||||
|
- len = 4;
|
||||||
|
- if (plaintext) {
|
||||||
|
- rv = apr_socket_recv(sock, (char*) mask_bytes, &len);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- rv = lua_websocket_readbytes(r->connection,
|
||||||
|
- (char*) mask_bytes, 4);
|
||||||
|
- }
|
||||||
|
+ rv = lua_websocket_readbytes(c, brigade,
|
||||||
|
+ (char*) mask_bytes, 4);
|
||||||
|
+
|
||||||
|
if (rv != APR_SUCCESS) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (plen < (HUGE_STRING_LEN*1024) && plen > 0) {
|
||||||
|
apr_size_t remaining = plen;
|
||||||
|
- apr_size_t received;
|
||||||
|
- apr_off_t at = 0;
|
||||||
|
char *buffer = apr_palloc(r->pool, plen+1);
|
||||||
|
buffer[plen] = 0;
|
||||||
|
|
||||||
|
- if (plaintext) {
|
||||||
|
- while (remaining > 0) {
|
||||||
|
- received = remaining;
|
||||||
|
- rv = apr_socket_recv(sock, buffer+at, &received);
|
||||||
|
- if (received > 0 ) {
|
||||||
|
- remaining -= received;
|
||||||
|
- at += received;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r,
|
||||||
|
- "Websocket: Frame contained %" APR_OFF_T_FMT " bytes, pushed to Lua stack",
|
||||||
|
- at);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- rv = lua_websocket_readbytes(r->connection, buffer,
|
||||||
|
- remaining);
|
||||||
|
- ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r,
|
||||||
|
- "Websocket: SSL Frame contained %" APR_SIZE_T_FMT " bytes, "\
|
||||||
|
- "pushed to Lua stack",
|
||||||
|
- remaining);
|
||||||
|
+ rv = lua_websocket_readbytes(c, brigade, buffer, remaining);
|
||||||
|
+ if (rv != APR_SUCCESS) {
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r,
|
||||||
|
+ "Websocket: Frame contained %" APR_SIZE_T_FMT \
|
||||||
|
+ " bytes, pushed to Lua stack", remaining);
|
||||||
|
if (mask) {
|
||||||
|
for (n = 0; n < plen; n++) {
|
||||||
|
buffer[n] ^= mask_bytes[n%4];
|
||||||
|
@@ -2420,14 +2370,25 @@ static int lua_websocket_read(lua_State *L)
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
/* Decide if we need to react to the opcode or not */
|
||||||
|
if (opcode == 0x09) { /* ping */
|
||||||
|
char frame[2];
|
||||||
|
- plen = 2;
|
||||||
|
+ apr_bucket *b;
|
||||||
|
+
|
||||||
|
frame[0] = 0x8A;
|
||||||
|
frame[1] = 0;
|
||||||
|
- apr_socket_send(sock, frame, &plen); /* Pong! */
|
||||||
|
+
|
||||||
|
+ /* Pong! */
|
||||||
|
+ b = apr_bucket_transient_create(frame, 2, c->bucket_alloc);
|
||||||
|
+ APR_BRIGADE_INSERT_TAIL(brigade, b);
|
||||||
|
+
|
||||||
|
+ rv = ap_pass_brigade(c->output_filters, brigade);
|
||||||
|
+ apr_brigade_cleanup(brigade);
|
||||||
|
+
|
||||||
|
+ if (rv != APR_SUCCESS) {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
do_read = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
10
httpd.spec
10
httpd.spec
@ -8,7 +8,7 @@
|
|||||||
Name: httpd
|
Name: httpd
|
||||||
Summary: Apache HTTP Server
|
Summary: Apache HTTP Server
|
||||||
Version: 2.4.43
|
Version: 2.4.43
|
||||||
Release: 14
|
Release: 15
|
||||||
License: ASL 2.0
|
License: ASL 2.0
|
||||||
URL: https://httpd.apache.org/
|
URL: https://httpd.apache.org/
|
||||||
Source0: https://archive.apache.org/dist/httpd/httpd-%{version}.tar.bz2
|
Source0: https://archive.apache.org/dist/httpd/httpd-%{version}.tar.bz2
|
||||||
@ -92,6 +92,8 @@ Patch38: backport-CVE-2022-22720.patch
|
|||||||
Patch39: backport-CVE-2022-22721.patch
|
Patch39: backport-CVE-2022-22721.patch
|
||||||
Patch40: backport-001-CVE-2022-23934.patch
|
Patch40: backport-001-CVE-2022-23934.patch
|
||||||
Patch41: backport-002-CVE-2022-23934.patch
|
Patch41: backport-002-CVE-2022-23934.patch
|
||||||
|
Patch42: backport-CVE-2022-29404.patch
|
||||||
|
Patch43: backport-CVE-2022-30556.patch
|
||||||
|
|
||||||
BuildRequires: gcc autoconf pkgconfig findutils xmlto perl-interpreter perl-generators systemd-devel
|
BuildRequires: gcc autoconf pkgconfig findutils xmlto perl-interpreter perl-generators systemd-devel
|
||||||
BuildRequires: zlib-devel libselinux-devel lua-devel brotli-devel
|
BuildRequires: zlib-devel libselinux-devel lua-devel brotli-devel
|
||||||
@ -528,6 +530,12 @@ exit $rv
|
|||||||
%{_rpmconfigdir}/macros.d/macros.httpd
|
%{_rpmconfigdir}/macros.d/macros.httpd
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jun 20 2022 chenzhitao <chenzhitao8@huawei.com> - 2.4.43-15
|
||||||
|
- Type:CVE
|
||||||
|
- ID:NA
|
||||||
|
- SUG:restart
|
||||||
|
- DESC:fix CVE2022-29404, CVE2022-30556
|
||||||
|
|
||||||
* Thu Mar 17 2022 gaihuiying <eaglegai@163.com> - 2.4.43-14
|
* Thu Mar 17 2022 gaihuiying <eaglegai@163.com> - 2.4.43-14
|
||||||
- Type:cves
|
- Type:cves
|
||||||
- ID:NA
|
- ID:NA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user