技术前沿

由工业控制系统构建浅谈升源软件安全

2020-12-15 蓝西资讯

伴随着开源软件被各大企业、高校乃至于政府部门使用,人们对开源软件的关注已逐渐从价格方面转移到性能、安全性以及用户体验上。根据美国新思科技公司(Synopsys)发布的《2020 年开源安全和风险分析》一文中提供的数据,99%的代码库包含至少一个开源组件,其中开源代码占所有代码的70%,由此反映出使用开源代码在软件开发中占有较大比重,覆盖的行业包括企业软件、工业控制环境、医疗、金融等众多领域。在审计的代码库中,75%的代码包含具有已知安全漏洞的开源组件,而伴随着开源软件数量的不断增加,无论是开源组件还是成品的开源软件,含有漏洞的产品的占比将会持续增加。

一、开源软件在工业领域的安全风险

近年来,开源软件使用率逐渐增长,但其中的安全性问题也日益凸显。主要的安全性问题表现为以下3个方面。一是使用过期和废弃的开源代码的行为非常普遍,并且使用易受攻击开源组件的行为也比较普遍。二是开源代码和软件安全漏洞收集与管理分散,社区对安全漏洞管理没有十分重视。根据White Source公司2 0 2 0年发布的《开源代码脆弱性态势》提供的数据,2019年报告的开源软件漏洞较上年增长了50%,超过85%的开源软件漏洞已经被公开并修复,但只有84%的漏洞信息被收集在漏洞数据库中。而当下的开源软件漏洞的信息广泛而零散地分布在各大开源社区中,造成了漏洞信息收集困难。三是无意行为与恶意行为并存。开发者可能源于粗心的编程或使用“不安全的”开发工具开发开源项目并发布在社区内。当然也存在不法分子利用开源平台注入恶意病毒、兜售漏洞信息或利用漏洞开发开源软件或服务。这3方面不足以概括所有安全问题,但确实广泛存在于工业领域中。

互联网领域,例如邮件传输代理Sendmail、Web服务器Apache、操作系统Linux、数据库系统MySQL和办公软件包OpenOffice,广泛使用开源软件与开源的应用。除此之外,开源软件甚至已经成为部分技术服务公司的核心基础架构,例如Amazon、Google 和Yahoo。显然,开源软件已经是重要而关键的信息系统,它需要安全保护以免受攻击。其可用性与使用范围的不断提高使它吸引了黑客和其他对软件漏洞感兴趣的人。更加危险的是,如果开源软件不是在封闭的环境中使用,而是与其他系统和网络互联,相关漏洞的后果将更加难以预料。在2017年9月,客户信用评估机构Equifax宣布了遭到网络安全攻击造成用户数据泄露。该机构使用Java Web应用程序框架ApacheStruts建立他们的网站,而数据泄露是由Apache Struts 的漏洞(CVE- 2017-5638)引起的。开源Apache在20 17年和2020年接连曝出高危漏洞,分别出现在Apache的Tomcat组件和Spark组件中。对于前者,攻击者可以构造参数攻击Tomcat AJP协议,以读取服务器webapp下的任意文件,后者则由于Spark认证机制存在缺陷,致使密钥认证失效,攻击者可以通过构造调用指令攻击服务器并取得远程代码执行的权限。上述漏洞均被CNVD评为高危漏洞。

工业控制系统开源软件方面,在2018年NIST报告的漏洞中,知名开源工控系统Rapid SCADA被曝出由于弱权限导致的提权漏洞,该访问控制漏洞使得攻击者可以在管理员环境中执行任意远程代码,被NIST评为“严重”级别,给出的弱点为CWE-274,属于不正确的默认权限。Rapid SCADA作为完整的工业控制系统,包含了现场控制层、过程监控层及人机界面等多种功能,由于其成本低,被大量国内制造企业选为控制系统。一旦攻击者使用该漏洞进行攻击,将引发严重后果。

二、开源软件在工控系统的安全应用实例

面向工业互联网,开源软件与组件被广泛使用。以下通过一个简单的电力系统实例可以发现工业控制系统如何使用开源资源,以满足自身的现场设备层、现场控制层、过程监控层、制造执行系统层(MES)和企业管理层的构建。

在工业控制系统中,现场设备层是由远程终端组件(RTU)、智能电子设备(IED)等构成。现场设备层通过各类工业以太网连接可编程控制器(PLC )、分布式控制器和分布式数控等控制单元接入成为分布式控制网络,形成现场控制层。其中,可以使用公开的Modbus TCP协议设置点对点或总线式的数据通信。在现场设备层与控制层中,不同厂商的下位机使用的协议、物理接口均不同,开源软件难以运行在该层次。而在现场控制层和过程监控层中,用于管理下位机的OPC系统、人机交互界面(HMI)以及服务器后端(包含用于数据存储的模块)等均可以使用开源软件。

除此之外,随着物联网技术的发展,远程控制现场设备已经成为趋势,传统的工控系统安全防护的方法,诸如物理隔离、网闸等措施不能很好地适用于现代工控系统。而对于工控系统使用的协议,如在SCADA系统中,其专业协议在发展的过程中逐渐向开放的TCP/IP靠拢,具有TCP/IP协议的特性。此外,开源环境支持配置开发各种Internet服务,如HTTP、FTP等,用于园区管理层的通信。现在企业管理层越来越广泛地使用虚拟化,可以使用VirtualBox进行管理。在工业互联网概念下的云资源也有大量的开源资源,例如Oracle 的VirtualBox hypervisor可以搭建云计算平台。

当然,针对工控系统的信息安全防御,可以将传统互联网中的开源网络安全检测工具运用于工控环境中。譬如基于纵深防御的思想在工控系统的每层之间架设防火墙和IDS系统,这些安全模块都可以选用开源的网络防火墙和IDS系统,并对其进行适当改进。在该工业控制系统中,其中搭载了多种开源安全工具,如Snort用于入侵检测,Wireshark提供包捕获功能,Sebekd支持击键记录,Argus收集网络统计数据,MySQL用于数据存储等,为管理人员提供高自由度的配置选择。在该工控靶场系统中,风险评估与事件挂钩,根据事件的特点对事件赋予不同的可靠度值和优先级。在态势感知中,安全分析为每一个事件赋予一定的风险等级:一旦事件的风险值超过配置的阈值,就会生成一个“警报”并显示在开源环境下开发的Dashboard上。

以上所描述的简易的工控系统都是在开源环境下搭建的、广泛使用开源组件开发的和借助开源软件支持下实现的。借助这样的开源工具,帮助在低成本高效率地构建工控系统时,不可避免地为我们引入了开源环境的安全性问题。

三、开源软件脆弱性的原因分析

开源软件的兴起离不开开源社区的发展。社区的兴起为开源软件的开发和传播奠定基础。开源软件具有协作开发的特点,故开源软件存在着不同于传统软件的安全脆弱性。从开源软件安全技术开发分析,开源软件安全划分为管理、架构、认证和部署4个方向。在这4 个方向中,大多数的研究者更倾向于研究架构和认证方向的技术,主要着眼于开源安全系统设计、开源漏洞特征分析等研究方向。而研究管理和部署方面相关的社会技术的研究者较少,导致用于战略管理、政策管理、培训等方面理论很少,进一步造成了在解决开源软件安全问题时,多使用传统技术的局面。对于一个完善的安全管理系统,社会技术方面和传统技术方面同样重要。从社会技术角度对造成开源软件脆弱性的原因进行划分,可以发现从软件开发时的分工到开源软件社区公布的安全要求,都会对开源软件的安全性产生影响,主要影响来源于以下6个方面。

(1)开发者对软件安全的态度和行为方面。开发者或组织者并没有意识到软件可能会出现安全漏洞,或是开发者认为软件价值不足以召来攻击者,抑或是关注软件安全审计会导致工作量增加使得开发者不愿意投入精力。安全检查工作会致使开发者的工作量增加,因此部分开发者不愿投入过多精力在安全性检查上,该类群体将主要精力放在实现软件功能以及提升软件性能上,而如果开发者的能力不足或没有做安全性检查的习惯,开发出的软件可能会产生漏洞。

(2)开发者开发能力与开发者行为方面。由于部分软件开发者并不直接接触代码或是没有系统接触过软件安全分析流程,该群体并不具有对软件安全性进行分析的能力,也并不了解软件安全性分析的流程,最终只能根据经验对软件进行修改或直接选择承受风险。

(3)开源社区规范制定方面。要求开源软件的开发团队针对软件安全制定一套规范比较困难,所以多数团队把开发重点放在实现软件功能上,退而求其次使用开源社区提供的规范,然而大部分社区并没有提供相关规范,这就意味着对于大多数开源项目,软件安全规范方面还是空白的、缺少相关规范的限制,开源软件安全性分析的流程不规范可能会导致安全审查过程出现缺失。

(4)开源开发管理方面。部分开源软件开发团队没有设置专门的安全管理团队。原因可能是成员不具有安全管理的能力,或大部分的团队并没有与安全软件公司挂钩以获取安全管理资源。因此大多数情况下,安全管理工作由组织者承担。管理的效果则与组织者的个人责任感和能力相关,无法保证能及时发现别有用心者在软件组件中安插的非法操作代码。

(5)沟通渠道与组织管理方面。由于大部分项目是由志愿者开发组件,由组织者进行综合,在此过程中会出现两方交流不彻底的情况,致使组织者提供的安全要求无法及时传达到个人,以及志愿者在开发时遇到安全问题无法找到有效的解决方案。最终,志愿者上传的组件中的安全问题未得到有效解决却直接被组织者采用。

(6)开源社区使用者方面。虽然理论上当越多的人看到软件的源代码时,软件代码中的漏洞越容易被发现,软件也会变得越安全。但实际情况中,大多数代码审核者并没有刻意去寻找漏洞,即便是对发现这些漏洞最感兴趣的人群,也大都倾向于发掘较为浅显的漏洞,故而具有严重影响的漏洞并不一定会被及时发现。

以上是开源软件存在问题的原因,主要可以归纳为责任划分不具体或缺少责任划分、安全意识薄弱、对软件安全性抱有侥幸心理以及开发人员能力不足。

四、开源软件安全分析与安全应对

通过以上工控系统的构建实例,我们可以发现相比于传统软件,开源软件突出的特点为源代码公开,用户可以在源代码的基础上根据实际使用需求对代码进行选择、更改和配置。传统软件开发注重经济效益,以赢利为目的,故有保护源代码的刚需,而开源软件的开发者团体多为兴趣所驱动,使源代码得以公开,开源社区进行技术交流和技术支持。在使用时用户可以删减不必要的代码,优化需要的核心功能。经过修改后的代码更加符合用户需求,在体积上也更加轻量化,相比于传统软件注重功能的全面性,开源软件将重点放在了软件的多样性和专一性上,在某些有特殊要求的领域,如工业互联网中有较好的表现。此外,由于代码的公开,开源软件出现的漏洞会很快被志愿者发现并反馈给开发团队,使之得到及时修正或能够让使用者及时得到提醒。

开源软件具有的另一特点是使用成本低。在用做商业用途时,使用软件所投入的成本大小就必须要纳入考虑范围,开源软件的低成本使其成为较好的选择。开源软件的使用成本主要体现在对软件的修改、部署和后期的运维上。开源软件的使用者对软件的使用、研究和改良都是自由的,传统软件受到知识产权相关法规的保护,无关个人或组织对传统软件的研究和改良都是不受法律保护的,在某些地区甚至与当地法规相违背,而开源软件并不存在这些桎梏,使用者可以任意对软件进行研究、更新,且所有的研究结果和改良方式都为使用者所拥有,不存在产权问题,这为开源软件脆弱性分析提供了便利。因此,开源软件的使用者不会如传统软件的使用者那样受到软件厂商的更新限制,可以更加及时地更新软件。

那么如何做好安全的开源软件安全开发呢?笔者建议可以从以下3个方面去做。

(1)管理好开源社区:可以毫不犹豫地说当今任何优秀的开源软件或基础软件,都离不开开源社区的支持。因此扶持管理好有价值的开源社区非常重要。围绕规范的开源社区,研究与开发新的开源软件的安全需求处理框架和策略对开发人员安全开发软件有很大的帮助。例如,从开源软件项目的非功能性和功能性的需求中识别安全需求,研究高精度的自动化工具支持安全需求追踪以及选择测试策略并生成测试用例的方法等技术就非常有意义。

(2)从政策上引导开源软件安全开发与安全开发从业人员培养:我国人力资源丰富,为开源软件开发提供了基础。利用产学研协同合作可以很好地构建人才体系和优化的开发工业软件。在安全性上,要明确安全开发的核心。传统的安全学习方法通常以安全性为中心,以主题形式介绍知识内容,因此不适合于兴趣驱动学习者进行学习。开发人员或安全问题的学习者面对如此广泛的安全知识,通常会认为软件安全性很难实现,倾向于将其抛在一边。因此,需要从上至下,有组织有协调地从需求开发入手,组织资源,为软件安全构建特定的学习情境和交流平台,使学习者可以浏览安全知识并将其与他们熟悉的环境相关联。这一行为需要从政策上协调,实现合理规划与资源配置。

(3)加强开源软件安全开发合作和形成安全策略:开源软件安全开发需要各方有效有序有力的合作,需要在国内外合作的基础上,在产、学、研配合下,在政策指导下,保障开源软件安全开发。考虑到现有开源软件项目要么缺失相应的安全策略,要么所采用的安全策略局限过大,故需要借鉴成熟的安全策略,合并到统一合作的机制中。因此,未来的研究应确定在实践中使用的更多候选安全策略,并找到将它们系统地纳入现有安全策略层次结构的方法。将新发现的安全策略纳入策略层次结构时,还需要进行进一步研究以评估其有效性。

五、结语

近年来,越来越多的事件暴露出我们国家基础工业软件方面的薄弱问题。在开发重要的基础工业软件上,开源社区和开源软件不可避免地扮演着重要角色。安全开发开源软件需要至少从管理好开源社区、从政策上引导开源软件安全开发、加强开源软件安全开发合作和形成安全策略三方面发力。做好开源软件安全开发将有利于我国基础工业软件的蓬勃发展。