1、 CoDeSys是什么
CoDeSys是可编程逻辑控制PLC的完整开发环境(CoDeSys是Controlled Developement System的缩写),在PLC程序员编程时,CoDeSys为强大的IEC语言提供了一个简单的方法,系统的编辑器和调试器的功能是建立在高级编程语言的基础上(如Visual C++)。
2、CoDeSys功能
2.1 工程
一个工程包含了PLC程序中的所有对象,工程存储在以工程命名的文件中,工程中包含下列对象:POU,数据类型,可视化,资源和库。
2.2 POU(程序组织单元)
功能、功能块、程序是程序组织单元,它们能够通过动作来增补,每一个程序组织单元都包含一个定义部分和主体部分,主体部分可以用IEC的语言来编写,这些语言包括指令列表,结构化文本,顺序功能图,功能模块图,梯形图或连续功能图表。CoDeSys支持所有IEC标准的POU,如果你想在你的工程文件中使用这些POU,必须在你的工程文件中包含标准库文件standard.lib。POU可以调用其它的POU,但递归调用是不允许的。
2.3 功能
一个功能是一个POU,它正确地产生一个数据元素(可以包含若干元素,比如,字段或者结构体)在处理过程中,可以用文本化语言中的表达式中的一个操作数来调用它。在声明一个功能的时候,一定要给它一个类型,这就是说,在功能名后面加上一个冒号然后跟一个数据类型。
一个正确的功能声明可以是如下:
FUNCTION Fct: INT
另外,必须分配给功能一个结果,即把功能名作为一个输出变量功能的声明从关键字FUNCTION开始。下例是在指令列表(IL)中的一个功能,它声明了三个输入变量:前两个变量的相乘然后除以第三个变量。功能返回此操作的结果。
声明部分:
FUNCTION Fct: INT
VAR_INPUT
PAR1:INT;
PAR2:INT;
PAR3:INT;
END_VAR
程序部分:
LD PAR1
MUL PAR2
DIV PAR3
ST Fct
在结构文本中功能的调用可以作为表达式中的一个操作数。功能不会有任何内部条件,这就是说,调用带有相同的输入变量功能将会返回相同的输出结果。
下面是调用功能的例子:
in IL:
LD 7
Fct 2,4
ST Ergebnis
in ST:
Ergebnis := Fct(7, 2, 4);
in FUP:
功能不会保持内部状态,对于不包含全局变量和地址的功能,每次在它被调用的过程中,给它传递相同的输入变量,它将返回相同的值 。
2.4 可视化
CoDeSys提供了可视化,因此你可以显示工程的变量,通过可视化的帮助你可以在离线的情况下绘制几何元素,在联机模式下能够响应特定变量的值从而改变他们的形式,颜色和文本输出。
可视化的界面可以用作带CoDeSys的HMI的PLC纯操作接口,或者作为一个网页可视化或通过因特网与PLC直接连接的对象可视化。
2.5 语言
CoDeSys支持IEC _61131所描述的所有语言
文本化的语言:
•指令表
•结构文本
图形化的语言:
•顺序功能流程图
•功能模块图
•梯形图
•基于功能模块图的连续功能编辑器(CFC)
3、CoDeSys底层运行原理
Codesys runtime是建立在OS上的,常见的OS有wince,windows,linux,vxworks。构建在OS的优势就在于系统的扩展性更强,PC的更多功能都可以在PLC上实现。
control task被操作系统每隔一段时间(典型是1ms)调用一次。
IEC task被内建的看门狗监控,监视PLC的实际工作周期是否超出预定时间,如果超出则IEC task任务停止,向系统报告错误。
优先级,数值越小优先级越高,根据任务的实时性,设定优先级,周期性执行任务
4. CoDeSys组态环境搭建
4.1 虚拟机和组态环境版本信息
4.2 一直默认安装即可
4.3 安装完成后运行成功
4.4 新建项目工程Standard project
4.5 新建项目后还可以在PLC项目里添加Enum、Struct、FunctionBlock、Program、Task等
4.6 同时Codesys能够配置多个任务,任务调用不同的程序段,每个任务可以手动设置执行优先级及循环周期
4.7 我们在PRG中编写Hello World程序
4.8 然后在Application增加对象视图
4.9 在Visualization中,基本的标签中选择一个矩形框,Common controls中选择一个按钮,目标可视化:显控一体,充满整个屏幕
4.10 关联string类型变量,选中矩形框,在右边属性-Texts-Text填%s(动态文本), Text variable-输入助手-选择sVar-确定
4.11 关联bool变量,选中按钮,在右边属性框中,基本配置-toggle-输入助手-选择bSwitch-确定
4.12 程序工程配置好后双击Device进入通讯配置,这时网关指示绿色,最右侧指示灰色
4.13 根据上面情况可见首先需要开启Stat PLC,图标由灰色变为彩色并进入Running状态
4.14 选中本地JACOB-PC进行扫描,确定后将最右侧指示由灰色变为绿色即为成功
4.15 上面配置好后此时可对该工程项目进行编译
4.16 当项目工程编译成功后在菜单栏选择在线进行登录
4.17 登录完成,但是程序处于停止状态
4.18 需要在菜单调试选项里面去启动,然后双击程序段即可监控变量的线执行状态
4.19 项目工程运行正常后回到视图可见成功运行
5. CoDeSys漏洞复现
5.1 漏洞概述
该漏洞主要是使用了CODESYS WEB可视化屏幕,正常情况组态安装完成CODESYSControlService服务默认是停止的,所以这里需要有一个前提条件是用户必须开启这项功能服务才可以,当该服务开启后攻击者通过构造特定的请求进行攻击最终导致web服务器奔溃或者远程代码执行
5.2 漏洞影响版本
根据CODESYS厂商官方所发出的公告该漏洞在CODESYS V3中,Web服务器是CODESYS运行系统时可选的一部分。 只要CODESYS包含以下版本的Web服务器(CmpWebServer和CmpWebServerHandler)的V3运行时系统之前的V3.5.15.40会受到影响,其中主要包含以下版本:
• 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
5.3 危害严重程度评分达到9.8分
5.4 查看该CODESYSControlService服务是否开启
5.5 远程访问8080正常
5.6 攻击者进行攻击后可见访问失败
5.7 厂商参考链接:
https://customers.codesys.com/index.php?eID=dumpFile&t=f&f=13078&token=de344ca65252463cc581ef144e0c53bd97b8f211&download=
https://zh-cn.tenable.com/security/research/tra-2020-16