CVE-2026-41502BACnet Stack是一款专为嵌入式系统设计的BACnet开源协议栈C语言库。在1.4.3版本之前,该库的ReadPropertyMultiple服务解码器中存在一个严重的差一错误(Off-by-one)导致的越界读取漏洞。未经身份验证的远程攻击者可以通过发送特制的、包含截断对象标识符的RPM请求,利用此漏洞读取超出已分配缓冲区边界的一个字节数据。由于验证逻辑与实际内存访问长度不一致,这种攻击可能导致嵌入式BACnet设备服务崩溃,从而严重影响设备的可用性。
该漏洞位于src/bacnet/rpm.c文件的rpm_decode_object_id()函数中,其根本原因是长度校验逻辑与实际内存访问操作之间的不匹配。函数首先执行检查`if (apdu_len < 5)`,如果条件成立则返回错误。然而,在后续的数据包解析过程中,代码实际上访问了apdu数组的索引0到5(共6个字节)。具体的访问流程包括:消耗1字节作为上下文标签,4字节作为对象标识符,最后尝试读取apdu[5]用于检查开放标签。当攻击者精心构造一个长度恰好为5字节的输入包时,该输入能够顺利通过apdu_len < 5的长度检查,但在代码执行到读取apdu[5]的位置时,会发生1字节的越界读取。这是一个典型的Off-by-one错误。由于ReadPropertyMultiple确认服务处理程序在参考服务器中默认处于启用状态,未经身份验证的远程攻击者可直接利用此漏洞,导致设备读取非法内存地址,进而引发拒绝服务或设备崩溃。