新闻中心
联系我们

总机:  010-8250-9710

热线:  400-1066-819

邮箱:  support@icssla.com
地址:  北京市海淀区上地东路1号院华控大厦7层

工控协议研究:剖析Profinet安全性

返回

2025-10-21 公司原创

 

一、概述

Profinet 是一种应用于工业自动化的通信协议,采用高速、可靠的网络技术,实现工业设备间的高效连接与数据交互。作为一套全功能的工业通信标准,Profinet协议支持控制、监视、数据采集、报警等多种功能,已成为当前最主流的工业自动化通信协议之一。

就功能来说,Profinet可以通过网络实现设备远程控制,支持多种监视类型,包括实时、状态、设备和数据监控等。还可以支持多种数据采集类型,包括实时、历史、状态和设备数据采集等。

Profinet协议作为一项国际标准,获得了众多工控厂商的兼容。比如西门子、施耐德等厂商的核心产品均可以兼容该协议通信,以融入多元化的工业网络。

 

 

二、Profinet协议分析

2.1 协议框架

Profinet协议的通信可以从实时性、用途等维度大概可以分为三类:

●非实时通信:工程数据及没有时间严格要求的数据在TCP/IP上传输的可以采用。适用于在配置、管理、诊断、报警、程序下载等场景下。使用UDP协议,常用端口为34964。

●实时通信(RT):实时通道用于传输过程数据。适用于I/O 数据交换;时延约 <10 ms,直接在 MAC 层直接封装不走TCP/IP协议族。

●等时实时通信(IRT):对于等时同步应用、时间进度要求高,使用等时同步实时通信(IRT),可实现小于1ms 的时钟速率和小于1µs的时钟精度。 IRT的精确传输能力基于设备中的硬件支持。

协议架构图如下:

Profinet协议架构

从协议架构可知,Profinet协议使用了物理层、链路层、网络层、传输层与应用层协议,网络层与传输层则沿用TCP/IP协议族的标准,而独到之处在于数据链路层与应用层的规范。由图可知,Profinet实时数据直接跨过应用层,不经过其他层次,尽可能提高传输效率,而其他常规数据则经过传统的协议层次通信。

 

2.2 通信流程

CodeSys支持Profinet模块,常见的协议栈则是RT-Labs P-Net作为从站,我们在本地通过搭建环境,来研究Profinet协议通信过程:

设备寻址:控制器会通过链路层对网络中的所有Profinet设备进行寻址,通过在寻址完成之后进行主从站的配置写入。

 

建立连接:在系统寻址完成步骤后,开始Profinet系统通信,由控制器发起建立与从站设备之间的通讯连接。首先控制器会发出“Connect帧”报文“Connect.req”用来建立连接,当从站向控制器返回Connect.res OK”表示连接已经成功建立。

周期性通讯数据:当控制器与现场从站设备通讯成功之后,控制器与从站之间会进行周期性数据传输。

2.3 协议格式

上述讲到Profinet协议根据响应时间不同分为非实时通信、实时(RT)报文通信和等时实时(IRT)报文通信,他们之间最主要的区别在于是否具有高实时性,有严格确定性。因此在数据报文格式方面针对不同的通信类型,也有些许区别。

接下来开始介绍RT报文格式

与RT帧相比,IRT帧删掉了VLAN部分,直接使用Frame_ID指示帧类型,减少开销,提高传输速率,IRT帧结构如下图所示:

对如上帧结构参数解释:

上面介绍了RT和IRT协议的报文格式,接下来简单介绍下PN-DCP、PNIO-CM、PNIO-PS等几种常见的报文格式。

PN-DCP(Discovery Configuration Protocol)即发现和配置协议,用于对IO设备进行地址解析和名称分配,其工作在OSI七层中的第二层-数据链路层,所以主要的识别站点的ID就是MAC地址。DCP在PROFINET中设置(Set),识别(ldentify),Hello,获取(Get)等功能。下面将以Set为例介绍报文。

详细数据包结构如下图:

PNIO-CM(Context Manager),即上下文管理协议,是用于设备和主站建立、维护和终止通信连接,基于UDP协议的RPC发起连接请求。其中连接的数据报文如下所示:

PNIO-PS(Provider Status),即PROFINET IO 协议服务,是Profinet中用于传输实时过程数据(如I/O状态)和报警数据的协议,工作在实时通道上,直接承载在以太网数据链路层,、协议数据报文如下:

 

三、攻击面与漏洞分析

3.1 攻击面梳理

Profinet协议通过以往的漏洞暴露来说可能存在如下攻击:

● 中间人攻击:通过在局域网内发起 ARP 欺骗,使攻击者伪装成网关或目标设备,拦截 Profinet 报文流量。可在不中断通信的情况下窃取、篡改、转发数据,实施命令注入、设备重配置或配置劫持等操作,严重时可控制整个工业网络。

● 身份未认证:Profinet协议在关键通信过程中缺乏身份认证机制,攻击者无需授权即可发送DCP、RPC等协议报文,远程修改设备参数、重启设备或伪造响应。这种未认证设计使攻击门槛大大降低,即使非可信用户也能发起配置更改或中断服务等攻击,严重威胁工业网络的可用性与完整性。

● 溢出漏洞:例如在开源 P-Net 1.0.1 或更早版本中,由于对接收的 RPC 数据包缺乏校验,攻击者可构造特定格式的恶意数据,通过堆内存写入溢出触发崩溃。这种基于堆的缓冲区溢出漏洞可导致使用该协议栈的 IO 设备失效或异常重启,进而影响整个工业控制流程的稳定性和安全性。

 

3.2 漏洞分析

3.2.1漏洞概述

P-Net是RT-Labs开发的一个ProfiNET从站协议栈,用C语言编写,主要用于工业 IO 设备进行实时数据交换(注:早期P-Net是开源的,现由于发展压力已经往商业闭源方向转变,之前完整的开源代码已经封存)

本文主要讲述最新的CVE-2025-32405漏洞的分析和验证过程,该漏洞存在于P-Net 1.0.1 及早期版本中。漏洞点位于pf_cmrpc_rm_connect_interpret_ind函数中,当协议栈在处理构造恶意的远程过程调用数据包时,未经认证的远程攻击者可触发越界写,可破坏内存并导致I/O 设备崩溃,从而造成设备不可用或服务中断。

3.2.2漏洞产生原理

通过分析P-Net源码,当P-Net在解析 ArVendorBlock 请求时,它会递增一个计数器用作索引,并将相应协议数据保存到数组中。

由于没有判断计数器是否越界,当发送足够的数据包时,索引值就会超出数组的限制。

计数器设置的最大范围如下:

通过构造非预期的数据包后,代码出现内存越界,调试得到实际的计数器值如下:

 

3.2.3漏洞验证

基于存在漏洞的p-net V0.0.2版本,在本地搭建测试环境,步骤如下:

编译成功后,执行gdb pn_dev命令来调试:

通过对上述漏洞分析,我们构造了ArVendorBlock数据包,部分内容如下:

在p_ar->nbr_ar_vendor++ 代码处设置断点,发送构造的UDP数据包,断点成功触发。

当下标超过PNET_MAX_AR_VENDOR_BLOCKS时,ar_vendor_request越界写入到ar_vendor_result中,导致结构体后面数据被破坏,并且这部分数据可控,可以进一步利用,越界写结果如下图所示:

 

四、安全防护建议

● 软固件升级:升级是最直接有效的防护手段,建议尽快将协议栈升级至更高版本,新版本已修复多个堆溢出和空指针等严重漏洞,能显著提升系统稳定性与安全性。

● 安全设备部署:建议在工业网络边界部署防火墙或工业网关,对 Profinet 关键端口如 TCP/34964、UDP/34964 实施访问控制,仅允许可信主机通信,有效防止未授权访问和远程攻击行为。

● 定期安全测试:建议定期使用协议测试工具或Fuzzing手段对Profinet通信进行安全测试,同时持续关注相关CVE漏洞公告,对存在漏洞的版本及时修补,确保系统始终处于安全状态。

● 监控与审计:建议部署工业级 IDS/IPS 系统,对 Profinet 协议流量进行深度解析与行为分析,实时监控异常请求、通信中断等可疑行为。

 

参考链接:

1.https://www.nozominetworks.com/blog/fuzzing-the-p-net-profinet-implementation

2.https://github.com/rtlabs-com/p-net