CODESYS V3 未经身份验证的远程堆溢出漏洞分析与复现
作 者:安天
公众号: 关键基础设施安全应急响应中心
概述
2020年3月25日CODESYS发布CODESYS V3未经身份验证的远程堆溢出漏洞,攻击者利用精心设计的请求可能会导致基于堆的缓冲区溢出。CODESYS软件工具包是一款基于先进的.NET架构和IEC 61131-3国际编程标准的面向工业4.0及物联网应用的软件开发平台。CODESYS软件平台可实现逻辑控制(PLC)、运动控制(Motion Control)及CNC控制、人机界面(HMI)、基于Web Service的网络可视化编程和远程监控、冗余控制(Redundancy)和安全控制(Safety)、项目开发与工程协同管理等多个目标和需求。
安天针对CODESYS的CVE-2020-10245漏洞进行了分析和复现,该漏洞存在于CmpWebServerHandlerV3.dll
(文件版本3.5.15.20)库中,源于该dll库未能正确验证由用户提交的发往Web Server URL端点的数据。此漏洞会造成Web 服务器崩溃、拒绝服务或者可能被用于远程代码执行。对此,安天研究人员分析了该漏洞原理并给出相应的防护建议。
漏洞情况
该漏洞允许未经身份验证的远程攻击者破坏服务器或远程代码执行。存在漏洞的服务器用于在Web浏览器中显示CODESYS系统可视化屏幕。该漏洞基于堆的缓冲区溢出,是由于名为CmpWebServerHandlerV3.dll
的Web服务器库无法正确验证发送到Web服务器URL端点的用户数据而导致。攻击者可以通过发送给CmpWebServerHandlerV3
组件的WEB_CLIENT_OPENCONNECTION
消息请求非常大的内存分配,来利用这个漏洞,最终导致Web服务器崩溃、拒绝服务或远程执行代码。该漏洞严重程度评分如下表所示:
2.1披露时间
2019年12月02日:发现漏洞
2019年12月11日:CODESYS承认漏洞。
2019年12月11日:CODESYS预计在90天后进行解释。
2020年01月28日:供应商通知他们计划在3月中旬发布补丁。
2020年03月18日:CODESYS通知,由于COVID-19,他们需要将其补丁和咨询推迟几天,计划在三月中旬发布版本3.5.15.40。
2020年03月25日:CODESYS已发布公告和漏洞修复。
2.2 漏洞影响版本
在用于工程控制系统的自动化软件CODESYS的Web服务器中存在一个严重漏洞,此漏洞存在V3.5.15.40之前的所有版本中,所有包含Web服务器(CmpWebServer和CmpWebServerHandler)的CODESYS V3系统运行中都会受到影响,主要包括 :
CODESYS Control for BeagleBone
CODESYS Control for emPC-A/iMX6
CODESYS Control for IOT2000
CODESYS Control for Linux
CODESYS Control for PLCnext
CODESYS Control for PFC100
CODESYS Control for PFC200
CODESYS Control for Raspberry Pi
CODESYS Control RTE V3
CODESYS Control RTE V3 (for Beckhoff CX)
CODESYS Control Win V3 (also part of the CODESYS Development System setup)
CODESYS HMI V3
CODESYS Control V3 Runtime System Toolkit
CODESYS V3 Embedded Target Visu Toolkit
CODESYS V3 Remote Target Visu Toolkit
2.3 漏洞影响范围
CODESYS是一款工业自动化领域的一款开发编程系统,应用领域涉及工厂自动化、汽车自动化、嵌入式自动化、过程自动化和楼宇自动化等。CODESYS软件可以分为两个部分,一部分是运行在各类硬件中的RTE(Runtime Environment),另一部分是运行在PC机上的IDE。因此CODESYS的用户既包括生产PLC、运动控制器的硬件厂商,也包括最终使用PLC、运动控制器的用户。
目前全球有近400家的控制系统生产制造商是CODESYS的用户:如ABB、施耐德电气SchneiderElectric、伊顿电气EATON、博世力士乐Rexroth、倍福BECKHOFF、科控KEBA、日立HITACHI、三菱自动化MITSUBISHI、欧姆龙OMRON、研华科技、凌华科技ADLINK、和利时集团、SUPCON中控集团、步科自动化KINCO等等。
漏洞原理及复现过程
3.1 漏洞原理
攻击者可借助特制的请求,利用该漏洞造成基于堆的缓冲区溢出,攻击者通过与服务端建立连接,并请求分配内存,服务器响应攻击者并分配内存,攻击者发送特殊消息使服务端缓冲区溢出,导致Web Server发生崩溃。如下图所示:
该漏洞存在于CmpWebServerHandlerV3.dll
(文件版本3.5.15.20)库中,源于该dll库未能正确的验证由用户提交的发往Web Server URL端点的数据。当CmpWebServerHandlerV3
组件状态为“0”时,攻击者可通过向CmpWebServerHandlerV3
组件发送一条WEB_CLIENT_OPENCONNECTION
消息,请求分配大小为0xffffffff
的缓冲区,在缓冲区分配操作过程中SysMemGetCurrentHeapSize
函数被SysMemAllocData
函数调用向所请求的缓冲区分配大小添加了0x5c字节,缓冲区分配大小会溢出,即实际上分配了一块小的堆缓冲区0xffffffff+ 0x5c = 0x5b
。攻击者通过发送一条精心构造的WEB_CLIENT_RUN_SERVICE
消息以溢出小型通信缓冲区,造成缓冲区溢出,进而使Web Server崩溃。
3.2 复现过程
攻击者通过与服务端建立连接,并请求分配内存,服务器响应攻击者并分配内存,攻击者发送特殊消息使服务端缓冲区溢出,导致Web 服务器发生崩溃。基于以上漏洞原理,搭建复现环境,通过POC脚本对漏洞进行复现。
复现环境采用CODESYS V3.5.15.20(32位)版本,Windows10家庭版,8G内存,搭建服务端环境。服务端复现环境搭建成功后,结合漏洞原理及POC程序针对该漏洞进行了复现。
该POC是由Python语言实现,在执行过程中需要配置目标地址(Web Server服务器地址)和目标端口号(默认为8080)。查看正常状态下Web Server服务及Web访问状态。Web Server服务状态如下图所示:
被用来测试的Web访问页面,可正常访问,如下图所示:
运行POC前重启CODESYS服务,使CmpWebServerHandlerV3组件处于状态“0”。运行POC脚本,连接服务端并请求分配内存。POC脚本部分代码如下图所示:
POC运行后,查看Web Server及Web访问状态,Web Server服务已经停止,如下图所示:
被用来测试的Web页面不能正常访问,重新启动服务后,页面访问恢复正常。不能正常访问时状态如下图所示:
针对CODESYS V3.5.15.20(64位)版本,采用Windows7(64位)系统,8G内存,搭建服务端环境。客户端运行POC后,服务端内存被占满,随着时间推迟内存被慢慢释放,Web服务没有停止,但Web页面不能访问,造成拒绝服务攻击。内存如图所示:
被用来测试的Web页面不能正常访问,服务重启后,Web页面才可正常访问。Web页面不能正常访问如下图所示:
Web Server服务重启后,Web页面可正常访问,访问状态如下图所示:
漏洞危害及防护建议
4.1 漏洞危害
本次复现漏洞可能导致Web服务器崩溃、拒绝服务,或者可能被用于远程代码执行。下面对有可能造成的危害进行详细说明:
Web服务崩溃:CODESYS Web Server在工业控制系统场景中可用来作为Web SCADA服务器,Web SCADA服务器崩溃可导致与控制器通信中断,不能接收来自控制器返回的数据信息,不能对控制器参数进行修改。可能使工业控制系统发生异常,导致企业停工停产,造成安全威胁或经济损失。
远程代码执行:攻击者利用该缓冲区溢出漏洞可能导致工业控制系统数据泄露,如软件版本,系统信息、工艺参数等关键数据,为进一步攻击工业控制系统做信息收集准备;也可通过shell脚本获取工业控制系统操作权限,对工业控制系统正常运行带来影响。
4.2 防护建议
根据该漏洞的原理及官网针对该漏洞的修复情况,给出以下建议:
建议将CODESYS软件升级到V3.5.15.40,官方在V3.5.15.40版本中修复此漏洞。
对运行CODESYS Control Service的主机配置防火墙限制IP访问,仅允许指定IP访问,禁止外部IP访问,并进行相应的访问日志审计,防止系统信息泄露。
禁止工业控制网络在无防护设备情况下与互联网连接,如必须连接互联网可采取安装工业防护设备(防火墙、网闸等)来限制攻击者的入侵。
增加工业网络流量检测和监测设备,对Web管理平台异常流量进行阻断、报警、及时发现,防止工业系统敏感信息泄露。
参考链接
以上是 CODESYS V3 未经身份验证的远程堆溢出漏洞分析与复现 的全部内容, 来源链接: utcz.com/p/199567.html