工业自动化系统中的漏洞和恶意代码

15-20年前开发的工业自动化工具实际上不包含安全功能。在过去的几十年中,企业积累了一大批具有不可修复的体系结构缺陷的设备,可供网络犯罪分子利用。在本文中,我们讨论了工业自动化系统的漏洞,并提供了改善情况的建议。



图片



在2019年,我们在互联网上找到了一家商店,该商店为重型工业机器分发软件。我们下载了其中一些应用程序,并对它们进行了反向工程以了解它们的工作方式。他们的代码是用一种专有的编程语言编写的,该语言用于自动化工业机器人来组装汽车并将食物包装在传送带上。在其中一个应用程序中发现一个漏洞,这开始了我们Rogue Automation研究:工业编程中的脆弱和恶意代码



在检查了八个最受欢迎的工业编程环境(ABB,Comau,Denso,Fanuc,川崎,Kuka,三菱和Universal Robots)的技术细节和弱点之后,我们发现这些语言可用于创建蠕虫恶意软件,该恶意软件将从一种容易受到攻击的机器人,请遵守其操作员的远程命令。



发现的缺陷是几十年前做出的设计选择的结果。这些解决方案定义了当今仍用于工业设备编程的技术,方法和工具。在现代网络威胁的背景下考虑此选择的含义。



窃取机器人的数据



我们发现了一个易受攻击的Web服务器的真实案例,该Web服务器被实现为在工业机器人上运行的应用程序。用ABB Rapid编写的Web服务器包含一个遍历漏洞,攻击者可以利用该漏洞通过网络连接到机器人,并从机器人控制器复制任何文件,包括日志。这些文件很可能包含各种机密数据和专有技术,因此可以在地下市场中获利销售。



如果攻击者设法入侵与机器人位于同一网络上的计算机,则由于该程序满足了来自代理的任何请求,因此他将能够伪装成代理来连接到控制器的Web服务器,请求感兴趣的文件并未经授权检索它。



图片

易受攻击的应用程序代码的一部分。来源(以下,除非另有说明):趋势科技



493号线调用sendFile函数将请求的文件发送到客户端。 pageString不会以任何方式进行过滤,因此它可能包含“ ... /”或其他路径。这使您可以遍历文件系统并下载几乎所有文件。



图片

漏洞利用方案



在这种情况下,值得注意的是易受攻击的Web服务器的开发人员在代码中留下的注释。他知道自己编写的代码很容易受到攻击,但是并没有解决问题,因为他认为所有请求都将来自“正确的”浏览器,该浏览器将验证输入数据,并且不允许使用字符串“。”。 。\\ ... \\“:



图片

,





利用某些漏洞可能会在物理世界中导致后果,例如,损害制成品甚至周围的人。

在工业机器人Kuka的开源项目中,我们发现了一个漏洞,该漏洞使您可以更改运动部件的轨迹。该程序通过网络接收坐标流,并将其传递给执行器,执行器执行指定的运动。为此,使用一类特殊的过程-运动自动化服务器。它是一个标准接口,允许工业机器人OEM提供一致的方式来控制其产品的运动。



图片

交通自动化服务器的易受攻击的代码不包含任何对所传输数据合法性的检查



服务器代码不会以任何方式检查机器人运动的下一部分坐标的来源;它不提供内部身份验证。唯一的保护措施是检查发件人的MAC地址和IP地址,任何入侵者都可以很容易地欺骗了其中的任何人,他们已经进入了网络。



在我们的实验室工作台上,我们确保使用欺骗手段可以伪造机器人与工程工作站之间的通信。攻击者可以发送任意坐标,而机器人只需执行它们,在实际生产中会导致事故。



通过将坐标不正确的网络数据包注入流量中,我们能够多次将操纵器推出安全区域,并用机器人的“手”击中物理对象。结果,机器人用来拾取物体的“手臂”掉下了:机器人掉下的



图片

手臂是在交通中引入不安全坐标的结果



动态恶意软件



这种类型的攻击假设机器人正在运行由系统集成商编写的程序,该程序被认为是可信的。实际上,集成商创建的任何程序都被认为是受信任的,并且部署时无需进行代码安全检查。



通过破坏集成商或替换易受攻击的网络存储中的程序,您可以将恶意代码无形地注入企业网络:添加一个引导加载程序,该加载程序下载攻击者所需的模块并作为标准生产周期的一部分运行。



图片

用编程语言为工业机器人编写的恶意软件下载器



为了测试这个概念,我们用工业机器人的编程语言编写了一个dropper,并确保可以使用外部程序将代码加载到机器人控制器中并执行它。一旦受到控制,这样的程序就可以通过收集有关网络基础结构的信息,窃取文件和凭据来执行进一步的恶意操作。



不寻常的RCE漏洞



我们的发现之一是一个完全受人尊敬的程序,该程序启动要执行的功能,其功能名称是通过网络接收的。为了执行它们,它使用动态代码加载,但是对它究竟启动什么不感兴趣:该程序不提供检查加载的库的完整性。



图片

“受人尊敬”的应用程序



图片

的易受攻击的逻辑实现易受攻击的逻辑的代码片段。



尽管程序本身不包含恶意功能,但是攻击者可以使用它在适当的时候向机器人发出命令,从而影响物理世界。



创造之冠-恶意蠕虫



为了说明检测到的问题的严重性,我们开发了一个程序,该程序具有自我传播和自动更新功能,从控制服务器动态加载代码以及对其进行远程控制的功能。扫描程序还可以执行网络扫描,将任意文件传输到命令和控制服务器,维护受感染设备的列表并充当漫游器。



图片

PoC程序的逻辑,用于模拟真正的恶意软件的工作



图片

形成找到的文件列表并将其发送到控制服务器



问题根源



在分析了过去几十年来开发的用于工业自动化的八种流行编程语言之后,我们得出的结论是,已识别和潜在漏洞的主要原因是这些语言包含访问系统资源的低级手段。尽管这些工具本身并不危险,但是攻击者可以将其用于其他目的,严重影响了机器人,其操作员和连接系统的安全。例如,它们可用于向上移动机械手,提起工件,降低机械手并释放工件。



这些丰富的复杂功能集使过程工程师可以自由地开发应用程序,使他们可以从网络中检索数据,读取和写入文件。但是,由于平台不提供对这些高级功能的安全访问,攻击者可以使用它们编写恶意模块。

与设备一起继承的用于工业自动化的过时语言(工业机器人编程语言,IRPL)的另一个问题是它们没有用于检查不安全模式的代码的工具,类似于C,C ++,C#,Java的工具。 PHP和Python。



每个OEM都将创建自己的语言和目标程序将在其中运行的环境。其中一些是基于实时操作系统(RTOS)的,但是总体上还没有标准化。每个IRPL的语义也是唯一的,并且可能与通用编程语言的语义有很大不同。IRPL中缺少某些功能(例如,操作字符串或加密操作)或不如传统语言先进。



用IRPL编写的程序中的漏洞的主要来源是三个主要功能:



  • 处理文件和目录,
  • 通过名称动态加载模块和调用函数,
  • 网络功能-接收数据并将其传输到外部系统。


图片

IRPL中提供的危险功能



如何保护自己



与处理不可信数据的任何软件应用程序一样,必须使用适当的安全机制来设计,实施,配置和部署工业自动化系统。



图片

确保工业自动化程序安全的综合建议



因此,在编写此类程序时,必须遵循以下原则:



  • 将工业机器人视为计算机,并将其应用程序视为极其关键的代码;
  • 验证所有通信;
  • 实施访问控制策略;
  • 在适用的情况下实施输入验证;
  • 确保对产出进行持续消毒;
  • 处理错误时,请勿暴露不必要的技术细节;
  • 创建正确的配置和部署过程;
  • 为工业自动化代码实施变更管理流程。


老还是聪明?



尽管数十年来传统软件开发人员一直在努力应对不安全编程的后果,并开发了各种技术来确保胜利,但工业自动化领域并没有做好准备来检测和防止利用漏洞。



鉴于IT / OT融合的步伐,必须将安全的代码开发方法引入工业自动化行业。否则,未来几年可能会给我们带来许多行业事件的报告,这些事件的后果不仅会在网络空间中体现出来,而且还会在物理世界中体现出来。



All Articles