VYPR
High severity7.5NVD Advisory· Published Jun 8, 2026

CVE-2026-3238

CVE-2026-3238

Description

A flaw was found in Samba’s WINS server component when running as an Active Directory Domain Controller. The WINS protocol handlers for certain request types did not properly validate incoming packets, allowing an unauthenticated remote attacker to trigger a NULL pointer dereference and crash the WINS service using specially crafted UDP packets.

Affected products

3

Patches

2
15fce8ff6141

CVE-2026-3238: winsserver4: Validate incoming packets

https://github.com/samba-team/sambaVolker LendeckeFeb 24, 2026via github-commit-search
1 file changed · +11 0
  • source4/nbt_server/wins/winsserver.c+11 0 modified
    @@ -472,9 +472,16 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
     	struct winsdb_addr *winsdb_addr = NULL;
     	bool duplicate_packet;
     
    +	NBTD_ASSERT_PACKET(packet, src, packet->qdcount > 0);
    +	NBTD_ASSERT_PACKET(packet, src, packet->arcount > 0);
    +
     	name = &packet->questions[0].name;
     	additional = packet->additional;
     
    +	NBTD_ASSERT_PACKET(packet,
    +			   src,
    +			   additional[0].rdata.netbios.length > 0);
    +
     	addresses = additional[0].rdata.netbios.addresses;
     
     	nb_flags = addresses[0].nb_flags;
    @@ -747,6 +754,8 @@ static void nbtd_winsserver_query(struct loadparm_context *lp_ctx,
     	const char **addresses_1b = NULL;
     	uint16_t nb_flags = 0;
     
    +	NBTD_ASSERT_PACKET(packet, src, packet->qdcount > 0);
    +
     	name = &packet->questions[0].name;
     
     	if (name->type == NBT_NAME_MASTER) {
    @@ -889,6 +898,8 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
     	uint32_t modify_flags = 0;
     	uint8_t ret;
     
    +	NBTD_ASSERT_PACKET(packet, src, packet->qdcount > 0);
    +
     	name = &packet->questions[0].name;
     
     	if (name->type == NBT_NAME_MASTER) {
    
20335fb88aaf

CVE-2026-3238: winsserver4: Dissolve direct variable initialization

https://github.com/samba-team/sambaVolker LendeckeFeb 24, 2026via github-commit-search
1 file changed · +21 6
  • source4/nbt_server/wins/winsserver.c+21 6 modified
    @@ -460,16 +460,27 @@ static void nbtd_winsserver_register(struct nbt_name_socket *nbtsock,
     	struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private_data,
     						       struct nbtd_interface);
     	struct wins_server *winssrv = iface->nbtsrv->winssrv;
    -	struct nbt_name *name = &packet->questions[0].name;
    +	struct nbt_name *name = NULL;
     	struct winsdb_record *rec;
     	uint8_t rcode = NBT_RCODE_OK;
    -	uint16_t nb_flags = packet->additional[0].rdata.netbios.addresses[0].nb_flags;
    -	const char *address = packet->additional[0].rdata.netbios.addresses[0].ipaddr;
    +	struct nbt_res_rec *additional = NULL;
    +	uint16_t nb_flags;
    +	const char *address = NULL;
    +	struct nbt_rdata_address *addresses = NULL;
     	bool mhomed = ((packet->operation & NBT_OPCODE) == NBT_OPCODE_MULTI_HOME_REG);
    -	enum wrepl_name_type new_type = wrepl_type(nb_flags, name, mhomed);
    +	enum wrepl_name_type new_type;
     	struct winsdb_addr *winsdb_addr = NULL;
     	bool duplicate_packet;
     
    +	name = &packet->questions[0].name;
    +	additional = packet->additional;
    +
    +	addresses = additional[0].rdata.netbios.addresses;
    +
    +	nb_flags = addresses[0].nb_flags;
    +	address = addresses[0].ipaddr;
    +	new_type = wrepl_type(nb_flags, name, mhomed);
    +
     	/*
     	 * as a special case, the local master browser name is always accepted
     	 * for registration, but never stored, but w2k3 stores it if it's registered
    @@ -729,13 +740,15 @@ static void nbtd_winsserver_query(struct loadparm_context *lp_ctx,
     	struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private_data,
     						       struct nbtd_interface);
     	struct wins_server *winssrv = iface->nbtsrv->winssrv;
    -	struct nbt_name *name = &packet->questions[0].name;
    +	struct nbt_name *name = NULL;
     	struct winsdb_record *rec;
     	struct winsdb_record *rec_1b = NULL;
     	const char **addresses;
     	const char **addresses_1b = NULL;
     	uint16_t nb_flags = 0;
     
    +	name = &packet->questions[0].name;
    +
     	if (name->type == NBT_NAME_MASTER) {
     		goto notfound;
     	}
    @@ -871,11 +884,13 @@ static void nbtd_winsserver_release(struct nbt_name_socket *nbtsock,
     	struct nbtd_interface *iface = talloc_get_type(nbtsock->incoming.private_data,
     						       struct nbtd_interface);
     	struct wins_server *winssrv = iface->nbtsrv->winssrv;
    -	struct nbt_name *name = &packet->questions[0].name;
    +	struct nbt_name *name = NULL;
     	struct winsdb_record *rec;
     	uint32_t modify_flags = 0;
     	uint8_t ret;
     
    +	name = &packet->questions[0].name;
    +
     	if (name->type == NBT_NAME_MASTER) {
     		goto done;
     	}
    

Vulnerability mechanics

Synthesis attempt was rejected by the grounding validator. Re-run pending.

References

3

News mentions

0

No linked articles in our index yet.