LDAP: Validate DNS name string encoding

This commit is contained in:
João Valverde 2022-10-19 14:51:32 +01:00
parent d20ed9491c
commit bd0102fc64
5 changed files with 44 additions and 50 deletions

View File

@ -82,6 +82,7 @@
#include <epan/asn1.h>
#include <epan/expert.h>
#include <epan/uat.h>
#include <epan/charsets.h>
#include <wsutil/str_util.h>
#include "packet-frame.h"
#include "packet-tcp.h"
@ -1312,11 +1313,7 @@ static void
}
}
/*
* prepend_dot is no longer used, but is being left in place in order to
* maintain ABI compatibility.
*/
int dissect_mscldap_string(tvbuff_t *tvb, int offset, char *str, int max_len, gboolean prepend_dot _U_)
int dissect_mscldap_string(tvbuff_t *tvb, int offset, int max_len, char **str)
{
int compr_len;
const gchar *name;
@ -1324,7 +1321,7 @@ int dissect_mscldap_string(tvbuff_t *tvb, int offset, char *str, int max_len, gb
/* The name data MUST start at offset 0 of the tvb */
compr_len = get_dns_name(tvb, offset, max_len, 0, &name, &name_len);
(void) g_strlcpy(str, name, max_len);
*str = get_utf_8_string(wmem_packet_scope(), name, name_len);
return offset + compr_len;
}
@ -1423,7 +1420,7 @@ static int dissect_mscldap_netlogon_flags(proto_tree *parent_tree, tvbuff_t *tvb
static int dissect_NetLogon_PDU(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
{
int old_offset, offset=0;
char str[256];
char *str;
guint16 itype;
guint16 len;
guint32 version;
@ -1487,17 +1484,17 @@ static int dissect_NetLogon_PDU(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
/* Forest */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_forest, tvb, old_offset, offset-old_offset, str);
/* Domain */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_domain, tvb, old_offset, offset-old_offset, str);
/* Hostname */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_hostname, tvb, old_offset, offset-old_offset, str);
/* DC IP Address */
@ -1523,42 +1520,42 @@ static int dissect_NetLogon_PDU(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
/* Forest */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_forest, tvb, old_offset, offset-old_offset, str);
/* Domain */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_domain, tvb, old_offset, offset-old_offset, str);
/* Hostname */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_hostname, tvb, old_offset, offset-old_offset, str);
/* NetBIOS Domain */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_nb_domain, tvb, old_offset, offset-old_offset, str);
/* NetBIOS Hostname */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_nb_hostname, tvb, old_offset, offset-old_offset, str);
/* User */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_username, tvb, old_offset, offset-old_offset, str);
/* Server Site */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_sitename, tvb, old_offset, offset-old_offset, str);
/* Client Site */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_clientsitename, tvb, old_offset, offset-old_offset, str);
/* get the version number from the end of the buffer, as the

View File

@ -89,7 +89,7 @@ typedef struct ldap_call_response {
} ldap_call_response_t;
WS_DLL_PUBLIC
int dissect_mscldap_string(tvbuff_t *tvb, int offset, char *str, int max_len, gboolean prepend_dot _U_);
int dissect_mscldap_string(tvbuff_t *tvb, int offset, int max_len, char **str);
WS_DLL_PUBLIC const value_string ldap_procedure_names[];

View File

@ -7667,27 +7667,27 @@ static int dissect_secchan_nl_auth_message(tvbuff_t *tvb, int offset,
/* DNS domain name */
if (messageflags&0x00000004) {
int old_offset=offset;
char str[256];
char *str;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(subtree, hf_netlogon_secchan_nl_dns_domain, tvb, old_offset, offset-old_offset, str);
}
/* DNS host name */
if (messageflags&0x00000008) {
int old_offset=offset;
char str[256];
char *str;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(subtree, hf_netlogon_secchan_nl_dns_host, tvb, old_offset, offset-old_offset, str);
}
/* NetBios host name (UTF8) */
if (messageflags&0x00000010) {
int old_offset=offset;
char str[256];
char *str;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(subtree, hf_netlogon_secchan_nl_nb_host_utf8, tvb, old_offset, offset-old_offset, str);
}

View File

@ -90,6 +90,7 @@
#include <epan/asn1.h>
#include <epan/expert.h>
#include <epan/uat.h>
#include <epan/charsets.h>
#include <wsutil/str_util.h>
#include "packet-frame.h"
#include "packet-tcp.h"
@ -336,7 +337,7 @@ static int hf_ldap_graceAuthNsRemaining = -1; /* INTEGER_0_maxInt */
static int hf_ldap_error = -1; /* T_error */
/*--- End of included file: packet-ldap-hf.c ---*/
#line 186 "./asn1/ldap/packet-ldap-template.c"
#line 187 "./asn1/ldap/packet-ldap-template.c"
/* Initialize the subtree pointers */
static gint ett_ldap = -1;
@ -408,7 +409,7 @@ static gint ett_ldap_PasswordPolicyResponseValue = -1;
static gint ett_ldap_T_warning = -1;
/*--- End of included file: packet-ldap-ett.c ---*/
#line 198 "./asn1/ldap/packet-ldap-template.c"
#line 199 "./asn1/ldap/packet-ldap-template.c"
static expert_field ei_ldap_exceeded_filter_length = EI_INIT;
static expert_field ei_ldap_too_many_filter_elements = EI_INIT;
@ -3816,7 +3817,7 @@ static int dissect_PasswordPolicyResponseValue_PDU(tvbuff_t *tvb _U_, packet_inf
/*--- End of included file: packet-ldap-fn.c ---*/
#line 910 "./asn1/ldap/packet-ldap-template.c"
#line 911 "./asn1/ldap/packet-ldap-template.c"
static int dissect_LDAPMessage_PDU(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ldap_conv_info_t *ldap_info) {
int offset = 0;
@ -4222,11 +4223,7 @@ static void
}
}
/*
* prepend_dot is no longer used, but is being left in place in order to
* maintain ABI compatibility.
*/
int dissect_mscldap_string(tvbuff_t *tvb, int offset, char *str, int max_len, gboolean prepend_dot _U_)
int dissect_mscldap_string(tvbuff_t *tvb, int offset, int max_len, char **str)
{
int compr_len;
const gchar *name;
@ -4234,7 +4231,7 @@ int dissect_mscldap_string(tvbuff_t *tvb, int offset, char *str, int max_len, gb
/* The name data MUST start at offset 0 of the tvb */
compr_len = get_dns_name(tvb, offset, max_len, 0, &name, &name_len);
(void) g_strlcpy(str, name, max_len);
*str = get_utf_8_string(wmem_packet_scope(), name, name_len);
return offset + compr_len;
}
@ -4333,7 +4330,7 @@ static int dissect_mscldap_netlogon_flags(proto_tree *parent_tree, tvbuff_t *tvb
static int dissect_NetLogon_PDU(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
{
int old_offset, offset=0;
char str[256];
char *str;
guint16 itype;
guint16 len;
guint32 version;
@ -4397,17 +4394,17 @@ static int dissect_NetLogon_PDU(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
/* Forest */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_forest, tvb, old_offset, offset-old_offset, str);
/* Domain */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_domain, tvb, old_offset, offset-old_offset, str);
/* Hostname */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_hostname, tvb, old_offset, offset-old_offset, str);
/* DC IP Address */
@ -4433,42 +4430,42 @@ static int dissect_NetLogon_PDU(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
/* Forest */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_forest, tvb, old_offset, offset-old_offset, str);
/* Domain */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_domain, tvb, old_offset, offset-old_offset, str);
/* Hostname */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_hostname, tvb, old_offset, offset-old_offset, str);
/* NetBIOS Domain */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_nb_domain, tvb, old_offset, offset-old_offset, str);
/* NetBIOS Hostname */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_nb_hostname, tvb, old_offset, offset-old_offset, str);
/* User */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_username, tvb, old_offset, offset-old_offset, str);
/* Server Site */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_sitename, tvb, old_offset, offset-old_offset, str);
/* Client Site */
old_offset=offset;
offset=dissect_mscldap_string(tvb, offset, str, 255, FALSE);
offset=dissect_mscldap_string(tvb, offset, 255, &str);
proto_tree_add_string(tree, hf_mscldap_clientsitename, tvb, old_offset, offset-old_offset, str);
/* get the version number from the end of the buffer, as the
@ -5654,7 +5651,7 @@ void proto_register_ldap(void) {
NULL, HFILL }},
/*--- End of included file: packet-ldap-hfarr.c ---*/
#line 2179 "./asn1/ldap/packet-ldap-template.c"
#line 2176 "./asn1/ldap/packet-ldap-template.c"
};
/* List of subtrees */
@ -5728,7 +5725,7 @@ void proto_register_ldap(void) {
&ett_ldap_T_warning,
/*--- End of included file: packet-ldap-ettarr.c ---*/
#line 2193 "./asn1/ldap/packet-ldap-template.c"
#line 2190 "./asn1/ldap/packet-ldap-template.c"
};
/* UAT for header fields */
static uat_field_t custom_attribute_types_uat_fields[] = {
@ -5937,7 +5934,7 @@ proto_reg_handoff_ldap(void)
/*--- End of included file: packet-ldap-dis-tab.c ---*/
#line 2385 "./asn1/ldap/packet-ldap-template.c"
#line 2382 "./asn1/ldap/packet-ldap-template.c"
dissector_add_uint_range_with_preference("tcp.port", TCP_PORT_RANGE_LDAP, ldap_handle);

View File

@ -97,7 +97,7 @@ typedef struct ldap_call_response {
} ldap_call_response_t;
WS_DLL_PUBLIC
int dissect_mscldap_string(tvbuff_t *tvb, int offset, char *str, int max_len, gboolean prepend_dot _U_);
int dissect_mscldap_string(tvbuff_t *tvb, int offset, int max_len, char **str);
WS_DLL_PUBLIC const value_string ldap_procedure_names[];