新闻详情
原创漏洞 | CoDeSys反序列化漏洞
2025年11月10日

摘要

      这篇文章旨在介绍CoDeSys 3.5.21版本的软件在工程的打印功能中存在的反序列化漏洞。CoDeSys在解析工程文件时会读取其中的元数据,将其中的一些数据读入内存后,会利用BinaryFormatter类中的Deserialize方法对这些数据进行反序列化操作,攻击者可以将工程文件中的这些被反序列化的数据进行替换,从而实现任意代码执行。漏洞是由于CoDeSys在处理来自工程文件的数据流时,没有对数据流进行过滤,导致恶意代码被执行。该漏洞是由浙江国利网安科技有限公司工控安全实验室在2025年6月15日对CoDeSys进行数据流解析的分析过程中发现的,后续的漏洞修复工作请及时关注我司及CoDeSys官方公告。


2. 漏洞简介

漏洞类型:.net 反序列化漏洞

CNNVD漏洞编号:CNNVD-2025-37045757

产品供应商:德国3S公司

产品名称及版本:CoDeSys 3.5.21

利用效果:能够实现在用户正常打开工程文件进行操作时的代码执行

漏洞危害:攻击者可以利用漏洞,通过诱导用户打开恶意工程文件,在目标上位机上执行木马程序,实现对上位机的控制。

利用难度:利用难度一般,需要攻击者诱导用户打开恶意工程文件。

利用场景:属于ATT&CK框架TA0002执行阶段,T1203客户端执行漏洞利用。攻击者可以利用该漏洞将精心构造的工程文件发送给用户,用户打开工程文件并点击打印按钮时,执行攻击者构造的恶意命令,最终实现对用户计算机的控制。


3.CoDeSys介绍

      CoDeSys软件商是德国3S公司开发的PLC完整开发环境(CoDeSys是Controlled Development System的缩写),在PLC程序员编程时,CoDeSys为强大的IEC语言提供了一个简单的方法,它支持IEC61131-3标准IL 、ST、 FBD 、LD、 CFC、 SFC 六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序,功能模块等,系统的编辑器和调试器的功能是建立在高级编程语言的基础上。国际上多家控制器厂商施耐德/ABB/力士乐,国内和利时/研华/台达等均采用此款软件作为PLC的Runtime内核和PLC组态开发环境。


      CoDeSys是一款付费的软PLC开发软件,简单来说,它包括两部分:Development System和Runtime System。Development System就是用来编程的软件界面(就像Visual Studio、Eclipse等软件,也可以称为IDE),设计、调试、编译PLC程序都在IDE中进行,这部分是用户经常使用到的。


      控制器厂商在选择将CoDeSys作为其PLC的Runtime时,用户可以在CoDeSys的Development System软件中编写PLC组态程序,并把它下载到PLC硬件设备中运行。用户程序运行所依赖的环境是Runtime System,这部分是用户不可见的。


      二者安装的位置通常不同,IDE一般安装在开发电脑上,Runtime System则位于起控制作用的硬件设备上,二者一般使用网线连接,程序通过网线下载到Runtime中运行。


4.漏洞原理介绍

      用户在CoDeSys打开的工程文件中进行打印操作时,系统会从工程文件中读取相应的配置信息,其中PageSettings类对象接收的数据来自工程文件中的序列化后的数据。在对PageSettings对象进行赋值的时候,会先将从工程文件读取的数据进行反序列化,攻击者可以将工程文件中被反序列化的部分进行替换,从而在反序列化的过程中实现任意代码执行。

其中,该漏洞触发流程中的调用路径上的具体调用堆栈如下图所示。

 GetPageAndPrinterSettings函数的调用情况如下图所示,该函数是从工程文件中获取配置信息。

 GetPageAndPrinterSettings函数中会对PageSettings对象进行赋值,该值来自对array = (byte[])OptionsHelper.OptionKey [OptionsHelper.PAGE_SETTINGS]的反序列化,如下图所示。


最终的调用链会调用系统的Binary Formatter来进行反序列化,从而触发漏洞,其调用详情如下图所示


5.漏洞利用效果

      基于以上分析,我们通过对CoDeSys工程文件进行修改,将其中会被反序列化的部分进行替换,即可在其反序列化的过程中实现任意代码执行。

 之后将我们构造的替换工程文件中的对应属性,具体的代码如下所示。


最终会在目标计算机上执行我们的代码,打开计算器。


6.漏洞相关备注

      在实际环境中,对于CoDeSys3.5.21版本的目标,攻击者利用该漏洞可以诱导用户通过在CoDeSys中的正常操作实现本地执行任意代码。