Package: release.debian.org User: release.debian....@packages.debian.org Severity: normal
Hi, Could you please allow uploading wireshark 1.0.2-3+lenny6 to stable-security? It fixes security issues only: --- debian/changelog (revision 13620) +++ debian/changelog (revision 14468) @@ -1,3 +1,13 @@ +wireshark (1.0.2-3+lenny6) stable-security; urgency=high + + * security fixes from Wireshark 1.0.8 and 1.0.9: + - The PCNFSD dissector could crash (CVE-2009-1829) + - The AFS dissector could crash (CVE-2009-2562) + - The OpcUa dissector could use excessive CPU and memory (CVE-2009-3242) + (Closes: #533347) + + -- Balint Reczey <bal...@balintreczey.hu> Mon, 28 Sep 2009 13:05:13 +0100 + wireshark (1.0.2-3+lenny5) stable-security; urgency=high Thanks, Balint
Index: debian/changelog =================================================================== --- debian/changelog (revision 13620) +++ debian/changelog (revision 14468) @@ -1,3 +1,13 @@ +wireshark (1.0.2-3+lenny6) stable-security; urgency=high + + * security fixes from Wireshark 1.0.8 and 1.0.9: + - The PCNFSD dissector could crash (CVE-2009-1829) + - The AFS dissector could crash (CVE-2009-2562) + - The OpcUa dissector could use excessive CPU and memory (CVE-2009-3242) + (Closes: #533347) + + -- Balint Reczey <bal...@balintreczey.hu> Mon, 28 Sep 2009 13:05:13 +0100 + wireshark (1.0.2-3+lenny5) stable-security; urgency=high * Security fixes from Wireshark 1.0.7 Index: debian/patches/34_fix_opcua_lockup.dpatch =================================================================== --- debian/patches/34_fix_opcua_lockup.dpatch (revision 0) +++ debian/patches/34_fix_opcua_lockup.dpatch (revision 14468) @@ -0,0 +1,256 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 34_fix_opcua_lockup.dpatch by <bal...@balintreczey.hu> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fix excessive CPU and memory use in OpcUa disssector + +...@dpatch@ + +Index: trunk/plugins/opcua/opcua_simpletypes.c +=================================================================== +--- trunk/plugins/opcua/opcua_simpletypes.c (revision 29828) ++++ trunk/plugins/opcua/opcua_simpletypes.c (revision 29829) +@@ -34,9 +34,6 @@ + #include <string.h> + #include <epan/emem.h> + +-/* string buffer */ +-#define MAX_BUFFER 256 +- + #define DIAGNOSTICINFO_ENCODINGMASK_SYMBOLICID_FLAG 0x01 + #define DIAGNOSTICINFO_ENCODINGMASK_NAMESPACE_FLAG 0x02 + #define DIAGNOSTICINFO_ENCODINGMASK_LOCALIZEDTEXT_FLAG 0x04 +@@ -53,6 +50,9 @@ + #define EXTOBJ_ENCODINGMASK_BINBODY_FLAG 0x01 + #define EXTOBJ_ENCODINGMASK_XMLBODY_FLAG 0x02 + ++/* Chosen arbitrarily */ ++#define MAX_ARRAY_LEN 10000 ++ + static int hf_opcua_diag_mask_symbolicflag = -1; + static int hf_opcua_diag_mask_namespaceflag = -1; + static int hf_opcua_diag_mask_localizedtextflag = -1; +@@ -317,35 +317,28 @@ + + void parseString(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) + { +- char *szValue = ep_alloc(MAX_BUFFER); ++ char *szValue; + gint iOffset = *pOffset; + gint32 iLen = tvb_get_letohl(tvb, *pOffset); + iOffset+=4; + +- if (szValue) ++ if (iLen == -1) + { +- if (iLen == -1) +- { +- g_snprintf(szValue, MAX_BUFFER, "[OpcUa Null String]"); +- } +- else if (iLen >= 0) +- { +- int iStrLen = iLen; +- if (iStrLen > (MAX_BUFFER-1)) iStrLen = MAX_BUFFER - 1; +- /* copy non null terminated string of length iStrlen */ +- strncpy(szValue, (char*)&tvb->real_data[iOffset], iStrLen); +- /* set null terminator */ +- szValue[iStrLen] = 0; +- iOffset += iLen; /* eat the whole string */ +- } +- else +- { +- g_snprintf(szValue, MAX_BUFFER, "[Invalid String] Ups, something is wrong with this message."); +- } +- ++ proto_tree_add_string(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), ++ "[OpcUa Null String]"); ++ } ++ else if (iLen >= 0) ++ { ++ iOffset += iLen; /* eat the whole string */ ++ proto_tree_add_item(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), TRUE); ++ } ++ else ++ { ++ szValue = ep_strdup_printf("[Invalid String] Invalid length: %d", iLen); + proto_tree_add_string(tree, hfIndex, tvb, *pOffset, (iOffset - *pOffset), szValue); +- *pOffset = iOffset; + } ++ ++ *pOffset = iOffset; + } + + void parseStatusCode(proto_tree *tree, tvbuff_t *tvb, gint *pOffset, int hfIndex) +@@ -623,11 +616,17 @@ + /* read array length */ + iLen = tvb_get_letohl(tvb, *pOffset); + proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE); +- *pOffset += 4; + + if (iLen == -1) return; /* no array */ + if (iLen == 0) return; /* array with zero elements*/ + ++ if (iLen > MAX_ARRAY_LEN) ++ { ++ PROTO_ITEM_SET_GENERATED(proto_tree_add_text(tree, tvb, *pOffset, 4, "Array length %d too large to process", iLen)); ++ return; ++ } ++ ++ *pOffset += 4; + for (i=0; i<iLen; i++) + { + (*pParserFunction)(subtree, tvb, pOffset, hfIndex); +@@ -649,11 +648,17 @@ + /* read array length */ + iLen = tvb_get_letohl(tvb, *pOffset); + proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE); +- *pOffset += 4; + + if (iLen == -1) return; /* no array */ + if (iLen == 0) return; /* array with zero elements*/ + ++ if (iLen > MAX_ARRAY_LEN) ++ { ++ PROTO_ITEM_SET_GENERATED(proto_tree_add_text(tree, tvb, *pOffset, 4, "Array length %d too large to process", iLen)); ++ return; ++ } ++ ++ *pOffset += 4; + for (i=0; i<iLen; i++) + { + (*pParserFunction)(subtree, tvb, pOffset); +@@ -674,11 +679,17 @@ + /* read array length */ + iLen = tvb_get_letohl(tvb, *pOffset); + proto_tree_add_item(subtree, hf_opcua_ArraySize, tvb, *pOffset, 4, TRUE); +- *pOffset += 4; + + if (iLen == -1) return; /* no array */ + if (iLen == 0) return; /* array with zero elements*/ + ++ if (iLen > MAX_ARRAY_LEN) ++ { ++ PROTO_ITEM_SET_GENERATED(proto_tree_add_text(tree, tvb, *pOffset, 4, "Array length %d too large to process", iLen)); ++ return; ++ } ++ ++ *pOffset += 4; + for (i=0; i<iLen; i++) + { + char szNum[20]; +Index: plugins/opcua/opcua.c +=================================================================== +--- trunk/plugins/opcua/opcua.c (revision 29828) ++++ trunk/plugins/opcua/opcua.c (revision 29829) +@@ -184,11 +184,11 @@ + } + + /* parse message type */ +- if (tvb->real_data[0] == 'U' && tvb->real_data[1] == 'A') ++ if (tvb_get_guint8(tvb, 0) == 'U' && tvb_get_guint8(tvb, 1) == 'A') + { +- if (tvb->real_data[2] == 'T') ++ if (tvb_get_guint8(tvb, 2) == 'T') + { +- switch(tvb->real_data[3]) ++ switch(tvb_get_guint8(tvb, 3)) + { + case 'H': msgtype = MSG_HELLO; + pfctParse = parseHello; +@@ -203,9 +203,9 @@ + break; + } + } +- else if (tvb->real_data[2] == 'M') ++ else if (tvb_get_guint8(tvb, 2) == 'M') + { +- switch(tvb->real_data[3]) ++ switch(tvb_get_guint8(tvb, 3)) + { + case 'G': msgtype = MSG_DATA_LAST_CHUNK; + pfctParse = parseData; +Index: plugins/opcua/opcua_transport_layer.c +=================================================================== +--- trunk/plugins/opcua/opcua_transport_layer.c (revision 29828) ++++ trunk/plugins/opcua/opcua_transport_layer.c (revision 29829) +@@ -107,34 +107,10 @@ + proto_register_field_array(proto, hf, array_length(hf)); + } + +-/** helper functions for adding strings, +- * that are not zero terminated. +- */ +-void addString(proto_tree *tree, +- int hfindex, +- tvbuff_t *tvb, +- gint start, +- gint length, +- const char *value) +-{ +- char *szValue = ep_alloc(256); +- +- if (szValue) +- { +- if (length > 255) length = 255; +- /* copy non null terminated string data */ +- strncpy(szValue, value, length); +- /* set null terminator */ +- szValue[length] = 0; +- +- proto_tree_add_string(tree, hfindex, tvb, start, length, szValue); +- } +-} +- + /* Transport Layer: message parsers */ + void parseHello(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) + { +- addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; ++ proto_tree_add_item(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_ver, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; +@@ -146,7 +122,7 @@ + + void parseAcknowledge(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) + { +- addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; ++ proto_tree_add_item(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rlifetime, tvb, *pOffset, 4, TRUE); *pOffset+=4; +@@ -157,7 +133,7 @@ + + void parseDisconnect(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) + { +- addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; ++ proto_tree_add_item(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + } +@@ -169,7 +145,7 @@ + proto_tree *nodeid_tree; + int ServiceId = 0; + +- addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; ++ proto_tree_add_item(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; +@@ -195,7 +171,7 @@ + + void parseAbort(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) + { +- addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; ++ proto_tree_add_item(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; +@@ -203,7 +179,7 @@ + + void parseError(proto_tree *tree, tvbuff_t *tvb, gint *pOffset) + { +- addString(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, tvb->real_data); *pOffset+=4; ++ proto_tree_add_item(tree, hf_opcua_transport_sig, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_len, tvb, *pOffset, 4, TRUE); *pOffset+=4; + proto_tree_add_item(tree, hf_opcua_transport_cid, tvb, *pOffset, 16, TRUE); *pOffset+=16; + proto_tree_add_item(tree, hf_opcua_transport_rqid, tvb, *pOffset, 4, TRUE); *pOffset+=4; Index: debian/patches/33_fix_afs_crash.dpatch =================================================================== --- debian/patches/33_fix_afs_crash.dpatch (revision 0) +++ debian/patches/33_fix_afs_crash.dpatch (revision 14468) @@ -0,0 +1,36 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 33_fix_afs_crash.dpatch by <bal...@balintreczey.hu> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fix crash in AFS dissector + +...@dpatch@ + +--- wireshark-1.0.2/epan/dissectors/packet-afs.c.orig 2009-09-28 13:19:22.000000000 +0200 ++++ wireshark-1.0.2/epan/dissectors/packet-afs.c 2009-09-28 13:23:37.000000000 +0200 +@@ -414,19 +414,12 @@ + /* Output a rx style string, up to a maximum length first + 4 bytes - length, then char data */ + #define OUT_RXString(field) \ +- { guint32 i,len; \ +- char *tmp; \ +- const guint8 *p; \ +- i = tvb_get_ntohl(tvb, offset); \ +- offset += 4; \ +- p = tvb_get_ptr(tvb,offset,i); \ +- len = ((i+4-1)/4)*4; \ +- tmp = ep_alloc(i+1); \ +- memcpy(tmp, p, i); \ +- tmp[i] = '\0'; \ +- proto_tree_add_string(tree, field, tvb, offset-4, len+4, \ +- (void *)tmp); \ +- offset += len; \ ++ { guint32 i_orxs,len_orxs; \ ++ i_orxs = tvb_get_ntohl(tvb, offset); \ ++ len_orxs = ((i_orxs+4-1)/4)*4 + 4; \ ++ proto_tree_add_item(tree, field, tvb, offset-4, len_orxs, \ ++ FALSE); \ ++ offset += len_orxs; \ + } + + /* Output a fixed length vectorized string (each char is a 32 bit int) */ Index: debian/patches/30_pcnfsd_crash_fix.dpatch =================================================================== --- debian/patches/30_pcnfsd_crash_fix.dpatch (revision 0) +++ debian/patches/30_pcnfsd_crash_fix.dpatch (revision 14468) @@ -0,0 +1,84 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 24__pcnfsd_crash_fix.dpatch by <bal...@balintreczey.hu> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Fix buffer allocation to prevent crash + +...@dpatch@ + +Index: trunk/epan/dissectors/packet-pcnfsd.c +=================================================================== +--- trunk/epan/dissectors/packet-pcnfsd.c (revision 28127) ++++ trunk/epan/dissectors/packet-pcnfsd.c (revision 28128) +@@ -211,7 +211,10 @@ + } + + if (ident) { +- pcnfsd_decode_obscure(ident, strlen(ident)); ++ /* Only attempt to decode the ident if it has been specified */ ++ if (strcmp(ident, RPC_STRING_EMPTY)) ++ pcnfsd_decode_obscure(ident, (int)strlen(ident)); ++ + if (ident_tree) + proto_tree_add_string(ident_tree, + hf_pcnfsd_auth_ident_clear, +@@ -238,7 +241,10 @@ + } + + if (password) { +- pcnfsd_decode_obscure(password, strlen(password)); ++ /* Only attempt to decode the password if it has been specified */ ++ if (strcmp(password, RPC_STRING_EMPTY)) ++ pcnfsd_decode_obscure(password, (int)strlen(password)); ++ + if (password_tree) + proto_tree_add_string(password_tree, + hf_pcnfsd_auth_password_clear, +Index: trunk/epan/dissectors/packet-rpc.c +=================================================================== +--- trunk/epan/dissectors/packet-rpc.c (revision 28127) ++++ trunk/epan/dissectors/packet-rpc.c (revision 28128) +@@ -626,24 +626,21 @@ + char *formatted; + + formatted = format_text(string_buffer, strlen(string_buffer)); +- /* alloc maximum data area */ +-#define STRING_BUFFER_PRINT_MAX_LEN (strlen(formatted)+12+1) +- string_buffer_print = (char*)ep_alloc(STRING_BUFFER_PRINT_MAX_LEN); + /* copy over the data and append <TRUNCATED> */ +- g_snprintf(string_buffer_print, STRING_BUFFER_PRINT_MAX_LEN, "%s<TRUNCATED>", formatted); ++ string_buffer_print=ep_strdup_printf("%s%s", formatted, RPC_STRING_TRUNCATED); + } else { +- string_buffer_print="<DATA><TRUNCATED>"; ++ string_buffer_print=RPC_STRING_DATA RPC_STRING_TRUNCATED; + } + } else { + if (string_data) { + string_buffer_print = + ep_strdup(format_text(string_buffer, strlen(string_buffer))); + } else { +- string_buffer_print="<DATA>"; ++ string_buffer_print=RPC_STRING_DATA; + } + } + } else { +- string_buffer_print="<EMPTY>"; ++ string_buffer_print=RPC_STRING_EMPTY; + } + + if (tree) { +Index: trunk/epan/dissectors/packet-rpc.h +=================================================================== +--- trunk/epan/dissectors/packet-rpc.h (revision 28127) ++++ trunk/epan/dissectors/packet-rpc.h (revision 28128) +@@ -93,6 +93,10 @@ + #define AUTHDES_NAMEKIND_FULLNAME 0 + #define AUTHDES_NAMEKIND_NICKNAME 1 + ++#define RPC_STRING_EMPTY "<EMPTY>" ++#define RPC_STRING_DATA "<DATA>" ++#define RPC_STRING_TRUNCATED "<TRUNCATED>" ++ + extern value_string rpc_authgss_svc[]; + typedef enum { + FLAVOR_UNKNOWN, /* authentication flavor unknown */ Index: debian/patches/00list =================================================================== --- debian/patches/00list (revision 13620) +++ debian/patches/00list (revision 14468) @@ -17,3 +17,6 @@ 25_security_fixes_from_1.0.5 26_security_fixes_from_1.0.6 27_security_fixes_from_1.0.7 +30_pcnfsd_crash_fix.dpatch +33_fix_afs_crash.dpatch +34_fix_opcua_lockup.dpatch