CODESYS V3未经身份验证的远程堆溢出漏洞分析与复现

时间 :  2020年04月14日  来源:  安天CERT


1 概述


        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[1]漏洞进行了分析和复现,该漏洞存在于CmpWebServerHandlerV3.dll(文件版本3.5.15.20)库中,源于该dll库未能正确验证由用户提交的发往Web Server URL端点的数据。此漏洞会造成Web 服务器崩溃、拒绝服务或者可能被用于远程代码执行。对此,安天研究人员分析了该漏洞原理并给出相应的防护建议。

2 漏洞情况


        该漏洞允许未经身份验证的远程攻击者破坏服务器或远程代码执行。存在漏洞的服务器用于在Web浏览器中显示CODESYS系统可视化屏幕。该漏洞基于堆的缓冲区溢出,是由于名为CmpWebServerHandlerV3.dll的Web服务器库无法正确验证发送到Web服务器URL端点的用户数据而导致。攻击者可以通过发送给CmpWebServerHandlerV3组件的WEB_CLIENT_OPENCONNECTION消息请求非常大的内存分配,来利用这个漏洞,最终导致Web服务器崩溃、拒绝服务或远程执行代码[2]。该漏洞严重程度评分如下表所示:

表格 2 1 CVSS评分[3]

 

CVSS v2.0

CVSS v3.1

基本得分

10

9.8

向量

AVN / ACL / AuN / CC / IC / AC

AVN / ACL / PRN / UIN / SU / CH / IH / AH

影响得分

10

5.9

可利用性得分

10

3.9

严重等级

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系统运行中都会受到影响,主要包括[4] :

        • 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 漏洞原理及复现过程


3.1 漏洞原理

        攻击者可借助特制的请求,利用该漏洞造成基于堆的缓冲区溢出,攻击者通过与服务端建立连接,并请求分配内存,服务器响应攻击者并分配内存,攻击者发送特殊消息使服务端缓冲区溢出,导致Web Server发生崩溃。如下图所示:

图 3-1 CODESYS缓冲区溢出过程

        该漏洞存在于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崩溃[1]。

图 3-2 攻击者发送消息以至缓冲区溢出

3.2 复现过程

        攻击者通过与服务端建立连接,并请求分配内存,服务器响应攻击者并分配内存,攻击者发送特殊消息使服务端缓冲区溢出,导致Web 服务器发生崩溃。基于以上漏洞原理,搭建复现环境,通过POC脚本对漏洞进行复现。

        复现环境采用CODESYS V3.5.15.20(32位)版本,Windows10家庭版,8G内存,搭建服务端环境。服务端复现环境搭建成功后,结合漏洞原理及POC程序针对该漏洞进行了复现。

        该POC是由Python语言实现,在执行过程中需要配置目标地址(Web Server服务器地址)和目标端口号(默认为8080)。查看正常状态下Web Server服务及Web访问状态。Web Server服务状态如下图所示:

图 3-3 POC执行前服务状态

        被用来测试的Web访问页面,可正常访问,如下图所示:

图 3-4 POC执行前WEB访问状态

        运行POC前重启CODESYS服务,使CmpWebServerHandlerV3组件处于状态“0”。运行POC脚本,连接服务端并请求分配内存。POC脚本部分代码如下图所示:

图 3-5 POC部分代码

        POC运行后,查看Web Server及Web访问状态,Web Server服务已经停止,如下图所示:

图 3-6 POC执行后服务状态

        被用来测试的Web页面不能正常访问,重新启动服务后,页面访问恢复正常。不能正常访问时状态如下图所示:

图 3-7 POC执行后WEB访问状态

        针对CODESYS V3.5.15.20(64位)版本,采用Windows7(64位)系统,8G内存,搭建服务端环境。客户端运行POC后,服务端内存被占满,随着时间推迟内存被慢慢释放,Web服务没有停止,但Web页面不能访问,造成拒绝服务攻击。内存如图所示:

图 3-8 服务端内存使用过高

        被用来测试的Web页面不能正常访问,服务重启后,Web页面才可正常访问。Web页面不能正常访问如下图所示:

图 3-9 POC执行后Web访问状态(64位)

        Web Server服务重启后,Web页面可正常访问,访问状态如下图所示:

图 3-10 Web页面正常访问状态

4 漏洞危害及防护建议


4.1 漏洞危害

        本次复现漏洞可能导致Web服务器崩溃、拒绝服务,或者可能被用于远程代码执行。下面对有可能造成的危害进行详细说明:

        (1) Web服务崩溃:CODESYS Web Server在工业控制系统场景中可用来作为Web SCADA服务器,Web SCADA服务器崩溃可导致与控制器通信中断,不能接收来自控制器返回的数据信息,不能对控制器参数进行修改。可能使工业控制系统发生异常,导致企业停工停产,造成安全威胁或经济损失。

        (2) 远程代码执行:攻击者利用该缓冲区溢出漏洞可能导致工业控制系统数据泄露,如软件版本,系统信息、工艺参数等关键数据,为进一步攻击工业控制系统做信息收集准备;也可通过shell脚本获取工业控制系统操作权限,对工业控制系统正常运行带来影响。

4.2 防护建议

        根据该漏洞的原理及官网针对该漏洞的修复情况,给出以下建议。

        (1) 建议将CODESYS软件升级到V3.5.15.40,官方在V3.5.15.40版本中修复此漏洞。

        (2) 对运行CODESYS Control Service的主机配置防火墙限制IP访问,仅允许指定IP访问,禁止外部IP访问,并进行相应的访问日志审计,防止系统信息泄露。

        (3) 禁止工业控制网络在无防护设备情况下与互联网连接,如必须连接互联网可采取安装工业防护设备(防火墙、网闸等)来限制攻击者的入侵。

        (4) 增加工业网络流量检测和监测设备,对Web管理平台异常流量进行阻断、报警、及时发现,防止工业系统敏感信息泄露。


参考链接


        [1] CVE:CVE-2020-10245

        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-10245

        [2] Tenable:CODESYS V3未经身份验证的远程堆溢出

        https://zh-cn.tenable.com/security/research/tra-2020-16

        [3] NVD:CVE-2020-10245

        https://nvd.nist.gov/vuln/detail/CVE-2020-10245

        [4] CODESYS:CODESYS V3 web服务器安全更新

        https://customers.codesys.com/index.php?eID=dumpFile&t=f&f=13078&token=de344ca65252463cc581ef144e0c53bd97b8f211&download=