CoDeSys是可编程逻辑控制PLC的完整开发环境(CoDeSys是Controlled Development System的缩写),它支持IEC61131-3标准IL 、ST、 FBD 、LD、 CFC、 SFC 六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序,功能模块等。在PLC程序员编程时,CoDeSys为强大的IEC语言提供了一个简单的方法,系统的编辑器和调试器的功能是建立在高级编程语言的基础上(如Visual C++)。
0x00 概述
在CODESYS GmbH CODESYS Development System 3.5.16和3.5.17版本中存在反序列化漏洞,如CVE-2021-21864:
根据CVE的漏洞相关描述,下载存在漏洞的CODESYS 3.5.16版本进行漏洞分析与复现。
0x01 漏洞复现
通过CVE漏洞的描述,可知此漏洞为BinaryFormatter()函数引起的反序列化漏洞,因为调用了恶意APStartupCulture文件导致执行系统命令。
通过processMonitor查看Codesys.exe进程运行信息,程序尝试查找APStartupCulture和APStartupCulture.xml文件,但是并未找到:
使用反序列化工具生成POC并命名为APStartupCulture
将APStartupCulture文件放入ProgramData目录中
启动程序成功触发反序列化漏洞并执行POC程序
0x02漏洞分析
找到启动程序Main()函数:
跟进到Run()函数中,查看启动UI函数RunUI():
在RunUI()函数中,没有看到启动参数,继续往下走:
启动了多个线程,调用了InitializeComponentManager()函数,跟进InitializeComponentManager()函数:
此函数中,对配置进行了设置以及初始化配置,此处有一个ComponentManager5()函数,跟进此函数查看:
ComponentManager5()依次继承最后来到ComponentManager()函数中,当执行到第67行代码时,跟进函数:
该函数功能是取出并查找文件APStartupCulture是否存在,然后进行判断:
随后打开文件并将数据赋值给stream变量,传入BinaryFormatter()函数进行反序列化:
往下执行之后,成功反序列化并执行我们的POC:
0x03 总结
此反序列化漏洞为厂商意料之外的程序恶意调用,从漏洞分析结果来说,此漏洞整个调用链触发过程很简单,就是在某个目录下写个反序列化利用文件即可,还是印证了那句话,用户输入甚至所有外部输入都不可信任。