Hi Balint,as part of my work on E/LTS for Freexian I have prepared and tested security updates for trixie and bookworm (attached). Do you want to handle them or should I coordinate with the security team?
Cheers Jochen * Debian Bug Tracking System <[email protected]> [2026-01-16 16:15]:
This is an automatic notification regarding your Bug report which was filed against the src:wireshark package: #1125690: wireshark: CVE-2026-0959 CVE-2026-0960 CVE-2026-0961 CVE-2026-0962 It has been closed by Debian FTP Masters <[email protected]> (reply to Balint Reczey <[email protected]>). Their explanation is attached below along with your original report. If this explanation is unsatisfactory and you have not received a better one in a separate message then please contact Debian FTP Masters <[email protected]> (reply to Balint Reczey <[email protected]>) by replying to this email. -- 1125690: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1125690 Debian Bug Tracking System Contact [email protected] with problems
Date: Fri, 16 Jan 2026 16:12:37 +0000 To: [email protected] Reply-To: Balint Reczey <[email protected]> From: Debian FTP Masters <[email protected]> Subject: Bug#1125690: fixed in wireshark 4.6.3-1
Date: Fri, 16 Jan 2026 08:10:38 +0100 To: Debian Bug Tracking System <[email protected]> X-Mailer: reportbug 13.2.0 From: Salvatore Bonaccorso <[email protected]> Subject: wireshark: CVE-2026-0959 CVE-2026-0960 CVE-2026-0961 CVE-2026-0962 Source: wireshark Version: 4.6.2-1 Severity: important Tags: security upstream X-Debbugs-Cc: [email protected], Debian Security Team <[email protected]> Hi, The following vulnerabilities were published for wireshark. CVE-2026-0959[0]: | IEEE 802.11 protocol dissector crash in Wireshark 4.6.0 to 4.6.2 and | 4.4.0 to 4.4.12 allows denial of service CVE-2026-0960[1]: | HTTP3 protocol dissector infinite loop in Wireshark 4.6.0 to 4.6.2 | allows denial of service CVE-2026-0961[2]: | BLF file parser crash in Wireshark 4.6.0 to 4.6.2 and 4.4.0 to | 4.4.12 allows denial of service CVE-2026-0962[3]: | SOME/IP-SD protocol dissector crash in Wireshark 4.6.0 to 4.6.2 and | 4.4.0 to 4.4.12 allows denial of service If you fix the vulnerabilities please also make sure to include the CVE (Common Vulnerabilities & Exposures) ids in your changelog entry. For further information see: [0] https://security-tracker.debian.org/tracker/CVE-2026-0959 https://www.cve.org/CVERecord?id=CVE-2026-0959 [1] https://security-tracker.debian.org/tracker/CVE-2026-0960 https://www.cve.org/CVERecord?id=CVE-2026-0960 [2] https://security-tracker.debian.org/tracker/CVE-2026-0961 https://www.cve.org/CVERecord?id=CVE-2026-0961 [3] https://security-tracker.debian.org/tracker/CVE-2026-0962 https://www.cve.org/CVERecord?id=CVE-2026-0962 Regards, Salvatore
From 2b9a8dd6bace267518c568cf3f39a83270255ec3 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof <[email protected]> Date: Wed, 28 Jan 2026 13:22:56 +0100 Subject: [PATCH] DSA 4.0.17-0+deb12u2 --- debian/changelog | 12 +++ debian/patches/CVE-2024-11596.patch | 162 ++++++++++++++++++++++++++++ debian/patches/CVE-2025-5601.patch | 58 ++++++++++ debian/patches/CVE-2026-0962.patch | 144 +++++++++++++++++++++++++ debian/patches/series | 3 + 5 files changed, 379 insertions(+) create mode 100644 debian/patches/CVE-2024-11596.patch create mode 100644 debian/patches/CVE-2025-5601.patch create mode 100644 debian/patches/CVE-2026-0962.patch diff --git a/debian/changelog b/debian/changelog index 25987ad4c3..e464ecf18c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +wireshark (4.0.17-0+deb12u2) bookworm-security; urgency=high + + * Non-maintainer upload by the LTS Security Team. + * Fix CVE-2024-11596: ECMP dissector crash allows denial of service via + packet injection or crafted capture file. + * Fix CVE-2025-5601: Column handling crashes allows denial of service via + packet injection or crafted capture file. + Fix CVE-2026-0962: SOME/IP-SD protocol dissector crash allows denial of + service. + + -- Jochen Sprickerhof <[email protected]> Wed, 28 Jan 2026 13:22:40 +0100 + wireshark (4.0.17-0+deb12u1) bookworm; urgency=medium * Non-maintainer upload. diff --git a/debian/patches/CVE-2024-11596.patch b/debian/patches/CVE-2024-11596.patch new file mode 100644 index 0000000000..188344e6e5 --- /dev/null +++ b/debian/patches/CVE-2024-11596.patch @@ -0,0 +1,162 @@ +From: Gerald Combs <[email protected]> +Date: Thu, 14 Nov 2024 10:56:37 -0800 +Subject: ECMP: Exorcise a string buffer arithmetic gremlin + +Use a wmem_strbuf instead of manually allocating a string and managing +its offsets. + +Avoid appending a dangling space to our string. + +Fixes #20214 + +(cherry picked from commit c8e58870733f88f275ca9a6fa115ed085f987d94) + +Conflicts: + epan/dissectors/packet-ecmp.c + +origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/18076/diffs?commit_id=06e0b0bb0925fe4b99cfb7243cce473031b09dee +--- + epan/dissectors/packet-ecmp.c | 77 +++++++++---------------------------------- + 1 file changed, 16 insertions(+), 61 deletions(-) + +diff --git a/epan/dissectors/packet-ecmp.c b/epan/dissectors/packet-ecmp.c +index 5b0ed6a..a1e351b 100644 +--- a/epan/dissectors/packet-ecmp.c ++++ b/epan/dissectors/packet-ecmp.c +@@ -1122,72 +1122,54 @@ static int display_raw_cyclic_data(guint8 display, int offset, guint16 buffer_si + proto_tree_add_bytes_format_value(ecmp_current_tree, hf_ecmp_cyclic_data, tvb, offset-1, 0, NULL, "No data"); + } else { + /* define some variables */ +- gchar* pdata = NULL; /* pointer to array that stores the formatted data string */ +- guint16 idx = 0; /* counts through formatted string array */ +- guint8 value8 = 0; /* placeholder for extracted 8-bit data */ +- guint16 value16 = 0; /* placeholder for extracted 16-bit data */ +- guint32 value32 = 0; /* placeholder for extracted 32-bit data */ ++ wmem_strbuf_t* pdata = wmem_strbuf_new(wmem_packet_scope(), ""); /* formatted data string */ + guint16 num_elements_total = 0; /* contains total number of elements (byte/word/long) to be processed */ + const guint16 num_byte_elements_per_line = 16; /* number of byte (8-bit) elements per line e.g. "1B " (3 chars per element) */ + const guint16 num_word_elements_per_line = 16; /* number of word (16-bit) elements per line e.g. "A81B " (5 chars per element) */ + const guint16 num_long_elements_per_line = 8; /* number of long (32-bit) elements per line e.g. "01F4A81B " (9 chars per element) */ + guint16 num_elements_per_line = 8; /* counts the current number of elements per line */ + guint16 num_elements = 0; /* counts the number of elements in the format string */ +- guint16 format_string_size = 0; /* size of dynamic array to hold the formatted string */ + guint16 a = 0; /* value used for looping */ + int start_offset, line_offset; + +- /* calculate format string array size and other stuff */ +- /* */ +- /* Note: format string does require a nul-terminator (the + 1 in the equations) */ +- /* */ +- /* display = 0: (byte format "1D 24 3F ... A3 " */ +- /* format_string_size = (num_byte_elements_per_line * 3) + 1 */ +- /* */ +- /* display = 1: (word format "1D24 3F84 120B ... 1FA3 " */ +- /* format_string_size = (num_word_elements_per_line * 5) + 1 */ +- /* */ +- /* display = 2: (byte format "1D243F84 9BC08F20 ... 28BB1FA3 " */ +- /* format_string_size = (num_long_elements_per_line * 9) + 1 */ ++ /* calculate number of elements */ + /* */ + if (display == cyclic_display_byte_format) { +- format_string_size = (num_byte_elements_per_line * 3) + 1; /* format_string_size = 49 */ + num_elements_per_line = num_byte_elements_per_line; /* num_elements_per_line = 16 */ + num_elements_total = buffer_size; + } else if (display == cyclic_display_word_format) { +- format_string_size = (num_word_elements_per_line * 5) + 1; /* format_string_size = 81 */ + num_elements_per_line = num_word_elements_per_line; /* num_elements_per_line = 16 */ + num_elements_total = buffer_size >> 1; + } else if (display == cyclic_display_long_format) { +- format_string_size = (num_long_elements_per_line * 9) + 1; /* format_string_size = 73 */ + num_elements_per_line = num_long_elements_per_line; /* num_elements_per_line = 8 */ + num_elements_total = buffer_size >> 2; + } else { +- format_string_size = (num_byte_elements_per_line * 3) + 1; /* format_string_size = 49 */ + num_elements_per_line = num_byte_elements_per_line; /* num_elements_per_line = 16 */ + num_elements_total = buffer_size; + } + +- /* allocate dynamic memory for one line */ +- pdata = (gchar *)wmem_alloc(wmem_packet_scope(), format_string_size); +- + /* OK, let's get started */ +- idx = 0; + num_elements = 0; + + line_offset = start_offset = offset; + /* work through the display elements, 1 byte\word\long at a time */ +- for (a = 0; a < num_elements_total; a++ ) +- { ++ for (a = 0; a < num_elements_total; a++ ) { ++ if (wmem_strbuf_get_len(pdata) > 0) { ++ wmem_strbuf_append_c(pdata, ' '); ++ } ++ + /* use Wireshark accessor function to get the next byte, word, or long data */ + if (display == cyclic_display_byte_format) { +- value8 = tvb_get_guint8(tvb, offset); ++ guint8 value8 = tvb_get_guint8(tvb, offset); ++ wmem_strbuf_append_printf(pdata, "%02x", value8); + offset++; + } else if (display == cyclic_display_word_format) { +- value16 = tvb_get_ntohs(tvb, offset); ++ guint16 value16 = tvb_get_ntohs(tvb, offset); ++ wmem_strbuf_append_printf(pdata, "%04x", value16); + offset += 2; + } else if (display == cyclic_display_long_format) { +- value32 = tvb_get_ntohl(tvb, offset); ++ guint32 value32 = tvb_get_ntohl(tvb, offset); ++ wmem_strbuf_append_printf(pdata, "%08x", value32); + offset += 4; + } + +@@ -1196,47 +1178,20 @@ static int display_raw_cyclic_data(guint8 display, int offset, guint16 buffer_si + + /* check if we hit the max number of byte elements per line */ + if (num_elements >= num_elements_per_line) { +- /* we hit end of the current line */ +- /* add final value to string */ +- if (display == cyclic_display_byte_format) { +- snprintf(&pdata[idx], 32, "%02x",value8); +- } else if (display == cyclic_display_word_format) { +- snprintf(&pdata[idx], 32, "%04x",value16); +- } else if (display == cyclic_display_long_format) { +- snprintf(&pdata[idx], 32, "%08x",value32); +- } +- + /* display the completed line in the sub-tree */ +- proto_tree_add_bytes_format(ecmp_current_tree, hf_ecmp_cyclic_data, tvb, offset, offset-line_offset, NULL, "%s", pdata); ++ proto_tree_add_bytes_format(ecmp_current_tree, hf_ecmp_cyclic_data, tvb, offset, offset-line_offset, NULL, "%s", wmem_strbuf_get_str(pdata)); + + /* start the line over */ +- idx = 0; ++ wmem_strbuf_truncate(pdata, 0); + num_elements = 0; + line_offset = offset; +- +- } else { +- /* we're still adding to the current line */ +- /* add current value to string */ +- if (display == cyclic_display_byte_format) { +- snprintf(&pdata[idx], 32, "%02x ",value8); +- idx += 3; +- } else if (display == cyclic_display_word_format) { +- snprintf(&pdata[idx], 32, "%04x ",value16); +- idx += 5; +- } else if (display == cyclic_display_long_format) { +- snprintf(&pdata[idx], 32, "%08x ",value32); +- idx += 9; +- } + } + } + + /* if we exited the loop, see if there's a partial line to display */ + if (num_elements > 0) { +- /* add null-terminator to partial line */ +- pdata[idx] = 0x00; +- + /* display the partial line in the sub-tree */ +- proto_tree_add_bytes_format(ecmp_current_tree, hf_ecmp_cyclic_data, tvb, start_offset, offset-start_offset, NULL, "%s", pdata); ++ proto_tree_add_bytes_format(ecmp_current_tree, hf_ecmp_cyclic_data, tvb, start_offset, offset-start_offset, NULL, "%s", wmem_strbuf_get_str(pdata)); + } + } + return offset; diff --git a/debian/patches/CVE-2025-5601.patch b/debian/patches/CVE-2025-5601.patch new file mode 100644 index 0000000000..4930b883fd --- /dev/null +++ b/debian/patches/CVE-2025-5601.patch @@ -0,0 +1,58 @@ +From: John Thacker <[email protected]> +Date: Sat, 26 Apr 2025 10:01:19 +0000 +Subject: column: Do not allow fence to go beyond column size when prepending + +When moving the fence location forward when prepending, ensure +that it does not go past the end of the buffer. + +Also get rid of unnecessary branching and strlen calls. + +Fix #20509 + +(cherry picked from commit 53213086304caa3dfbdd7dc39c2668a3aea1a5c0) + +Co-authored-by: John Thacker <[email protected]> +origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/18076/diffs?commit_id=8c186dbb381cf51064fa8dbff7953468d5ae394c +--- + epan/column-utils.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/epan/column-utils.c b/epan/column-utils.c +index e80558d..6886608 100644 +--- a/epan/column-utils.c ++++ b/epan/column-utils.c +@@ -578,8 +578,13 @@ col_prepend_fstr(column_info *cinfo, const gint el, const gchar *format, ...) + /* + * Move the fence, unless it's at the beginning of the string. + */ +- if (col_item->col_fence > 0) ++ if (col_item->col_fence > 0) { ++ /* pos >= strlen if truncation occurred; this saves on a strlen ++ * call and prevents adding a single byte character later if a ++ * a multibyte character was truncated (good). */ + col_item->col_fence += (int) strlen(col_item->col_buf); ++ col_item->col_fence = MIN((int)(max_len - 1), col_item->col_fence); ++ } + + (void) g_strlcat(col_item->col_buf, orig, max_len); + col_item->col_data = col_item->col_buf; +@@ -622,11 +627,14 @@ col_prepend_fence_fstr(column_info *cinfo, const gint el, const gchar *format, . + * Move the fence if it exists, else create a new fence at the + * end of the prepended data. + */ +- if (col_item->col_fence > 0) { +- col_item->col_fence += (int) strlen(col_item->col_buf); +- } else { +- col_item->col_fence = (int) strlen(col_item->col_buf); +- } ++ /* pos >= strlen if truncation occurred; this saves on a strlen ++ * call and prevents adding a single byte character later if a ++ * a multibyte character was truncated (good). */ ++ col_item->col_fence += (int) strlen(col_item->col_buf); ++ col_item->col_fence = MIN((int)(max_len - 1), col_item->col_fence); ++ /* ++ * Append the original data. ++ */ + (void) g_strlcat(col_item->col_buf, orig, max_len); + col_item->col_data = col_item->col_buf; + } diff --git a/debian/patches/CVE-2026-0962.patch b/debian/patches/CVE-2026-0962.patch new file mode 100644 index 0000000000..bc089ea923 --- /dev/null +++ b/debian/patches/CVE-2026-0962.patch @@ -0,0 +1,144 @@ +From: Gerald Combs <[email protected]> +Date: Mon, 12 Jan 2026 17:01:48 -0800 +Subject: SOME/IP-SD: Fix a buffer overflow + +Make sure we don't write past the end of our option port array. Make our +option count unsigned. + +Fixes #20945 + +(cherry picked from commit 55ec8b3db4968c97115f014fb5974206cdf57454) + +Conflicts: + epan/dissectors/packet-someip-sd.c +origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/18076/diffs?commit_id=825b83e1ed146f6c8fa8f1d7ad2794061b82c895 +--- + epan/dissectors/packet-someip-sd.c | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +diff --git a/epan/dissectors/packet-someip-sd.c b/epan/dissectors/packet-someip-sd.c +index 3f5d36a..059e307 100644 +--- a/epan/dissectors/packet-someip-sd.c ++++ b/epan/dissectors/packet-someip-sd.c +@@ -81,6 +81,9 @@ + #define SD_OPTION_L4PROTO_TCP 6 + #define SD_OPTION_L4PROTO_UDP 17 + ++/* option start 0..255, num 0..15 -> 0..270 */ ++#define SD_MAX_NUM_OPTIONS 271 ++ + /* ID wireshark identifies the dissector by */ + static int proto_someip_sd = -1; + +@@ -237,6 +240,7 @@ static expert_field ef_someipsd_option_unknown = EI_INIT; + static expert_field ef_someipsd_option_wrong_length = EI_INIT; + static expert_field ef_someipsd_L4_protocol_unsupported = EI_INIT; + static expert_field ef_someipsd_config_string_malformed = EI_INIT; ++static expert_field ei_someipsd_too_many_options = EI_INIT; + + /*** prototypes ***/ + void proto_register_someip_sd(void); +@@ -247,13 +251,13 @@ void proto_reg_handoff_someip_sd(void); + *************************************/ + + static void +-dissect_someip_sd_pdu_option_configuration(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, int optionnum) { ++dissect_someip_sd_pdu_option_configuration(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, unsigned optionnum) { + guint32 offset_orig = offset; + const guint8 *config_string; + proto_item *ti; + proto_tree *subtree; + +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, NULL, "%d: Configuration Option", optionnum); ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, NULL, "%u: Configuration Option", optionnum); + + /* Add common fields */ + proto_tree_add_item(tree, hf_someip_sd_option_length, tvb, offset, 2, ENC_BIG_ENDIAN); +@@ -290,7 +294,7 @@ dissect_someip_sd_pdu_option_configuration(tvbuff_t *tvb, packet_info *pinfo, pr + } + + static void +-dissect_someip_sd_pdu_option_loadbalancing(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32 offset, guint32 length, int optionnum) { ++dissect_someip_sd_pdu_option_loadbalancing(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint32 offset, guint32 length, unsigned optionnum) { + tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, NULL, "%d: Load Balancing Option", optionnum); + + /* Add common fields */ +@@ -310,7 +314,7 @@ dissect_someip_sd_pdu_option_loadbalancing(tvbuff_t *tvb, packet_info *pinfo _U_ + } + + static void +-dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, int optionnum) { ++dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, unsigned optionnum) { + guint8 type = 255; + const gchar *description = NULL; + guint32 l4port = 0; +@@ -323,7 +327,7 @@ dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree + + type = tvb_get_guint8(tvb, offset + 2); + description = val_to_str(type, sd_option_type, "(Unknown Option: %d)"); +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%d: %s Option", optionnum, description); ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%u: %s Option", optionnum, description); + + if (length != SD_OPTION_IPV4_LENGTH) { + expert_add_info(pinfo, ti_top, &ef_someipsd_option_wrong_length); +@@ -369,7 +373,7 @@ dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree + } + + static void +-dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, int optionnum) { ++dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, unsigned optionnum) { + guint8 type = 255; + const gchar *description = NULL; + guint32 l4port = 0; +@@ -381,7 +385,7 @@ dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree + type = tvb_get_guint8(tvb, offset + 2); + description = val_to_str(type, sd_option_type, "(Unknown Option: %d)"); + +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%d: %s Option", optionnum, description); ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%u: %s Option", optionnum, description); + + if (length != SD_OPTION_IPV6_LENGTH) { + expert_add_info(pinfo, ti_top, &ef_someipsd_option_wrong_length); +@@ -425,11 +429,11 @@ dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree + } + + static void +-dissect_someip_sd_pdu_option_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, int optionnum) { ++dissect_someip_sd_pdu_option_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint32 length, unsigned optionnum) { + guint32 len = 0; + proto_item *ti; + +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti, "%d: %s Option", optionnum, ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti, "%u: %s Option", optionnum, + val_to_str_const(tvb_get_guint8(tvb, offset + 2), sd_option_type, "Unknown")); + + expert_add_info(pinfo, ti, &ef_someipsd_option_unknown); +@@ -454,7 +458,7 @@ static int + dissect_someip_sd_pdu_options(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *ti, guint32 offset_orig, guint32 length) { + guint16 real_length = 0; + guint8 option_type = 0; +- int optionnum = 0; ++ unsigned optionnum = 0; + tvbuff_t *subtvb = NULL; + + guint32 offset = offset_orig; +@@ -465,6 +469,11 @@ dissect_someip_sd_pdu_options(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre + } + + while (tvb_bytes_exist(tvb, offset, SD_OPTION_MINLENGTH)) { ++ if (optionnum >= SD_MAX_NUM_OPTIONS) { ++ expert_add_info(pinfo, ti, &ei_someipsd_too_many_options); ++ return offset; ++ } ++ + real_length = tvb_get_ntohs(tvb, offset) + 3; + option_type = tvb_get_guint8(tvb, offset + 2); + +@@ -1164,6 +1173,7 @@ proto_register_someip_sd(void) { + { &ef_someipsd_option_wrong_length,{ "someipsd.option_wrong_length", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Option length is incorrect!", EXPFILL } }, + { &ef_someipsd_L4_protocol_unsupported,{ "someipsd.L4_protocol_unsupported", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Unsupported Layer 4 Protocol!", EXPFILL } }, + { &ef_someipsd_config_string_malformed,{ "someipsd.config_string_malformed", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Configuration String malformed!", EXPFILL } }, ++ { &ei_someipsd_too_many_options,{ "someipsd.too_many_options", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Too many options!", EXPFILL } }, + }; + + /* Register Protocol, Fields, ETTs, Expert Info, Taps */ diff --git a/debian/patches/series b/debian/patches/series index 3834e173fe..d615fc08fc 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,6 @@ 09_idl2wrs.patch 0004-Use-packaged-JS-and-CSS-resources-instead-of-pulling.patch 0001-DOCSIS-Extended-EH-Elements-are-not-recursive.patch +CVE-2024-11596.patch +CVE-2025-5601.patch +CVE-2026-0962.patch -- 2.51.0
From 0d6235c8603e9de971ecb33ce29b4b5cdc78d534 Mon Sep 17 00:00:00 2001 From: Jochen Sprickerhof <[email protected]> Date: Wed, 28 Jan 2026 12:32:57 +0100 Subject: [PATCH] DSA 4.4.7-1+deb13u1 --- debian/changelog | 11 +++ debian/patches/CVE-2026-0959.patch | 62 +++++++++++++ debian/patches/CVE-2026-0961.patch | 31 +++++++ debian/patches/CVE-2026-0962.patch | 137 +++++++++++++++++++++++++++++ debian/patches/series | 3 + 5 files changed, 244 insertions(+) create mode 100644 debian/patches/CVE-2026-0959.patch create mode 100644 debian/patches/CVE-2026-0961.patch create mode 100644 debian/patches/CVE-2026-0962.patch diff --git a/debian/changelog b/debian/changelog index f83ee2440a..c5050b7565 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +wireshark (4.4.7-1+deb13u1) trixie-security; urgency=high + + * Non-maintainer upload by the LTS Security Team. + * Fix CVE-2026-0959: EEE 802.11 protocol dissector crash allows denial of + service. + * Fix CVE-2026-0961: BLF file parser crash allows denial of service. + * Fix CVE-2026-0962: SOME/IP-SD protocol dissector crash allows denial of + service. + + -- Jochen Sprickerhof <[email protected]> Wed, 28 Jan 2026 12:32:30 +0100 + wireshark (4.4.7-1) unstable; urgency=medium * Upload to unstable (Closes: #1107515) diff --git a/debian/patches/CVE-2026-0959.patch b/debian/patches/CVE-2026-0959.patch new file mode 100644 index 0000000000..f13ead16b5 --- /dev/null +++ b/debian/patches/CVE-2026-0959.patch @@ -0,0 +1,62 @@ +From: John Thacker <[email protected]> +Date: Sun, 11 Jan 2026 03:11:02 +0000 +Subject: ieee80211: Avoid using a fixed array for multi-link per-STA + subelements + +Since this processes to the end of the TVB, there might be more than 16. +Simplify the logic and only test for a set link_id in one place. This +also gets rid of a possible use of an uninitialized value on error. + +Fix #20939, OSS-Fuzz 474458885 + +(cherry picked from commit 4b48ee36f1829d6d3d009bf9871af523ce8e3ace) + +Co-authored-by: John Thacker <[email protected]> +origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/18076/diffs?commit_id=5bfd4035f52f3dbc499a1963c42cedbb194b7eec +--- + epan/dissectors/packet-ieee80211.c | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c +index 6ed3b47..89bea94 100644 +--- a/epan/dissectors/packet-ieee80211.c ++++ b/epan/dissectors/packet-ieee80211.c +@@ -28301,7 +28301,7 @@ dissect_multi_link(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, + uint8_t multi_link_type = multi_link_control & 0x0007; + uint16_t present = multi_link_control >> 4; + int elt = 0, hf_index; +- int local_link_ids[16]; ++ wmem_strbuf_t *link_id_list = wmem_strbuf_create(pinfo->pool); + + control = proto_tree_add_item(tree, hf_ieee80211_eht_multi_link_control, tvb, + offset, 2, ENC_LITTLE_ENDIAN); +@@ -28590,9 +28590,6 @@ dissect_multi_link(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, + multi_link_type, &link_id); + + offset += overhead; /* Account for the overhead in the subelt */ +- if (link_id != -1) { +- local_link_ids[elt] = link_id; +- } + break; + case 221: + /* Add an expert info saying there are none so far? */ +@@ -28603,18 +28600,13 @@ dissect_multi_link(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, + break; + } + if (link_id != -1) { ++ wmem_strbuf_append_printf(link_id_list, (elt == 0) ? "%d" : "_%d", link_id); + elt++; + } + } + proto_tree_add_uint(tree, hf_index, tvb, 0, 0, elt); + + if (elt) { +- wmem_strbuf_t *link_id_list = wmem_strbuf_new_sized(pinfo->pool, elt * 2); +- for (int i = 0; i < elt; i++) { +- if (local_link_ids[i] != -1) { +- wmem_strbuf_append_printf(link_id_list, (i == 0) ? "%d" : "_%d", local_link_ids[i]); +- } +- } + proto_tree_add_string(tree, hf_ieee80211_eht_multi_link_link_id_list, tvb, + 0, 0, link_id_list->str); + } diff --git a/debian/patches/CVE-2026-0961.patch b/debian/patches/CVE-2026-0961.patch new file mode 100644 index 0000000000..394dfbb83e --- /dev/null +++ b/debian/patches/CVE-2026-0961.patch @@ -0,0 +1,31 @@ +From: Darius Davis <[email protected]> +Date: Mon, 1 Dec 2025 17:47:28 +1000 +Subject: BLF: Validate length of uncompressed segments. + +When a container's data is not compressed, its actual length should equal the +length of the data stored in the file. + +Fixes #20880. + +(cherry picked from commit 516ba22c34bd62468c2967ac476146bc03482679) +origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/18076/diffs?commit_id=c99f1188693ddad1e6ff0244ca0cd095619bdda7 +--- + wiretap/blf.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/wiretap/blf.c b/wiretap/blf.c +index 0075936..528ccb0 100644 +--- a/wiretap/blf.c ++++ b/wiretap/blf.c +@@ -793,6 +793,11 @@ blf_pull_logcontainer_into_memory(blf_params_t *params, blf_log_container_t *con + } + + if (container->compression_method == BLF_COMPRESSION_NONE) { ++ if (data_length != container->real_length) { ++ *err = WTAP_ERR_BAD_FILE; ++ *err_info = ws_strdup("blf_pull_logcontainer_into_memory: uncompressed data has wrong length"); ++ return false; ++ } + unsigned char* buf = g_try_malloc((size_t)container->real_length); + if (buf == NULL) { + *err = WTAP_ERR_INTERNAL; diff --git a/debian/patches/CVE-2026-0962.patch b/debian/patches/CVE-2026-0962.patch new file mode 100644 index 0000000000..504acad83d --- /dev/null +++ b/debian/patches/CVE-2026-0962.patch @@ -0,0 +1,137 @@ +From: Gerald Combs <[email protected]> +Date: Mon, 12 Jan 2026 17:01:48 -0800 +Subject: SOME/IP-SD: Fix a buffer overflow + +Make sure we don't write past the end of our option port array. Make our +option count unsigned. + +Fixes #20945 + +(cherry picked from commit 55ec8b3db4968c97115f014fb5974206cdf57454) + +Conflicts: + epan/dissectors/packet-someip-sd.c +origin: https://gitlab.com/wireshark/wireshark/-/merge_requests/18076/diffs?commit_id=825b83e1ed146f6c8fa8f1d7ad2794061b82c895 +--- + epan/dissectors/packet-someip-sd.c | 30 ++++++++++++++++++------------ + 1 file changed, 18 insertions(+), 12 deletions(-) + +diff --git a/epan/dissectors/packet-someip-sd.c b/epan/dissectors/packet-someip-sd.c +index 1a348d3..b36a2fc 100644 +--- a/epan/dissectors/packet-someip-sd.c ++++ b/epan/dissectors/packet-someip-sd.c +@@ -269,6 +269,7 @@ static expert_field ei_someipsd_option_unknown; + static expert_field ei_someipsd_option_wrong_length; + static expert_field ei_someipsd_L4_protocol_unsupported; + static expert_field ei_someipsd_config_string_malformed; ++static expert_field ei_someipsd_too_many_options; + + /*** prototypes ***/ + void proto_register_someip_sd(void); +@@ -301,13 +302,13 @@ someip_sd_register_ports(uint32_t opt_index, uint32_t opt_num, uint32_t option_c + } + + static void +-dissect_someip_sd_pdu_option_configuration(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, int optionnum) { ++dissect_someip_sd_pdu_option_configuration(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, unsigned optionnum) { + uint32_t offset_orig = offset; + const uint8_t *config_string; + proto_item *ti; + proto_tree *subtree; + +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, NULL, "%d: Configuration Option", optionnum); ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, NULL, "%u: Configuration Option", optionnum); + + /* Add common fields */ + proto_tree_add_item(tree, hf_someip_sd_option_length, tvb, offset, 2, ENC_BIG_ENDIAN); +@@ -344,8 +345,8 @@ dissect_someip_sd_pdu_option_configuration(tvbuff_t *tvb, packet_info *pinfo, pr + } + + static void +-dissect_someip_sd_pdu_option_loadbalancing(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, uint32_t offset, uint32_t length, int optionnum) { +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, NULL, "%d: Load Balancing Option", optionnum); ++dissect_someip_sd_pdu_option_loadbalancing(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, uint32_t offset, uint32_t length, unsigned optionnum) { ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, NULL, "%u: Load Balancing Option", optionnum); + + /* Add common fields */ + proto_tree_add_item(tree, hf_someip_sd_option_length, tvb, offset, 2, ENC_BIG_ENDIAN); +@@ -364,7 +365,7 @@ dissect_someip_sd_pdu_option_loadbalancing(tvbuff_t *tvb, packet_info *pinfo _U_ + } + + static void +-dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, int optionnum, uint32_t option_ports[]) { ++dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, unsigned optionnum, uint32_t option_ports[]) { + uint8_t type = 255; + const char *description = NULL; + uint32_t l4port = 0; +@@ -377,7 +378,7 @@ dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree + + type = tvb_get_uint8(tvb, offset + 2); + description = val_to_str(type, sd_option_type, "(Unknown Option: %d)"); +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%d: %s Option", optionnum, description); ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%u: %s Option", optionnum, description); + + if (length != SD_OPTION_IPV4_LENGTH) { + expert_add_info(pinfo, ti_top, &ei_someipsd_option_wrong_length); +@@ -418,7 +419,7 @@ dissect_someip_sd_pdu_option_ipv4(tvbuff_t *tvb, packet_info *pinfo, proto_tree + } + + static void +-dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, int optionnum, uint32_t option_ports[]) { ++dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, unsigned optionnum, uint32_t option_ports[]) { + uint8_t type = 255; + const char *description = NULL; + uint32_t l4port = 0; +@@ -431,7 +432,7 @@ dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree + type = tvb_get_uint8(tvb, offset + 2); + description = val_to_str(type, sd_option_type, "(Unknown Option: %d)"); + +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%d: %s Option", optionnum, description); ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti_top, "%u: %s Option", optionnum, description); + + if (length != SD_OPTION_IPV6_LENGTH) { + expert_add_info(pinfo, ti_top, &ei_someipsd_option_wrong_length); +@@ -471,11 +472,11 @@ dissect_someip_sd_pdu_option_ipv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree + } + + static void +-dissect_someip_sd_pdu_option_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, int optionnum) { ++dissect_someip_sd_pdu_option_unknown(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, uint32_t offset, uint32_t length, unsigned optionnum) { + uint32_t len = 0; + proto_item *ti; + +- tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti, "%d: %s Option", optionnum, ++ tree = proto_tree_add_subtree_format(tree, tvb, offset, length, ett_someip_sd_option, &ti, "%u: %s Option", optionnum, + val_to_str_const(tvb_get_uint8(tvb, offset + 2), sd_option_type, "Unknown")); + + expert_add_info(pinfo, ti, &ei_someipsd_option_unknown); +@@ -500,7 +501,7 @@ static int + dissect_someip_sd_pdu_options(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *ti, uint32_t offset_orig, uint32_t length, uint32_t option_ports[], unsigned *option_count) { + uint16_t real_length = 0; + uint8_t option_type = 0; +- int optionnum = 0; ++ unsigned optionnum = 0; + tvbuff_t *subtvb = NULL; + + uint32_t offset = offset_orig; +@@ -511,7 +512,11 @@ dissect_someip_sd_pdu_options(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre + } + + while (tvb_bytes_exist(tvb, offset, SD_OPTION_MINLENGTH)) { +- ws_assert(optionnum >= 0 && optionnum < SD_MAX_NUM_OPTIONS); ++ if (optionnum >= SD_MAX_NUM_OPTIONS) { ++ expert_add_info(pinfo, ti, &ei_someipsd_too_many_options); ++ return offset; ++ } ++ + option_ports[optionnum] = 0; + + real_length = tvb_get_ntohs(tvb, offset) + 3; +@@ -1290,6 +1295,7 @@ proto_register_someip_sd(void) { + { &ei_someipsd_option_wrong_length,{ "someipsd.option_wrong_length", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Option length is incorrect!", EXPFILL } }, + { &ei_someipsd_L4_protocol_unsupported,{ "someipsd.L4_protocol_unsupported", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Unsupported Layer 4 Protocol!", EXPFILL } }, + { &ei_someipsd_config_string_malformed,{ "someipsd.config_string_malformed", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Configuration String malformed!", EXPFILL } }, ++ { &ei_someipsd_too_many_options,{ "someipsd.too_many_options", PI_MALFORMED, PI_ERROR, "SOME/IP-SD Too many options!", EXPFILL } }, + }; + + /* Register Protocol, Fields, ETTs, Expert Info, Taps, Dissector */ diff --git a/debian/patches/series b/debian/patches/series index fab07d763f..89f1dbfaec 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,6 @@ 0001-tools-Use-esnacc-instead-of-snacc-in-asn2deb.patch 09_idl2wrs.patch 0004-Use-packaged-JS-and-CSS-resources-instead-of-pulling.patch +CVE-2026-0959.patch +CVE-2026-0961.patch +CVE-2026-0962.patch -- 2.51.0
signature.asc
Description: PGP signature

