Codesys V3协议漏洞挖掘方法

news2025/1/14 18:18:05

背景概述

Codesys是全球最著名的软PLC内核软件研发厂家德国的3S(SMART,SOFTWARE,SOLUTIONS)公司发布的一款与制造商无关IEC 61131-1编程软件及工控设备内核(runtime SDK)。Codesys 支持完整版本的IEC61131标准的编程环境,支持标准的六种编程语言,是一个标准的与硬件无关的Runtime,被很多硬件厂家支持, Codesys提供了许多组合产品的扩充,诸如各种不同领域的总线配置程序和运动控制系统。

由于Codesys提供的解决方案覆盖全面、功能强大、开发周期短、灵活性高、支持硬件架构及操作系统丰富等原因在全球工控厂商中广泛使用,据官方统计使用Codesys解决方案的知名企业超过500家,Codesys市场占有率为35%,其中我们熟知ABB、施耐德电气、费斯托Festo、伊顿电气、博世力士乐、WAGO、倍福BECKHOFF、研华科技、凌华科技、巴赫曼Bachmann、KEBA、深圳合信、汇川技术、深圳英威腾、华中数控、步科、固高科技等等都使用了Codesys Runtime。

更详细的合作厂商及案例见Codesys厂商网站:http://www.codesys.cn/list-Partner-1.html

1691411677_64d0e4ddf17f0b58b5be4.png!small?1691411678821

正因为诸多知名工控厂商大规模使用该内核,因此Codesys产品的安全性影响巨大。一旦源头出现问题则很有可能影响诸多厂商的多款产品使工业生产过程面临严重威胁。出于此目的,笔者从2021年开始研究Codesys V2相关产品并发现了数十个漏洞,提交给厂商后经过修改发布了最新修复版本,详情请见链接[1]所示。Codesys V2产品设计理念只关注了功能业务在信息安全方面涉及较少。目前主推的Codesys V3产品宣称加入了信息安全的设计考量,那么是不是就无懈可击呢?本文就带领大家看看笔者是如何从Codesys厂商的安全通告出发一步步发现多个漏洞的。

信息收集

先打开Codesys厂商的安全通告网站,浏览相关安全通告。

1691411897_64d0e5b9bdd7952f7e993.png!small?1691411898528

2023-2的这份通告[2]吸引了笔者的注意力,其中包含了大量的漏洞而且都是通信协议相关,最重要的是暴露了很多敏感信息让我们可以从中分析出很有价值的信息。下图为CVE编号总数为16个,且影响的是V3.5.19.0以前的所有版本的多个通信组件。

1691411930_64d0e5dad9d248c853110.png!small?1691411931669

从通告中选取存在CVE编号最多的一个组件开始详细分析,这些漏洞的类型为栈溢出,影响组件名称为CmpTraceMgr。可以得出结论:在Codesys V3.5.19.0之前版本中CmpTraceMgr组件存在多个地方的栈溢出漏洞。

1691411958_64d0e5f6366339ea6e110.png!small?1691411958555

接下来我们的思路如下:

  1. 搭建Codesys V3.5.19.0之前任一版本和该版本环境,从Codesys V3自带模拟器control win V3出发分析在CmpTraceMgr组件中修改了哪些存在栈溢出风险的代码
  2. 在存在漏洞的Codesys模拟器环境下构造报文进行漏洞复现和分析;
  3. 学习2023-2安全通告中微软研究人员的相关思路,在修复后的版本模拟器中挖掘漏洞;

环境搭建

在Codesys厂商官网下载受影响的版本Codesys V3.5.18.20

1691412044_64d0e64c4673cde06bce0.png!small?1691412044925

将其安装在Windows 10虚拟机中,安装后启动模拟器,并且在x64dbg工具中将其进程附加,如下所示

1691412086_64d0e6767d51330791e00.png!small?1691412086818

由于模拟器使用了威步wibu的安全解决方案因此需要利用插件从内存中对其dump后进行整体分析

1691412117_64d0e695eb1228923afad.png!small?1691412118271

同样,我们还需要下载修改漏洞后的版本Codesys V3.5.19.0软件并在另外一个虚拟机上安装,安装后同样进行dump内存操作。

将2个dump后的内存文件分别保存,以备后续步骤使用。准备两个不同版本的模拟器后,还需要搭建一个IDE开发环境,给两个模拟器中分别下装简单的测试工程,如下所示。

1691412168_64d0e6c82b61b173b116b.png!small?1691412169148

漏洞点定位

将前述的两个dump文件导入至IDA进行分析,首先对Codesys V3.5.18.20的CODESYSControlService_dump.exe进行分析。

  1. 通过字符串定位CmpTraceMgr组件位置,直接利用CmpTraceMgr字符串定位发现存在诸多困难,比如字符搜索“CmpTraceMgr”出现的引用较少,函数之间也没有引用关系,或者利用引用字符串搜索出现的调用有太多,如下所示

1691412270_64d0e72e34b0394d4b7ad.png!small?1691412271346

基于此需要变换策略,有两个思路:A.搭建环境,在IDE编程软件中添加trace功能,执行多项操作,抓取报文从报文信息出发进行关键词搜索;B.利用Codesys V3带有符号的固件代码进行比对快速定位关键点;

  1. 基于1步骤提出的B思路,从某个使用了Codesys V3 Runtime的固件(带有符号表)中比对搜索CmpTraceMgr,再在关键位置找到特征字符串后,利用该字符串在5.18.20模拟器dump分析文件中进行搜索。如下图是在带有符号表的固件中搜索结果

1691412393_64d0e7a98f39f97bafdf1.png!small?1691412394082

再在该函数中寻找特殊字符“Creating events failed”

1691412428_64d0e7cc101d1b680f5b5.png!small?1691412428345

接下来利用特殊字符在目标文件中进行搜索,并且可以对照带有符号表的固件对目标文件进行函数重命名;

  1. 利用Creating events failed作为特征字符搜索定位

1691412481_64d0e8018893f1499693b.png!small?1691412481870

在该函数中寻找CmpTraceMgr处理部分,最终定位到函数为TraceMgr的处理部分,如下所示

1691412512_64d0e820c0cd0119a5683.png!small?1691412512971

  1. 熟悉TraceMgr整个函数处理流程,再次打开5.19.0的CODESYSControlService_dump.exe分析文件,分析过程如前所述,找到TraceMgr处理函数后,逐个过程比对每个流程中的函数实现的差异点。按照如上思路,在TraceMgrSrvPacketCreate函数中找到了差异点,下图是V3.5.18.20的TraceMgrSrvPacketCreate处理部分,当输入参数为19、20、21等值时,进入mencpy分支

1691412652_64d0e8ac2a15d6150f497.png!small?1691412652480

但是对比V3.5.19.0的TraceMgrSrvPacketCreate处理部分时发现其对该部分做了特殊处理(对输入的内容做限制长度),并且使用的BTagReaderGetContent函数都是特殊封装后的,因此可以断定是由于使用了memcpy函数并且未对输入参数进行检查验证出现的栈溢出漏洞。

1691412700_64d0e8dc574e31d7612a5.png!small?1691412700530

漏洞复现及分析

基于前述的分析,我们要复现漏洞首先需要了解Codesys V3通信协议相关的基础知识,该部分可以参考看雪论坛中的文章《Codesys V3 协议及授权机制分析》。要触发该漏洞,需要经过如下通信流程:

  • 打开通道,此时模拟器会给客户端返回channel_id,该值在后续的通信中会用到;
  • 创建会话连接,模拟器会给客户端返回session_id,同样该值在后续的请求报文中需要携带;
  • 获取challenge值,用来进行授权验证相关算法使用;
  • 发送授权后的登录请求,输入正确的用户名和密码才可进行敏感操作;
  • 发送应用程序的登录请求,此时模拟器会返回op_key,后续的敏感操作还需要携带该值;
  • 至此才可以发送服务码为TraceMgrServic群组中子功能码为TraceMgrSrvPacketCreate的PoC攻击报文;

1691413025_64d0ea210fb0a83ff1658.png!small?1691413025622

发送攻击报文后,在调试模式下分析漏洞根因。发送报文payload部分填充0x18ac个A,可以看到在memcpy之前目的地址片区布局正常。

1691413112_64d0ea78751f50c3511b3.png!small?1691413113131

当执行完memcpy之后内存布局如下所示,栈上空间全被AAAA填充。基于此漏洞后续还可以做漏洞利用,在栈上构造指向“目标”函数的指针已达到远程代码执行的效果,本文中不再深入讲解。

1691413156_64d0eaa4eaa6fc8157e2b.png!small?1691413157359

漏洞复现及分析

在第五章讲述的基础上结合2023-02的安全通告,我们继续可以深入各个服务群组的各个子功能码进行协议模糊测试,服务群组信息如下所示

1691413223_64d0eae7dd9fd05e31802.png!small?1691413224471

比如我们可以深入AppServiceHandler中的各个子功能码函数进行测试,构造进入各个分支函数的报文进行模糊测试。由于Codesys V3协议对象层次清晰,报文结构有研究机构已经披露[3],因此可以采用基于生产的模糊测试进行漏洞挖掘工作,推荐采用boofuzz框架,可以参考claroty开源的OPC UA模糊测试程序[4]来适配Codesys V3协议的模糊测试。

1691413286_64d0eb26222acd42b7e19.png!small?1691413287390

笔者采用多种模糊测试技术已经在修改后的版本V3.5.19.0模拟器上发现了多个漏洞并且将这些漏洞上报给国家相关单位。

在2023年8月10日的Blackhat USA会议上,微软的研究人员将分享他们发现Codesys V3协议16个漏洞的相关议题,感兴趣的朋友可以围观。笔者在该议题开讲之前先在国内对Codesys V3协议漏洞的分析和发现方法做一分享,让大家提前预热。

1691413352_64d0eb68b6562fc7b2c0e.png!small?1691413353638

防护措施

由于Codesys V3现在广泛应用在各大工控厂商的产品中,因此这些漏洞的影响范围较广,工控系统用户应做好积极防护措施。

  1. 将受影响的产品放置于安全防护设备之后,做好网络安全的纵深防御策略;
  2. 当需要进行远程访问时,尽量采用安全的VPN网络,并且做好访问审计;
  3. 关注受影响厂商的安全补丁,经过测试后升级受影响的产品以使其免受威胁。
  4. 尽量减少受影响设备的私有通信端口暴露,可根据业务场景选择关闭1740/1741/1742/1743/11740/11741等端口;
  5. 尽量给受影响的控制器设置用户名和密码保护,设置保护策略后攻击难度提升必须要获取用户名和密码后才能执行攻击;
  6. 建议使用Codesys V3 runtime的工控厂商及时自查,并且积极修复,发布修复版本的固件;

总结

本文以在国际上广泛使用的Codesys V3为研究对象,从Codesys厂商安全通告出发进行信息搜集和分析 ,进行了漏洞复现和分析,并且在修改过后的版本中发现了新的漏洞,以此来阐述对于工控安全研究的思路和方法,也让更多对于保护工业系统安全的有识之士能够看到并且共同守护工控系统的安全。

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外置告警蜂鸣器使用小坑

告警蜂鸣器调试小坑 昨天调试新产品,由于IMO、MSC组织和IEC标准规定,不能使用带红色指示灯的蜂鸣器,于是更换了个不带灯。然而奇怪的现象出现了两次短响的程序在有的页面正常,有的页面就变成一声了。搞了一天,把各种寄…

老子云平台会员专业又有性价比!

老子云平台会员今天已经正式上线了,让我们来看看这次上线有什么超值福利,又有什么惊喜在等着我们呢? 1、全平台权益通享 一大波会员权益来袭,感受一下老子云平台的热情和诚意! *** 权益详情:** 点击查看…

如何选择适合的招聘小程序源码?

作为招聘行业的专家,选择适合的招聘小程序源码是确保招聘过程高效顺利的关键一步。随着移动互联网的快速发展,招聘小程序已成为许多企业追逐人才的利器。然而,在众多的招聘小程序源码中,如何明智地做出选择,符合自身需…

AI大模型高速发展,Web3还远吗?

在过去的几年里,人工智能(AI)和Web3技术都经历了令人瞩目的发展。AI大模型,特别是像GPT-3、GPT-4等这样的巨型语言模型,已经成为AI领域的明星,而Web3则代表了下一代互联网的愿景,具有去中心化和…

stable diffusion和midjourney哪个好

midjourney和stable diffusion哪个好?midjourney和stable diffusion的区别?那么今天就从这2款软件入手,来探索一下他们的功能的各项区别吧,让你选择更适合你的一款ai软件。 截至目前,我们目睹了生成式人工智能工具的在…

图纸管理、图纸管理规范

图纸管理 一、作业的 图纸管理是重要的后勤保障工作,必须做到收发及时,手续齐全,废图绝迹,不遗失,无差错 彩虹图纸管理系统彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】彩虹EDM图纸管理软件系…

【Linux初阶】多线程4 | POSIX信号量,基于环形队列的生产消费模型,线程池,线程安全的单例模式,STL-智能指针和线程安全

文章目录 ☀️一、POSIX信号量🌻1.引入🌻2.信号量的概念🌻3.信号量函数 ☀️二、基于环形队列的生产消费模型🌻1.理解环形队列🌻2.代码案例 ☀️三、线程池☀️四、线程安全的单例模式🌻1.单例模式与设计模…

内网渗透-哈希传递

文章目录 哈希传递概念LMNTLM 原理利用hash传递 浏览上传文件实操:使用域中的一台机器通过哈希传递查看域控主机的C盘目录 hash传递获取域控RDPhash传递获取域控RDP 哈希传递 概念 早期SMB协议铭文在网络上传输数据,后来诞生了LM验证机制,L…

FPGA ZYNQ VIVADO创建IP核点亮LED灯 方式一

这里写自定义目录标题 PL端 纯Verilog语言创建IP核实现点亮LED灯工使用设备 ZYNQ 7010,选择设备型号XC7Z010CLG400-1根据以下流程完成本次创建时钟频率50MHZ,周期T20ns,因此计数50_000_000次,1sLED灯闪烁一次 PL端 纯Verilog语言创…

解决 Windows 7 激活信息失败报错 0xC004F057

文章目录 步骤一:以管理员身份运行命令提示符步骤二:卸载当前密钥信息步骤三:清除产品密钥信息步骤四:重新启动 Windows Activation Technologies 服务步骤五:重启电脑 🎉解决 Windows 7 激活信息失败报错 …

一款超好用的AI Logo生成器,免费可商用

HI,同学们,我是赤辰,本期是第20篇AI工具类教程,文章底部准备了粉丝福利,看完后可领取! 在职场中,常常免不了需要进行Logo设计和制作,特别是对于非专业人员来说,设计Logo…

C语言文件操作(上)

文章目录 一、为什么使用文件二、什么是文件1.程序文件2.数据文件3.文件名 三、文件的打开与关闭1.文件指针2.文件的打开和关闭fopen 与 fclose 四、文件的顺序读写01 字符输出函数:fputs02 字符输入函数:fgetc03 文本行输出函数:fputs04 文本…

【计算机网络笔记】计算机网络性能(2)——时延带宽积、丢包率、吞吐量/率

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 系列文章目录时延带宽积丢包率吞吐量/率&am…

探讨Acrel-1000DP分布式光伏系统的设计与应用-安科瑞 蒋静

摘 要:分布式光伏发电特指在用户场地附近建设,运行方式以用户侧自发自用、余电上网,且在配电系统平衡调节为特征的光伏发电设施,是一种新型的、具有广阔发展前景的发电和能源综合利用方式,它倡导就近发电,就…

数据可视化工具 ,不会写 SQL 代码也能做数据分析

数据可视化工具可以帮助人们以直观、易于理解的方式展现和分析数据。这些工具使得即使不会写 SQL 代码的人也能进行数据分析,并从中获得有价值的信息和见解。 本文将详细介绍几种常用的数据可视化工具及其功能和优点。 1. Datainside: Datainside是一款流行的数…

jupyter崩溃OOM,out of memory,jupyter代码写不进去,保存不了。

最近写一个比较长的数据处理代码,有快千行,然后经常代码没有写入,然后直接网页崩溃,给我干蒙了。我已经是jupyter版本的问题,弄了半天,弄完,还是有这个问题。然后就查了一下,发现是j…

【操作系统】虚拟内存串讲

文章目录 概述虚拟页管理请求页表物理地址的获取虚拟页大小与内存块大小的探讨 概述 操作系统为每一个进程分配一个独立的虚拟内存空间,以分页系统为例,每个进程的虚拟页号都是从 0 开始的 不同的进程可以使用相同的虚拟页号,并且不会互相影…

Redis的BitMap实现分布式布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种高效的概率型数据结构&#xff0c;用于判断一个元素是否属于一个集合。它通过使用哈希函数和位数组来存储和查询数据&#xff0c;具有较快的插入和查询速度&#xff0c;并且占用空间相对较少。 引入依赖 <!--切面--&…

Spring Cloud 之 Feign 简介及简单DEMO的搭建

Feign简介&#xff1a; Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验。 Feign是在RestTemplate基础上封装的&#xff0c;使用注解的方式来声明一组与服务提供者Rest接口所对应的本地…

黑豹程序员-架构师学习路线图-百科:Maven

文章目录 1、什么是maven官网下载地址 2、发展历史3、Maven的伟大发明 1、什么是maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and…