- 全部
- 企业新闻
- 行业动态
- 前沿技术

总机: 010-8250-9710
热线: 400-1066-819


工控协议研究:BACnet安全分析
返回2025-08-22 公司原创
1、概述
BACnet(Building Automation and Control Networks,楼宇自动化与控制网络)是一种专为智能建筑设计的通信协议。通常,楼宇自动化控制设备的功能可分为两部分:一是实现设备自身的控制功能,二是负责与其他设备进行数据通信。BACnet的核心目标是为楼宇自动化系统建立统一的通信与控制标准,实现不同厂商、不同类型设备之间的互联互通。
在协议架构上,BACnet基于OSI七层模型,涉及四个层次:物理层、数据链路层、网络层和应用层。其中,网络层和应用层才是BACnet协议的核心点,真正定义了BACnet通信标准的关键内容。
BACnet 旨在实现楼宇自动化和控制系统之间的通信,适用于供暖、通风和空调控制 (HVAC)、照明控制、门禁控制、火灾探测系统及其相关设备等应用。BACnet 协议为计算机化的楼宇自动化设备提供了交换信息的机制。
2、BACnet协议分析
2.1 协议框架
BACnet协议采用分层架构设计,其层次划分遵循OSI参考模型的简化原则,将复杂的通信过程分解为四个核心功能层,每层各司其职又紧密协同,共同实现楼宇自动化设备的高效通信。
四个层次自顶向下依次为:应用层负责业务逻辑交互,定义设备对象模型和标准服务;网络层处理设备寻址和报文路由,实现跨网络通信;链路层适配不同物理网络,完成协议数据的封装与传输;物理层则提供具体的硬件连接介质。各层通过标准化的接口进行数据传递,具体层次如下图:
2.2 BACnet协议栈与数据流
BACnet协议数据是根据ISO模型进行逐层封装解析,数据流向如下:
2.3协议格式
BACnet 是一种基于 UDP的楼宇自动化和控制网络通信协议,默认端口47808,包含 3 个主要标头:BVLC、NPDU 和 APDU。
BVLC是BACnet虚拟链路控制的简称,主要功能是在IP网络中的封装、传输控制和设备发现,4个字节。
流量包如下图所示:
NPDU是 BACnet协议栈的网络层数据单元,负责在BACnet设备之间提供网络层路由和通信控制。它位于 BVLC 和 APDU 之间,确保BACnet报文能够正确寻址、分段和传输。
APDU是 BACnet协议栈的应用层数据单元,负责在BACnet设备之间传输具体的应用层数据,许多指令都在应用层进行传输,如读取传感器数据、控制设备开关等应用操作。它是BACnet协议通信比较重要的一环,封装了设备之间的实际交互信息。
3、攻击面与漏洞分析
3.1 攻击方式
早期BACnet协议并未考虑安全问题,但随着 BACnet广泛接入企业网甚至互联网,安全问题凸显出来,因此在2019年,BACnet/SC安全扩展应运而生,BACnet/SC可提供一个安全加密的数据链路层,可抵御重放等攻击。尽管如此,BACnet仍可能存在如下安全问题:
● BACnet 欺骗:类似于 IT 网络中的 ARP 欺骗,攻击者可以通过伪造设备标识或广播虚假消息,诱导其他设备将流量错误地转发到攻击者的设备,实现网络攻击。
● 拒绝服务攻击:攻击者通过大量广播请求向 BACnet 网络中的所有设备发起通信请求,迫使所有设备响应,造成网络拥塞,影响设备正常通信,严重时可导致设备崩溃或服务中断,另外有研究显示由于协议栈分段错误,可通过构造数据包实现服务崩溃。(后文通过漏洞分析案例来阐述)
● 写入功能攻击:攻击者利用 BACnet 写操作功能恶意修改设备对象的属性值。根据被篡改的对象类型,可能导致设备状态异常、系统故障,甚至影响物理过程(如温度、压力、开关状态等关键参数)。
● 禁用网络连接:攻击者可通过滥用 BACnet 的路由服务或发送伪造控制消息,破坏 BACnet 网络路由表,导致设备通信异常。此外,通过 DeviceCommunicationControl 服务,攻击者也可以强制关闭指定设备的网络连接,造成设备离线。
3.2漏洞分析
3.2.1漏洞介绍
BACnet Stack 是一个开源的 BACnet 协议栈实现,由 Steve Karg 等开发维护,主要使用 C 语言编写,遵循 ASHRAE 标准(ANSI/ASHRAE Standard 135)。它为开发者提供了从底层数据帧解析到高层服务处理的完整功能模块,方便将 BACnet 通信能力嵌入到各种楼宇自动化设备和软件中。该协议栈主要用于楼宇控制设备固件开发、楼宇管理系统通信模块以及工业控制与物联网网关。
漏洞存在于 BACnet Stack 中的 dcc_decode_service_request 函数(用于解析 DeviceCommunicationControl 服务请求)中。
在处理传入的 DeviceCommunicationControl APDU(应用层协议数据单元)时,程序没有对输入数据的长度进行充分验证,导致攻击者可通过构造恶意数据包触发 缓冲区越界读取/写入。
3.2.2漏洞验证
基于存在漏洞的BACnet-stack 0.8.6版本,在本地搭建测试环境,步骤如下:
编译成功后,执行demo/server/bacserv命令运行进程:
编写漏洞利用脚本,模拟攻击验证其安全性缺陷,脚本攻击过程如下图所示:
服务端收到相应的payload攻击后,服务瞬间崩溃,通信端口关闭,如下图所示:
3.3.3漏洞产生原理
位于 bacdcode.c 文件中的解析逻辑在处理 decode_tag_number(报警标签号)时出现问题,未对某些边界或异常值进行充分验证,导致读取越界,从而触发 segmentation fault,使得 bacserv 守护进程崩溃。
调用链如下图:
由下图调试信息可知,从rdi指向的地址读取一个字节时报错。rdi指向的地址在进程的虚拟地址空间无效,所以当CPU试图访问[rdi]时直接触发SIGSEGV。
04、安全防护建议
为了降低 BACnet 协议在工业控制系统中的安全风险,企业应从网络层面、设备层面、监控与审计等多个维度入手,构建一套切实可行的防护体系,例如:
● 网络分段与隔离
将BACnet设备划分至独立VLAN,通过防火墙严格管控访问权限,仅开放必要的UDP 47808端口。同时禁用非必要的广播功能,有效隔离潜在威胁,防止攻击者在网络内横向移动,提升整体安全性。
● 入侵检测部署
部署支持BACnet协议的入侵检测系统,实时监控网络流量,识别异常行为。通过特征规则匹配和异常流量分析,及时发现并阻断潜在攻击,为网络提供主动防御能力。
● 固件与补丁管理
建立定期更新机制,及时修复设备固件中的已知漏洞。对老旧设备进行升级,禁用不安全的协议,确保系统运行在最新安全版本上,消除潜在攻击面。
● 访问控制强化
强制修改默认密码,启用BACnet设备身份认证功能。基于最小权限原则配置用户访问权限,对关键操作实施多因素认证,防止未授权访问和恶意操控。
参考链接:
1.https://github.com/bacnet-stack/bacnet-stack/releases/tag/bacnet-stack-0.8.6
2.https://nvd.nist.gov/vuln/detail/CVE-2019-12480
3.https://1modm.github.io/CVE-2019-12480.html
