航空系统中的软件安全性研究
2015-06-24史亭文王伟张成
史亭文++王伟++张成
摘要:软件安全性是保障系统安全性的重要条件。该文首先介绍了软件安全性的主要内容,描述了几种常用的软件安全性分析技术,针对航空系统软件所存在的问题,从系统设计到软件编码直至软件测试阶段,对机载软件的安全性分析过程进行了详细描述,最后,文中总结并展望了软件安全性分析的发展方向。
关键词:系统危险;软件安全性;安全性分析
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)11-0051-02
随着科学技术的迅猛发展,软件在航空领域的应用越来越普遍。近年来由于软件的失效引起的财产损失、环境破坏、人员伤亡,甚至灾难性飞行事故也屡见不鲜。如2009年在大西洋坠毁的法航AF477航班,其坠毁原因就是由于测速仪结冰给出飞行控制软件错误的攀升指示,而在软件设计中又没有设计高度上限,最终导致悲剧的发生[1]。在同一年,土耳其航空公司的一架波音737飞机在跑道行进期间由于故障出现了飞机失速,而飞机的机载软件缺乏处理失速的情况的程序,最终导致飞机坠毁[2]。由此可见,软件的安全性问题在航空系统中的影响越来越重要,一个简单软件安全问题会影响到整个飞机系统的安全性。
单独软件本身在运行中并不存在或者并不能体现安全性问题,软件只有运行在系统中才可能导致诸如系统崩溃、错误指示、人员生命危险等事故时在涉及到软件安全性问题。软件安全性是保障整个系统安全性的重要条件。软件安全性是指系统在规定的条件下、规定的时间内,完成规定功能的过程中避免危险条件发生的能力[3]。而危险条件被定义为可能导致不可接受的风险发生的异常条件。软件的安全性作为软件质量的重要属性,其体现了“软件在系统工作中避免不可接受风险的能力[4]”和“软件运行而不引起系统事故的能力[5]”。因此软件安全性成为控制系统危险的关键因素。
本文首先介绍了软件安全性的主要内容,描述了几种常用的软件安全性分析技术;针对航空系统软件所存在的问题,从系统设计到软件编码直至软件测试阶段,详细描述了机载软件的安全性分析过程;最后,对全文进行了总结。
1 软件安全性概述
系统安全性是指“产品具有的不导致人员伤亡、装备损坏、财产损失或不危及人员健康和环境的能力”[6]。影响系统整体功能执行的因素很多,包括硬件故障,操作人员的错误,软件错误或者系统设计缺陷等,这些因可能导致系统进入危险的状态。由此可见,整个系统的安全性工作应该深入到系统中的各个环节和子系统中,而软件的安全性分析是保证系统安全的关键之一。
软件安全性问题主要关注可能导致系统发生危险的软件失效,以及与此类软件失效相关的设计缺陷和外部输入条件。软件失效是指软件在缺省条件下不能完成规定的功能。当软件存在设计缺或者软件错误时有可能发生软件失效,但是,只有软件执行到有缺陷或错误的路径时,才能产生失效。如果防止软件失效的措施没有起作用,那么软件失效就会威胁到整个系统的安全性,甚至造成悲惨的事故。图1[7]给出了软件失效的因果关系和产生的影响。由此可见,为了避免软件失效造成的系统故障,应该对软件进行全方面的分析,从系统层到代码层,从外部运行环境到软件内部详细设计,提高软件的安全性。
2 软件安全性分析技术
下面介绍常用的几种软件安全性分析技术。
初步危险分析(Preliminary Hazard Analysis,简记为PHA)[10]是系统危险诊断的一种技术,是对软件进行安全性分析的重要手段。PHA提出了针对软件设计、开发过程中需要跟踪、解决的风险清单的初步框架。
软件失效模式及影响分析(Sostware Failure Mode and Effects Analysis,简记为SFMEA)是对传统的系统故障分析技术FMEA的扩展,是以失效模式为基础,失效影响及后果为中心,自底向上的分析技术,用以识别软件的薄弱环节,并提出改进措施建议[11-12]。SFMEA可以分为两个层次:全局级SFMEA和模块级SFMEA。全局级SFMEA主要对软件的体系结构进行分析评价,降低由软硬件失效所导致的软件风险。模块级SFMEA主要对软件模块内部进行分析,找出失效的根本原因和具体位置,从而采取适当的方法避免这种风险发生。
软件故障树分析(Sostware Fault Tree Analysis,简记为SFTA)来是传统系统分析技术FTA的延伸,是一种自顶向下的分析技术,以影响系统的故障事件为起点,向下逐层分析,最终找出软件失效原因。
3 软件安全性活动
一个安全的系统应该能够满足系统的所有安全性需求,如果某些需求不能满足,就有可能导致系统故障,甚至引发灾难。大多数的航空软件失效都是因为软件安全性需求不完整,安全性分析结果无追踪导致的。软件安全性工作包括安全性分析、安全性设计和安全性验证三个部分,如图2[3] 所示。为了获得完整和准确的软件安全性需求,就需要进行充分的安全性分析工作,并且进行安全性追踪,这样才能保证航空系统软件的安全性。下文详细描述了一种软件安全性分析的方案。
图2 软件安全性活动
3.1 系统风险识别
在机载软件开发初期,主要由总体设计人员对系统进行安全性分析,从系统的运行状态、执行环境等因素,通过分析系统中存在的与软件相关的危险因素,识别系统风险。然后,根据系统风险的严重程度进行分类,并列出各功能的危险状态和影响等,获得系统风险的初步清单,确定软件的安全性关键功能和特性,并在软件研制任务书中列出。为了确定引起系统风险的发生原因,在系统设计阶段,通常采用PHA技术,根据历史经验数据与系统风险清单进行对比,分析出其发生的原因,并提出控制这类风险发生的措施和验证方案。
具体过程如下:
1) 从系统运行状态、执行环境等,识别系统关键功能,识别系统风险;
2) 分析系统风险对系统的影响,并根据DO-178B标准对系统风险的影响级别进行分级;
3) 记录各功能故障对应的危险状态和影响,得到系统风险初步清单;
4) 根据历史经验数据和经验,补充系统风险清单;
5) 对每一种系统风险的发生原因,确定至少一种控制措施;
6) 任何一种风险控制措施,都要提出一种软件安全性验证方法。通过分析、评审、测试来验证现有软件的安全性需求。
3.2 软件安全性需求获取
软件安全性需求是指:通过约束软件的行为,使其不会出现不可接受的违反系统安全的行为[13]。软件安全性人员根据系统安全性人员提供的系统安全性需求、环境需求、接口需求、系统危险分析报告,查找软件安全性关键功能,确定安全性关键需求,并且根据危险发生的可能性和严重性对需求的关键性进行排序,并且在需求规格说明中将软件的安全关键功能标识出来。为了进行软件失效模式和影响分析,通常采用SFMEA技术,根据需求规格说明和系统初步危险清单以及历史经验数据,分析可能引起系统风险的软件失效模式、产生失效的原因以及该失效所产生的影响,并提出对应的改进措施;最后,基于该分析结果,采用SFTA技术,对引起软件失效模式的原因和其逻辑关系进一步分析,获取相应的软件安全性需求。
该过程的具体的实施过程如下:
1) 根据系统安全性需求、环境需求、接口需求和系统危险分析报告,确定安全性关键需求;
2) 根据危险发生的可能性和严重性对安全性关键需求排序,并标识到需求规格说明中;
3) 根据软件安全性需求的功能描述和重要度排序,从系统危险清单选取系统危险,参照相似系统的常见失效模式,识别和分析系统危险所对应的软件失效模式;
4) 针对不同类型的软件失效模式,根据软件功能层次关系,分析其对本层、上一层和系统层的影响;
5) 逐类分析每一种失效模式产生的原因,并提出相对应的改进措施;
6) 将软件的失效模式、失效影响、失效原因和对应的改进措施进行记录,获得软件失效模式及影响分析表;
7) 依据软件失效模式,确定所分析的软件故障树顶事件;
8) 收集软件功能数据流及运行状态,分析导致顶事件故障的事件及其逻辑关系,构造故障树;
9) 分析故障树的底事件,获取相应的软件安全性需求。
3.3 软件安全性设计
为了进一步提高机载产品系统的安全性,需要进行机载软件安全性设计工作。软件安全性设计主要在代码层次上从软件设计角度进行软件实现细节的安全性分析,重点分析软件是否正确地实现了安全性需求,是否存在会造成系统危险的设计缺陷等,其主要从功能分配、程序接口、故障检测、恢复和安全保护,性能和余量,可追踪性以及可测试性等方面开展。
软件安全性设计分析的主要内容如下:
a) 功能分配:确定实现软件安全性需求的模块和类等,将安全关键的部件和非安全关键部件隔开;最小化安全关键部件的数目,并将安全关键部件在设计层机构中的位置和功能在设计文档中描述出来,并详细说明每个安全关键部件和安全性需求的追踪关系,实现方式和实现约束等;
b) 程序接口:对所有部件之间的功能接口进行定义,并标识该接口中的安全关键数据,在设计文档中详细描述每个接口的设计流程;对软件的输入地址、输出地址、输出时序、内部接口以及数据公共区的使用进行分析;
c) 故障检测、恢复和安全保护:对安全关键部件制定差错检测或者恢复方案,并且在设计中考虑容错和容失效措施等;
d) 性能和余量:描述安全关键部件对安全性需求的响应方式,并对这些关键部件设计余量;
e) 可追踪性:标识每一个部件到软件需求的追踪性,尤其 (下转第54页)
(上接第52页)
是到软件安全性需求的可追踪性;所有的需求都应该向下传递到设计,并通过维护可追踪矩阵对需求和设计的对应关系进行验证,其次,对于每一个安全关键软件的设计,在设计文档中描述出其测试和验证的方法;
f) 可测试性:分析可以对部件内部进行充分测试的方法,并验证其正确工作,评审原型代码,对其初步测试结果进行分析,将其记录在测试文档中;测试过程中发现的任何错误和缺陷,都应该修改并给出理由;安全性人员需要获知所有发现的安全关键问题,以便制定出可行的解决方案。
3.4 软件安全性验证
软件安全性验证主要在于验证软件是否正确的实现了安全性设计,并且没有违反软件的安全性需求。通过实际测量软件的规模、复杂性和资源利用情况,将其和设计阶段估计的结果相比,如果其差别较大,则可能需要重新进行设计。通常安全性验证方法包括软件逻辑分析、软件数据分析、接口分析、中断使用分析、规模分析以及代码审查等。
4 结论
航空软件大多数的失效都是因为软件安全性分析不充分,所获取的软件安全性需求不完整,安全性分析结果无追踪导致的。针对航空系统软件中存在的问题,本文提出了一种安全性分析方案,其结合常用的安全性分析技术,从系统设计到软件编码直至软件测试阶段,对软件安全性进行逐层分析,获取详细的软件安全性需求,将其落实到软件设计中,验证其实现软件安全性需求的正确性和完整性;其中通过建立需求追踪矩阵,实现软件安全性的追踪。
软件安全性问题是一个非常复杂的问题,需要考虑软件、操作人员和系统之间的相互影响,这就需要相关人员掌握有关的安全性分析技术,在实际型号研制过程中加以应用,逐步总结和积累,形成适合航空系统软件特点的安全性分析方法,对提升航空系统的安全性具有重要的意义。
参考文献:
[1] Learmount D. Never again. Flight Intl, 2012,182(5367):32 35.
[2] Afshar A, Majid Hajyhosseinloo MD, Ali Eftekhari MD. A report of the injuries sustained in Iran Air Flight 277 that Crashed near Urmia, Iran. Archives of Iranian Medicine, 2012,15(5):317 319.
[3] 周新蕾. 软件安全性分析技术及应用[J].质量与可靠性,2005(3).
[4] N ASA-GB-8719.13.Software Safety Guidebook [S].2004
[5] GJB/Z102,软件可靠性和安全性设计准则[S]1997.
[6] GJB Z 102A-2012 军用软件安全性设计指南. 2012.
[7] Li Juan, Chen Bin.Study on Software Safety in Industrial System.
[8] GJB5000A-2008 军用软件研制能力成熟度模型.工业和信息化部软件与集成电路促进中心(CSIP)25.
[9] 陈晓娟.基于GJB5000A二级成熟度等级的软件项目管理[J].计算机系统应用,2013(8).
[10] NASA-GB-8719.13.Software Safety Guidebook[S].2004.
[11] 石柱,马宽,郑重.软件FMEA实例研究[J].航天控制,2010(28):75-83.
[12] 申光耀.软件安全性保障框架及安全性技术应用[D].北京:北京信息控制研究所,2005.
[13] Wu WH, Kelly T. Safety tactics for software architecture design. In: Proc. of the 28th Annual Intl Computer Software andApplications Conf. 2004.