CODESYS反序列化漏洞分析

阅读量    60076 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

CoDeSys是可编程逻辑控制PLC的完整开发环境(CoDeSysControlled Development System的缩写),它支持IEC61131-3标准IL ST FBD LD CFC SFC 六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序,功能模块等。在PLC程序员编程时,CoDeSys为强大的IEC语言提供了一个简单的方法,系统的编辑器和调试器的功能是建立在高级编程语言的基础上(Visual C++)

0x00 概述

CODESYS GmbH CODESYS Development System 3.5.163.5.17版本中存在反序列化漏洞,如CVE-2021-21864

根据CVE的漏洞相关描述,下载存在漏洞的CODESYS 3.5.16版本进行漏洞分析与复现。

0x01 漏洞复现

通过CVE漏洞的描述,可知此漏洞为BinaryFormatter()函数引起的反序列化漏洞,因为调用了恶意APStartupCulture文件导致执行系统命令。

通过processMonitor查看Codesys.exe进程运行信息,程序尝试查找APStartupCultureAPStartupCulture.xml文件,但是并未找到:

使用反序列化工具生成POC并命名为APStartupCulture

APStartupCulture文件放入ProgramData目录中

启动程序成功触发反序列化漏洞并执行POC程序

 

0x02漏洞分析

找到启动程序Main()函数:

跟进到Run()函数中,查看启动UI函数RunUI()

RunUI()函数中,没有看到启动参数,继续往下走:

启动了多个线程,调用了InitializeComponentManager()函数,跟进InitializeComponentManager()函数:

此函数中,对配置进行了设置以及初始化配置,此处有一个ComponentManager5()函数,跟进此函数查看:

ComponentManager5()依次继承最后来到ComponentManager()函数中,当执行到第67行代码时,跟进函数:

该函数功能是取出并查找文件APStartupCulture是否存在,然后进行判断:

随后打开文件并将数据赋值给stream变量,传入BinaryFormatter()函数进行反序列化:

往下执行之后,成功反序列化并执行我们的POC

 

0x03 总结

此反序列化漏洞为厂商意料之外的程序恶意调用,从漏洞分析结果来说,此漏洞整个调用链触发过程很简单,就是在某个目录下写个反序列化利用文件即可,还是印证了那句话,用户输入甚至所有外部输入都不可信任。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多