Codesys反序列化漏洞-CVE-2021-21867复现

Codesys反序列化漏洞-CVE-2021-21867复现

时间:2022-06-16 作者:安帝科技

CODESYS Development System是德国3S-Smart Software Solutions公司的一套用于工业控制器和自动化技术领域的编程工具。它支持IEC61131-3标准IL 、ST、 FBD 、LD、 CFC、 SFC 六种PLC编程语言,用户可以在同一项目中选择不同的语言编辑子程序、功能模块等。

Part1 漏洞状态

Part2 漏洞描述

CODESYS Development System 3.5.16和3.5.17的ObjectManager.plugin ObjectStream.ProfileByteArray功能中存在不安全反序列化漏洞,攻击者可借助特制的文件利用该漏洞执行任意命令。

Part3 漏洞复现

1. 实验环境
实验主机:win10 64
软件版本:CODESYS Development System 3.5.16.0(64位)
2.涉及工具
ysoserial.net
3.漏洞复现
1)构造恶意项目文件,首先使用反序列化工具ysoserial.net在命令行执行如下命令生成恶意项目文件:ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -o base64 -c “calc”
其次,将有效负载插入到项目文件的“Profile”数组字段中,如果导入成功会弹出计算器。构造的恶意文件如下:

2)将第一步生成的恶意项目文件导入到CODESYS Development System中,结果弹出计算器,如下图所示:

Part4 漏洞分析

借助dnspy反汇编工具对CODESYS.exe进行调试,导入文件时设置断点,该处会进行文件打开并读取操作,如下:

随后执行至ObjectStream.ProfileByteArray处,当执行至165行处,会将存储文件内容的变量“value”传递给“ChunkedMemoryStream”,如下图所示:

BinaryFormatter.Deserialize将执行反序列化操作,问题就出在此处,下面对反序列化过程进行详细描述。操作过程中会将“ChunkedMemoryStream”值传递给“serializationStream”,如下图所示:

在ObjectReader.Deserialize处首先调用__BinaryParser. __BinaryParser,如下图所示:

在__BinaryParser. __BinaryParser将“serializationStream”实例化一个steam对象,并赋值给“this”,如下图所示:

调用ObjectReader.Deserialize中对this进行反序列化操作。
在反序列化过程中,因为攻击向量为TypeConfuseDelegate,反序列化工程中会执行SortedSet的反序列化,其中IDeserializationCallback 接口定义的 OnDeserialization() 方法用于在反序列化后自动调用。

观看SortedSet 的OnDeserialization() 函数,可以看到其先取出 Comparer赋给当前新的 SortedSet对象,即this,然后调用Add方法来添加元素。如下图所示:

在SortedSet使用Add方法添加第二个元素时就会开始调用比较函数。也就是说,在反序列化SortedSet 时,会触发SortedSet排序,进而调用设置的比较器中的比较函数,如下图所示:

由于可以设置比较函数,而且传给比较函数的两个参数就是Add的前两个string 元素(可控),那么如果将比较函数设置为Process.Start() 函数,我们就可以实现代码执行了。

Part5 修复建议

将软件升级至3.5.17以后的版本。
—————————————————————–
目前,安帝科技工业互联网安全虚拟化靶场平台已集成该漏洞分析研究的环境和组件,可测试、验证、演示该漏洞及其利用过程。

靶机启动界面


漏洞复现过程文章

安帝科技工业网络靶场定位于一个能够映射真实的IT/OT运营环境的可配置和可扩展的成本效益比高的混合平台,可批量整合(虚拟、实体)OT环境特定的硬件资源(不同供应商的PLCs、HMIs、RTUs、历史数据库、SCADA等),同时模拟出IT/OT的各种工业流程场景和攻击场景,将虚拟化IT/OT网络与工业流程仿真模型相结合,提供安全可靠的科研、教育、培训、演练、对抗、比赛、演示等功能和服务。

工业互联网安全虚拟化靶场平台首页