Package: release.debian.org Severity: normal Tags: trixie X-Debbugs-Cc: [email protected] Control: affects -1 + src:goaccess User: [email protected] Usertags: pu
[ Reason ] This update includes 3 upstream patches fixing 3 CVEs published for goaccess. [ Impact ] goaccess is a web server log analysis tool. Specially crafted requests can explore those vulnerabilities and cause it to overwrite memory or crash. [ Tests ] There is no regression in the (admittedly simple) autopkgtests. [ Risks ] The changes were cherry-picked from upstream, applied cleanly over the trixie branch, and are very targeted and localized. [ Checklist ] [x] *all* changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in (old)stable [x] the issue is verified as fixed in unstable [ Changes ] The main change is adding 3 upstream patches cherry-picked from the latest upstream release. The change to debian/salsa-ci.yml is necessary to prevent a failure on Salsa CI related to uscan (debian/watch is fixed in the sid/forky version of the package). [ Other info ] This was marked as no-DSA by the Security team so I'm going with a stable update. I'm attaching both the full diff against the version in trixie, and the actual patches since those are easier to read than the diff-in-diff version in the full diff.
diff --git c/debian/changelog w/debian/changelog index 6a55b588..08592661 100644 --- c/debian/changelog +++ w/debian/changelog @@ -1,3 +1,17 @@ +goaccess (1:1.9.3-1+deb13u1) trixie; urgency=high + + * Apply security updates (Closes: #1143181) + Includes fixes for the following vulnerabilities: + - CVE-2026-54715: Heap Out-of-Bounds Write in GoAccess `parse_browser()` + - CVE-2026-55768: GoAccess WebSocket server: signed 32 bit truncation of + the 64 bit frame length causes a remote pre authentication denial of + service + - CVE-2026-55777: Out-of-bounds heap read in parse_ios() via crafted + User-Agent (opesys.c:323) lead to remote crash/DoS + * debian/salsa-ci.yml: disable uscan test for this branch + + -- Antonio Terceiro <[email protected]> Mon, 17 Aug 2026 18:49:23 -0300 + goaccess (1:1.9.3-1) unstable; urgency=medium * New upstream version 1.9.3 diff --git c/debian/patches/0001-Fix-heap-buffer-overflow-in-parse_browser-Opera-hand.patch w/debian/patches/0001-Fix-heap-buffer-overflow-in-parse_browser-Opera-hand.patch new file mode 100644 index 00000000..c6f244ab --- /dev/null +++ w/debian/patches/0001-Fix-heap-buffer-overflow-in-parse_browser-Opera-hand.patch @@ -0,0 +1,37 @@ +From: Gerardo O <[email protected]> +Date: Sun, 7 Jun 2026 23:13:31 -0500 +Subject: Fix heap buffer overflow in parse_browser() Opera handling + +Anchor the offset to the actual 'Opera' position and require the slash to be at +or after the byte following it (op + 5 <= slh) so the destination can never run +past the buffer's NUL terminator. + +(cherry picked from commit 81f90d9dafd6956c188dea9f944d24946d3d3351) +--- + src/browsers.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/browsers.c b/src/browsers.c +index de0b56b..20f6fa7 100644 +--- a/src/browsers.c ++++ b/src/browsers.c +@@ -525,7 +525,7 @@ check_http_crawler (const char *str) { + * Otherwise the parsed browser is returned. */ + static char * + parse_browser (char *match, char *type, int i, char ***hash) { +- char *b = NULL, *ptr = NULL, *slh = NULL; ++ char *b = NULL, *ptr = NULL, *slh = NULL, *op = NULL; + size_t cnt = 0, space = 0; + + match = char_replace (match, '+', '-'); +@@ -547,8 +547,8 @@ parse_browser (char *match, char *type, int i, char ***hash) { + return parse_opera (slh); + } + /* Opera has the version number at the end */ +- if (strstr (match, "Opera") && (slh = strrchr (match, '/')) && match < slh) { +- memmove (match + 5, slh, strlen (slh) + 1); ++ if ((op = strstr (match, "Opera")) && (slh = strrchr (match, '/')) && op + 5 <= slh) { ++ memmove (op + 5, slh, strlen (slh) + 1); + } + /* IE Old */ + if (strstr (match, "MSIE") != NULL) { diff --git c/debian/patches/0002-Tighten-websocket-payload-length-handling.patch w/debian/patches/0002-Tighten-websocket-payload-length-handling.patch new file mode 100644 index 00000000..b22792a0 --- /dev/null +++ w/debian/patches/0002-Tighten-websocket-payload-length-handling.patch @@ -0,0 +1,46 @@ +From: Gerardo O <[email protected]> +Date: Mon, 15 Jun 2026 16:56:06 -0500 +Subject: Tighten websocket payload length handling. + +(cherry picked from commit ea74b87254d0adc675c087ff49bddd2d60dc01d5) +--- + src/websocket.c | 5 ++++- + src/websocket.h | 2 +- + 2 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/src/websocket.c b/src/websocket.c +index 8088921..8da1da9 100644 +--- a/src/websocket.c ++++ b/src/websocket.c +@@ -2027,7 +2027,7 @@ ws_get_frm_header (WSClient *client) { + ws_set_payloadlen ((*frm), (*frm)->buf); + ws_set_masking_key ((*frm), (*frm)->buf); + +- if ((*frm)->payloadlen > wsconfig.max_frm_size) { ++ if ((*frm)->payloadlen > (uint64_t) wsconfig.max_frm_size) { + ws_error (client, WS_CLOSE_TOO_LARGE, "Frame is too big"); + return ws_set_status (client, WS_ERR | WS_CLOSE, bytes); + } +@@ -2049,6 +2049,9 @@ ws_realloc_frm_payload (WSFrame *frm, WSMessage *msg) { + uint64_t newlen = 0; + + newlen = msg->payloadsz + frm->payloadlen; ++ if (newlen > (uint64_t) wsconfig.max_frm_size) ++ return 1; ++ + tmp = realloc (msg->payload, newlen); + if (tmp == NULL && newlen > 0) { + free (msg->payload); +diff --git a/src/websocket.h b/src/websocket.h +index 2846d6b..bd575a0 100644 +--- a/src/websocket.h ++++ b/src/websocket.h +@@ -195,7 +195,7 @@ typedef struct WSFrame_ { + unsigned char mask[4]; /* mask key */ + uint8_t res; /* extensions */ + int payload_offset; /* end of header/start of payload */ +- int payloadlen; /* payload length (for each frame) */ ++ uint64_t payloadlen; /* payload length (for each frame) */ + + /* status flags */ + int reading; /* still reading frame's header part? */ diff --git c/debian/patches/0003-Tighten-iOS-user-agent-parsing.patch w/debian/patches/0003-Tighten-iOS-user-agent-parsing.patch new file mode 100644 index 00000000..21fc3f96 --- /dev/null +++ w/debian/patches/0003-Tighten-iOS-user-agent-parsing.patch @@ -0,0 +1,23 @@ +From: Gerardo O <[email protected]> +Date: Mon, 15 Jun 2026 19:49:17 -0500 +Subject: Tighten iOS user agent parsing + +(cherry picked from commit ba813ed97d998dbdcb8d87e178799a4bb2da9e81) +--- + src/opesys.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/opesys.c b/src/opesys.c +index f83d0c3..ca05690 100644 +--- a/src/opesys.c ++++ b/src/opesys.c +@@ -303,7 +303,8 @@ parse_ios (char *agent, int tlen) { + goto out; + + *q = 0; +- memmove (agent + tlen, agent + offset, offset); ++ /* Move the version suffix to sit immediately after the matched keyword. */ ++ memmove (agent + tlen, p, (size_t) (q - p) + 1); + return char_replace (agent, '_', '.'); + + out: diff --git c/debian/patches/series w/debian/patches/series new file mode 100644 index 00000000..6453687c --- /dev/null +++ w/debian/patches/series @@ -0,0 +1,3 @@ +0001-Fix-heap-buffer-overflow-in-parse_browser-Opera-hand.patch +0002-Tighten-websocket-payload-length-handling.patch +0003-Tighten-iOS-user-agent-parsing.patch diff --git c/debian/salsa-ci.yml w/debian/salsa-ci.yml index 33c3a640..9a157201 100644 --- c/debian/salsa-ci.yml +++ w/debian/salsa-ci.yml @@ -2,3 +2,6 @@ include: - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml + +variables: + SALSA_CI_DISABLE_USCAN: 1
From: Gerardo O <[email protected]> Date: Sun, 7 Jun 2026 23:13:31 -0500 Subject: Fix heap buffer overflow in parse_browser() Opera handling Anchor the offset to the actual 'Opera' position and require the slash to be at or after the byte following it (op + 5 <= slh) so the destination can never run past the buffer's NUL terminator. (cherry picked from commit 81f90d9dafd6956c188dea9f944d24946d3d3351) --- src/browsers.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/browsers.c b/src/browsers.c index de0b56b..20f6fa7 100644 --- a/src/browsers.c +++ b/src/browsers.c @@ -525,7 +525,7 @@ check_http_crawler (const char *str) { * Otherwise the parsed browser is returned. */ static char * parse_browser (char *match, char *type, int i, char ***hash) { - char *b = NULL, *ptr = NULL, *slh = NULL; + char *b = NULL, *ptr = NULL, *slh = NULL, *op = NULL; size_t cnt = 0, space = 0; match = char_replace (match, '+', '-'); @@ -547,8 +547,8 @@ parse_browser (char *match, char *type, int i, char ***hash) { return parse_opera (slh); } /* Opera has the version number at the end */ - if (strstr (match, "Opera") && (slh = strrchr (match, '/')) && match < slh) { - memmove (match + 5, slh, strlen (slh) + 1); + if ((op = strstr (match, "Opera")) && (slh = strrchr (match, '/')) && op + 5 <= slh) { + memmove (op + 5, slh, strlen (slh) + 1); } /* IE Old */ if (strstr (match, "MSIE") != NULL) {
From: Gerardo O <[email protected]> Date: Mon, 15 Jun 2026 16:56:06 -0500 Subject: Tighten websocket payload length handling. (cherry picked from commit ea74b87254d0adc675c087ff49bddd2d60dc01d5) --- src/websocket.c | 5 ++++- src/websocket.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/websocket.c b/src/websocket.c index 8088921..8da1da9 100644 --- a/src/websocket.c +++ b/src/websocket.c @@ -2027,7 +2027,7 @@ ws_get_frm_header (WSClient *client) { ws_set_payloadlen ((*frm), (*frm)->buf); ws_set_masking_key ((*frm), (*frm)->buf); - if ((*frm)->payloadlen > wsconfig.max_frm_size) { + if ((*frm)->payloadlen > (uint64_t) wsconfig.max_frm_size) { ws_error (client, WS_CLOSE_TOO_LARGE, "Frame is too big"); return ws_set_status (client, WS_ERR | WS_CLOSE, bytes); } @@ -2049,6 +2049,9 @@ ws_realloc_frm_payload (WSFrame *frm, WSMessage *msg) { uint64_t newlen = 0; newlen = msg->payloadsz + frm->payloadlen; + if (newlen > (uint64_t) wsconfig.max_frm_size) + return 1; + tmp = realloc (msg->payload, newlen); if (tmp == NULL && newlen > 0) { free (msg->payload); diff --git a/src/websocket.h b/src/websocket.h index 2846d6b..bd575a0 100644 --- a/src/websocket.h +++ b/src/websocket.h @@ -195,7 +195,7 @@ typedef struct WSFrame_ { unsigned char mask[4]; /* mask key */ uint8_t res; /* extensions */ int payload_offset; /* end of header/start of payload */ - int payloadlen; /* payload length (for each frame) */ + uint64_t payloadlen; /* payload length (for each frame) */ /* status flags */ int reading; /* still reading frame's header part? */
From: Gerardo O <[email protected]> Date: Mon, 15 Jun 2026 19:49:17 -0500 Subject: Tighten iOS user agent parsing (cherry picked from commit ba813ed97d998dbdcb8d87e178799a4bb2da9e81) --- src/opesys.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/opesys.c b/src/opesys.c index f83d0c3..ca05690 100644 --- a/src/opesys.c +++ b/src/opesys.c @@ -303,7 +303,8 @@ parse_ios (char *agent, int tlen) { goto out; *q = 0; - memmove (agent + tlen, agent + offset, offset); + /* Move the version suffix to sit immediately after the matched keyword. */ + memmove (agent + tlen, p, (size_t) (q - p) + 1); return char_replace (agent, '_', '.'); out:
signature.asc
Description: PGP signature

