智能工厂的安全困境
2021-06-30
来源:工控安全漫谈
工业机器人是智能工厂制造过程自动化的核心,是支持汽车、飞机、加工食品、药品等各类产品制造的最重要部件。随着在后新冠疫情时代实现无人制造,能够高精度重复执行指定动作的工业机器人的重要性也重新受到关注。然而,工业机器人是使用几十年前设计的语言编程的。Trend Micro自2017年以来一直在对智能工厂进行网络安全研究,发现了定义工业机器人行为的“任务程序”漏洞以及“编程语言”中的设计缺陷。这些语言是几十年前设计的遗留语言,但仍是一项在现代智能工厂中使用的技术。对此,Trend Micro从短期到长期的角度,分析了遗留语言中涉及的设计安全风险,以及所有工业机器人用户应该采取的风险缓解措施。
一、用于移动工业机器人编程语言的特殊性
( 一 )工业机器人支持工厂自动化
工业机器人是一种代替人类在工厂内进行装配、运输、加工等工作的机械设备。在当今世界,满足全球商业规模的生产已司空见惯。工业机器人是制造过程自动化的基础,它可以重复执行精确的工作并复制灵活的运动。
图1 工业机器人
即使在新冠疫情大流行的情况下,对工业机器人的需求也在显著增加。据《财富商业洞察》报告,2019年,全球工业机器人市场规模约为218.3亿美元,预计到2027年将扩大到664.8亿美元。这一需求增加的原因是由于主要生产基地亚洲国家的劳动力成本飙升,以及为了提高生产率而不断投资于自动化。此外,新冠疫情大流行带来的实现最小或无身体接触和无人服务的社会需求,也被认为是对工业机器人需求不断增长的主要驱动力。工业机器人在制造过程自动化中发挥着核心作用,在后新冠疫情时代将变得更加重要。
( 二 ) 工业机器人的运动以编程方式定义
从数字技术的角度来分析工业机器人。工业机器人是应用于制造业的复杂信息物理系统,是智能制造系统的关键组成部分。当人们听到机器人这个词时,通常首先会想到的是机械臂一样的执行器部分,但执行器部分不是独立运动的,它的运动由程序定义并由控制器控制。因此,工业机器人在放置后不会立即按预期运动,而是按程序进行所需的运动。可以说,工业机器人是一台具有物理操作部分的大型计算机。
图2 工业机器人运动机制
( 三 ) 自动化程序用专有语言编写
趋势科技(Trend Micro)在与米兰理工大学的联合研究中,发现重工业巨头ABB的一个应用程序存在漏洞。该应用程序是用ABB自己的编程语言编写的,研究人员对此并不熟悉。驱动工业机器人的自动化程序使用的语言与用于创建网站和移动应用程序的主流编程语言完全不同。定义工业机器人自动化行为的“任务程序”通常由领域专家使用特定于每个机器人制造商的编程语言编写。此外,每个机器人制造商都创建了特定于制造商的生态系统,该生态系统只使用自己的编程语言、编程环境甚至工具。
例如,图3是一个用大型重工业公司Kuka的原始语言“KRL”编写的简单代码示例。在此例中,工业机器臂被指示在两个点(位置1和位置2)之间移动。图4还显示了为ABB平台编写的拾取放置程序。可以看到两者使用着不同的语言结构。
图3 Kuka KRL在两点之间循环移动工业机器人手臂10次
图4 ABB拾取放置程序仿真环境
在此研究项目中,研究人员的调查目标是工业机器人领域的八家领先企业的平台,目标制造商是ABB、Comau、Denso Wave、FANUC、川崎重工、Kuka、三菱电机和通用机器人。
在本研究中,Trend Micro不仅使用了包括自动化逻辑在内的任务程序分析等实证验证方法,还参考了8大工业机器人平台的技术文件,分析了来自11个在线论坛的信息,从非技术的角度,对20名工业机器人领域的专家进行了访谈。目的是强制考虑非技术问题,如行业特征和开发文化,这超越了特定程序的漏洞分析。因此,除了提高控制流程工程师的安全意识外,通过重新设计平台和执行重大升级,可以更容易、更有效地修复漏洞。
技术本身是“遗留”的事实并不意味着它马上就有安全漏洞。然而,每种技术的安全需求和开发过程都必须随着环境变化带来的威胁而变化。当根据几十年前的常识开发的技术被纳入今天的智能工厂时会发生什么?本研究通过对现有编程语言的结构分析,阐明了网络安全在工业领域的当前定位。
图5 研究方法概述
二、利用任务程序漏洞的三种攻击场景
( 一 ) 三种攻击场景
Trend Micro验证了公共代码库(GitHub和在线社区)提供的大约100个任务程序,可以确认大多数代码中存在“输入值验证错误”、“缺乏身份验证功能”和“远程代码执行”等漏洞。利用这些漏洞的三种攻击场景包括:
1、通过网络改变机器人操作:通过利用动作服务器的有缺陷的输入值验证和通过网络传输无效的坐标值数据,使机器人执行非预期的操作。
工业机器人的运动是以编程方式定义的,并将值输入到控制器。这使得机器人可以通过网络接收坐标信息,从而调节机器人的运动。因此,为了确保物理安全,机器人的输入必须始终完整。通常,为工业机器人设置安全保护区域,并且工业机器人的最大操作限制在该区域内。因此,如果安全区域设置正确,区域外坐标的输入将无效。另一方面,在为安全区域的“内部”指定无效坐标的情况下,必须通过机器人的输入值验证和门禁控制功能来确保输入的完整性。
然而,在此次调查的程序中发现了“有缺陷的接入认证”和“有缺陷的输入值验证”。换言之,该任务程序不被配置为仅从特定伙伴接收命令,不判断输入坐标信息的有效性,并且仅基于接收的数据来确定机器人的运动。通过利用这些漏洞,攻击者可以伪造网络数据包并随意移动目标机器人。这种攻击可能会影响制造质量,并由于意外的机器人移动而造成制造过程中的延迟。如果安全区配置不正确,造成的破坏会更严重。
以这种方式定义网络行为的程序通常被用作运动服务器任务程序,用于驱动联网的工业机器人。大型项目,如ROS-Industrial软件,广泛使用运动服务器来提供各种OEM工业机器人通用的供应商接口。
通常,有适当的网络级保护,例如IP地址或MAC地址过滤,并且保证工业机器人仅从指定的控制器接收坐标值。然而,如果任务程序没有除上述网络级别保护之外的机制来验证源,或者如果任务程序受到输入值验证漏洞的影响,则只要接收到的坐标值来自有效的IP地址或MAC地址,即使源被欺骗,它也将被自动信任。无论哪种情况,这都使侵入本地网络上的攻击者很容易执行攻击方案。因此,攻击者可以简单地发送任意坐标,工业机器人将被相应地驱动,从而导致产品质量差,制造过程中出现延误或停顿。此外,配置不当的安全区域可能会导致更严重的物理损坏。
2、通过机器人窃取信息:通过利用任务程序中的漏洞发起路径遍历攻击来窃取机密信息。
此攻击方案利用Web服务器上的任务程序中的路径遍历漏洞,执行该程序以显示制造商提供的工业机器人控制器上的坐标信息。在这项研究中发现的程序是一款应用程序,可以通过“ABB-Robot Apps Robot Studio”使用,并在工业机器人上作为网络服务器运行。它是用ABB自己的语言Rapid实现的。利用此漏洞,网络上的攻击者可以在工业机器人上创建包含潜在敏感数据的文件,如包含工业机器人操作时的坐标信息的日志文件,并使用工业机器人的控制器泄露该文件。机密工业信息在地下市场上以非常高的价格交易,是网络犯罪分子的主要目标之一。
路径遍历是一种攻击方法和漏洞,在该攻击方法和漏洞中,有人试图访问不应通过利用漏洞进行访问的目录。此攻击利用遵循树结构中指令的服务器规范,但在大多数情况下,存在允许开发人员意外访问的代码。
在注重安全的软件开发中,总是假设“外部输入是不可靠的”。因此,有必要事先验证服务器端的输入值,以便不会通过开发人员意想不到的输入执行未经授权的访问。
3、生成有针对性、自传播的恶意软件:利用编程语言固有的网络通信功能和代码动态加载功能,使任务程序充当从外部来源接收恶意程序的下载器。此外,利用任务程序中有缺陷的输入值验证来使工业机器人执行与无效外部输入相对应的功能。通过这些组合,生成并执行以用于工业机器人的编程语言编写的自传播恶意软件。
因此,虽然工业机器人及其自动化技术与运行在Windows服务器上的传统Web应用程序完全不同,但也存在一些众所周知的漏洞类型,如路径遍历和代码注入,这意味着组织可能会感染病毒,也可能会成为恶意软件的目标。
( 二 ) 攻击造成的损害
下图展示了研究中所展示的攻击场景和攻击的影响。
图6 三种攻击场景及其影响
通过利用研究中确定的任务程序中的漏洞,网络攻击者可以物理破坏生产线,窃取机密信息,甚至窃取金钱。
如上所述,这些测试中使用的漏洞是在GitHub和在线社区的代码中发现的。其中一些代码是从新手程序员使用的手册和编程参考等技术资料中摘录的。此外,之前的研究表明,开源代码中的漏洞会传播并最终影响产品。因此,假设攻击中的场景可以在制造车间重现。
三、机器人语言中的基本安全隐患
( 一 ) 基本安全风险
工业机器人的任务程序是用“几十年前设计的专有语言”编写的。从安全角度看,20年前的封闭工厂环境和现代智能技术创新环境是完全不同的。因此,编程语言发展时的安全标准很可能不符合今天的标准。基于这一假设,趋势科技在本次调查中,分析了工业机器人行业八大厂商共100个用编程语言编写的任务程序,试图确定“语言设计本身的安全风险”。结果发现,工业机器人的编程语言存在技术安全风险,无需任何权限确认即可无条件使用系统的基本功能。问题的实质是,驱动机器人所需的功能已经实现,但没有机制来防止这些功能被恶意使用。
编程语言的规范高度依赖于平台。工业机器人是一个复杂的网络物理系统,其中程序、控制器和驱动部分密切协调工作。因此,不仅仅是编程语言的问题,更是平台机器人控制器端的问题。
几十年前,当工业机器人的编程语言被设计出来时,智能工厂的概念还不存在,封闭的工厂环境是常态。因此,该设计没有考虑到来自外部位置的主动攻击者,也就不足为奇了。相比之下,智能手机等现代设计的系统在安全设计上假定了恶意攻击。例如,在为Android开发应用程序并用Java编程时,需要一个明确的权限请求来访问应用程序本身沙箱之外的资源。因此,即使恶意开发者将包含恶意软件的应用偷偷植入手机应用商店,也必须申请许可才能使用恶意软件操作应用所需的麦克风、网络和其他系统资源。
这样的权限设置对于工业机器人也是必要的。不过,目前对工业自动化平台还没有这样的要求,所有资源都是“扁平化”接入,任务程序可以使用超出其应有权限范围的低级资源。
工业机器人编程语言被用来定义机器人的运动,但是软件本身有更多的功能。这次研究的制造商专有编程语言不仅支持普通计算系统中的文件系统概念,而且还具有函数指针和动态代码读取等功能。通过充分利用这些基本功能,甚至可以在机器人平台上编写恶意软件。
( 二 ) 专有语言特有的安全风险
由于每种机器人语言的“独特性”,也存在着安全风险。对于常见的编程语言,如C、C++、C#、Java、PHP、Python等,有一些代码检查器,例如静态程序分析工具,可以检测不安全的模式。另一方面,由于没有针对每家公司的机器人编程语言的此类工具,安全检查将很难实现自动化。
工业机器人编程语言不像主流操作系统那样基于通用的运行或体系结构,而是基于每个制造商的平台,如机器人控制器等。出于这个原因,每个机器人供应商还必须准备其自己的专有编程语言和程序执行运行时所基于的环境。有基于实时操作系统(如RTOS)的编程语言和环境,但通常它们不是标准化的。此外,每种语言都有自己的语义,用来判断源代码中使用的变量和语句是否正常工作的标准,这些语义可能与通用编程语言非常不同。事实上,在此次调查的一些语言没有字符串操作或密码操作等功能。
此外,这些类型的特征往往会限制用户的选择。由于工业机器人的编程环境是无法轻易替代的,因此用户纠正这些设计缺陷并不容易,也不实用。此外,每家公司的语言不仅是当前工业自动化的核心,而且有很强的技术限定,这不可避免地增加了转移到其他平台的成本。因此,很有可能用户将不得不选择接受其使用机器人平台的安全风险。
支持制造业的核心技术仍然存在网络安全风险。这就是智能工厂面临的现代困境。
四、以整个生态系统的“设计安全”为目标
工厂环境传统上是“封闭的”网络空间。在这种环境中,只有在那里工作的人才会接触工厂的设备,而不需要考虑与外界的网络通信及其影响。作为本实证研究对象的工业机器人也是在同样的前提下设计的。
然而,在当今世界,即使在工厂环境中,网络连接也在不断发展。为了提高生产率和降低不良率,并在新冠疫情大流行期间保持员工安全和业务连续性,使用数字技术的智能制造流程将成为行业标准。同时,工厂也将面临着网络攻击的风险。软件在智能工厂中无处不在,并与网络相连。此外,不仅是用户公司,还有系统集成商、顾问、工业机器人制造商等,都以一种复杂的方式参与了这类软件的开发和供应。因此,实现安全智慧工厂需要整个生态系统的努力。对于每个用户、集成商和制造商来说,“制作安全的软件”,从而“保证软件的安全”是非常重要的。
( 一 ) 从短期到长期的角度实施风险缓解措施
本系列中提出的安全问题深深植根于工业机器人的基本技术,使得制造商很难立即用另一种技术取代它或进行纠正。因此,除了将保护现有环境作为一项短期措施外,建议涉及工业机器人的利益攸关方应逐步和系统地实施风险缓解措施,将未来的智能作为一项中长期措施。下图显示了趋势科技推荐的特定于涉众的循序渐进的风险缓解措施。为了让智能工厂更安全,现场工程师、系统集成商和工业机器人制造商实施各自的安全措施是很重要的。
图7 风险缓解措施
1、短期措施
实施短期措施的关键参与者是现场的控制过程工程师和实际编写、实施和操作任务程序的系统集成商。用户端的现场工程师必须确保执行网络分段,以减少工业机器人的任务程序被滥用时造成的危害。该操作可以显著降低网络相关的安全风险。除了这些基本的安全措施外,还建议对网络和端点进行保护,以将容易受到恶意代码攻击或感染恶意代码的风险降至最低。此外安全的编码实践对用户来说也是必不可少的。如果是与系统集成商一起进行开发,请尝试与他们共享类似的安全策略。源代码审查、错误修复和创建适当的源代码控制过程都是基本和有效的措施。
2、中期措施
除了上述短期措施外,工业机器人编程语言的安全库可以作为中期措施,以保护新环境。例如,安全库包括加密库。在这个阶段,关键的参与者是系统集成商和工业机器人制造商。通过在高级开发中实现这样的安全措施,现场开发人员可以轻松实现输入值验证和身份验证功能,而无需花费时间添加新的流程。
此外,系统集成商和工业机器人制造商应该实现运动服务器参考。通过实现这样的引用,开发人员不必逐个检查运动数据处理代码中的缺陷。这种参考实现的典型例子是三菱电机的本机运动服务器和Kuka的EKI。此外,作为针对源代码评审中发现的漏洞对策,系统集成商应该考虑为可能包含漏洞的任务程序提供主动补丁。
3、长期措施
在未来,制造商的努力对于确保可编程工业机器人的设计安全是至关重要的。例如,在一个工业机器人平台控制器中,将安全功能如身份验证、访问控制、加密等,整合到编程语言中是至关重要的。工业机器人控制器中的运行,必须实现细粒度的特权分离,以利用授权系统。减少漏洞和恶意代码影响的一种有效方法是将函数的执行限制在特权指令上。最重要的是,开发者还需要让其他人提前知道这些使用限制。
最后,代码签名是确保工业机器的代码不被篡改的唯一方法。代码签名并非易事,但使用此方法可以确保代码与原始开发人员编写的代码完全相同。在工厂设备中实施代码签名还有很长的路要走,但如果市场需求继续推动有利于集成和灵活性的创新,应该可以在更短的周期内实现更动态的自动化代码实施。这应该会加快开发速度,减少手动检查程序所花费的时间。安全编写的任务程序也减少了创建漏洞的机会。这反过来又降低了可编程工业机器暴露于外部攻击的风险。事实上,已经有许多针对通用编程语言的安全意识编码准则。随着IT和OT集成的进展,在未来十年,工业工程行业可能会面临与IT软件行业今天所面临的相同的挑战。
( 二 ) 以整个生态系统的“设计安全”为目标
随着制造商采用更多智能工厂技术,其互联性使他们面临更多的网络攻击,防备缺口日益突出。工厂环境中的网络安全措施正在转变。至少在10年内,承担与外部世界网络连接的智能工厂将变得司空见惯。届时,工业自动化行业很可能面临与现代IT软件行业同样的挑战。
通过本系列的四个部分,从网络安全的角度分析了工业机器人的任务程序和编程语言,阐明了现代工业机器人面临的问题。此时,尽管很难采取所有可能的措施来解决调查中确定的安全问题,但制造商、集成商和用户可以共同努力将这些风险降低到可以接受的水平。
( 三 ) 在智能工厂中建立网络弹性的方法
● 制造企业应投资于一项全面的网络管理计划,该计划扩展到整个企业(IT和OT),以识别、保护、响应和从网络攻击中恢复;
● 执行网络安全成熟度评估:评估应包括OT环境和业务网络,并应包括先进制造网络风险;
● 建立一个考虑OT的正式网络安全治理计划:该计划应提供一致性,并推广到全球制造地点;
● 根据由此产生的风险状况确定行动的优先顺序:使用网络安全成熟度评估的结果来创建可与执行领导层共享的战略和路线图;
● 内置安全性:由于许多智能工厂仍处于规划和早期阶段,现在是将这些项目与网络风险计划相协调的时候了。
智能工厂的安全性需要大量的规划,最好从设计阶段开始。制造商必须从一开始就为智能工厂需要的大量数据做好准备。这意味着要事先计划使用的设备类型,评估要采用的通信协议,甚至准备好要遵循的违规相关的标准操作程序(sop),以及其他考虑事项。制造商还必须与专家合作,保护和捍卫设备、网络、数据以及驱动物联网智能制造系统的软件解决方案和应用程序。
智能制造的潜力是巨大的,不应受到安全疑虑的阻碍。在创建或改造智能工厂时,行业领导者必须建立信任。解决方案必须经过仔细、精确的选择和认可,才能获得优异的性能。由于制造设备的生命周期很长,因此选择的解决方案必须具有内置的灵活性和先进的更新解决方案,以防止当前和未来的威胁,这一点是至关重要的。