CVE-2025-66624BACnet Protocol Stack是一个开源的BACnet协议栈库,提供BACnet应用层、网络层和媒体访问层(MAC)的通信服务。该库广泛应用于楼宇自动化控制系统中的设备通信。
在1.5.0.rc2之前的版本中,src/bacnet/npdu.c文件中的npdu_is_expected_reply函数存在严重的越界读取漏洞。该函数在访问request_pdu[offset+2/offset+3/offset+5]和reply_pdu[offset+1/offset+2/offset+4]时,没有验证这些APDU字节是否存在。
具体而言,bacnet_npdu_decode()函数可能返回offset==2,这意味着即使对于只有2字节的极小NPDU数据,也能通过版本检查,但随后在访问数组元素时会触发越界读取。这种畸形数据包会导致程序访问非法内存地址。
在启用AddressSanitizer(ASan)、MPU或strict编译选项的构建中,这会导致程序立即崩溃,造成拒绝服务(DoS)攻击。在未受保护的构建中,会产生未定义行为,可能导致内存状态损坏或错误路由响应。虽然远程代码执行(RCE)的可能性较低(因为只发生读取操作),但拒绝服务攻击是可靠且可重现的。
攻击者无需认证即可利用此漏洞,通过发送精心构造的恶意NPDU数据包即可触发崩溃,影响BACnet网络中的所有依赖该协议通信的楼宇自动化系统。
漏洞根因位于BACnet Protocol Stack的src/bacnet/npdu.c文件中的npdu_is_expected_reply函数。该函数负责判断接收到的NPDU(网络层协议数据单元)是否应该触发回复。
问题代码模式如下:
函数在访问request_pdu和reply_pdu数组时使用固定偏移量(如offset+2、offset+3、offset+5等)进行索引,但未检查这些偏移量是否在数组边界内。正常情况下,bacnet_npdu_decode()会解析NPDU头部并返回适当的偏移值,但攻击者可以构造畸形的NPDU数据包来绕过这一检查。
具体攻击向量:
1. 攻击者构造仅包含2字节的NPDU数据:第一个字节为版本号(0x01),第二个字节为任何值
2. bacnet_npdu_decode()解析后返回offset=2
3. npdu_is_expected_reply函数尝试访问request_pdu[2+2]、request_pdu[2+3]、request_pdu[2+5]等位置
4. 由于原始数据包只有2字节,这些访问都是越界读取
5. 在ASan环境下立即触发堆缓冲区溢出检测,程序崩溃
6. 在普通环境下读取到未分配或敏感内存,可能导致系统行为异常
漏洞影响范围包括所有使用受影响版本BACnet Protocol Stack的楼宇自动化设备,如HVAC系统、门禁控制、消防报警等关键基础设施。