APP下载

嵌入式软件的安全设计

2020-07-06廖丽华

自动化仪表 2020年6期
关键词:嵌入式软件嵌入式软件

廖丽华

(1.上海仪器仪表自控系统检验测试所有限公司,上海 200233;2.上海工业自动化仪表研究院有限公司,上海 200233)

0 引言

随着嵌入式技术的发展,嵌入式软件已广泛应用于石油化工、核电、交通、航空航天等工业领域,成为工业信息化、智能化的重点。嵌入式产品或系统的安全投用,与人类的文明发展息息相关。所以,一旦嵌入式软件的设计没有考虑到安全性,就有可能使系统或产品发生故障,对人员、设备或环境造成灾难性后果,例如波音737MAX的坠毁、阿里亚娜5号火箭爆炸事故、温州动车事故等事件。

人们越来越重视嵌入式软件的安全设计,因此在相应领域制定了一系列IEC、IEEE、ISO等嵌入式软件标准。这些标准都对嵌入式软件的安全设计作出了详细的指导和规范,例如IEC 61508、IEC 60880、IEC 62138、IEEE 1012、ISO 26262、EN 50128、DO-178等。

1 安全与嵌入式软件

安全即要求没有不可接受的风险。风险是危害发生的概率与危险后果的严重程度的组合,所以识别危害和降低风险是安全设计的基本要求和起点。危害识别是识别安全系统所需安全防御功能的第一步,也是非常重要的一步。如果某个安全防御功能没有同相应的危害或者危害事件联系在一起,那么这个安全防御功能是不起任何作用的。一旦所有危害都被识别,安全设计工作即可完成一半。危害性分析[1]就是对由系统开发或运行导致的软件不良后果进行的系统定性或定量的评价。这些后果可能包括损害、疾病、死亡、任务失败、财产损失、环境破坏或负面社会影响。

风险与安全的关系如图1所示。

图1 风险与安全的关系图

嵌入式软件与嵌入式系统是密不可分的。嵌入式系统由国际电气和电子工程师协会(IEEE)定义,是一种用于控制、监视或者协助设备、机械和车间的装置[2]。嵌入式软件是以应用为中心,以计算机技术为基础,且与外部硬件和设备紧密相连。嵌入式软件具备以下特点。①一般根据应用需求定向开发;②因为它能在没有人员干预的情况下独立运行,可用于特殊的工况;③实时性高,能够迅速完成数据计算或数据传输;④灵活性强,通常被设计成一种模块化软件,可以非常方便、灵活地运用到各种嵌入式系统中,而且不会破坏或更改原有系统的特性和功能[3]。由于嵌入式软件的主要服务对象为嵌入式系统,如果软件的存在风险,则可能导致系统失效,从而造成严重的后果。所以,提高嵌入式软件的安全性迫在眉睫。

嵌入式软件的开发模型如图2所示。

图2 嵌入式软件的开发模型

嵌入式软件安全设计的最终目的就是将风险降低到可接受范围,而不是要求软件完全无风险。嵌入式软件的安全分析贯穿系统/软件安全生命周期的相关阶段,所以应在系统/产品的质量保证计划和安全计划中,考虑软件的安全分析。从嵌入式软件的开发模型分析,嵌入式软件的需求包含硬件自身对软件的需求,所以硬件的安全性由软件来保证。本文分别从硬件和软件方面,阐述嵌入式软件的安全设计。

2 相关硬件的安全分析

嵌入式系统结构如图3所示。

图3 嵌入式系统结构图

整个嵌入式系统由硬件层、驱动层和软件层组成。硬件层一般由电源、内存、输入输出接口、人机交互接口、处理器、时钟、定时器、内部通信等组成。驱动层是硬件驱动及应用服务接口层,不仅要实现硬件设备的基本功能和提供控制硬件的操作,还为应用层提供调用驱动程序的接口,使得软件开发者不用理会底层硬件的具体操作。在嵌入式系统中,软件通过控制硬件来实现监测和控制功能,并诊断出硬件的故障,使不可诊断的危险失效变为可诊断的危险失效,以保证嵌入式系统不可诊断的危险失效足够低。所以在嵌入式软件安全设计之前,需先分析相关硬件的潜在失效模式,通过嵌入式软件的安全设计提高嵌入式系统的整体安全。

嵌入式系统硬件从与嵌入式软件的关系可分为两类。一类是与嵌入式软件运行直接相关的硬件,包括处理器、寄存器、地址寻址、RAM、EPPROM、时钟等。这些硬件故障会直接导致软件运行的错误。另一类是与嵌入式软件正常运行没有直接关系,但是与嵌入式系统实现的功能相关的软件,如ADC、DAC、SPI等。硬件安全设计除需选择通用且长期使用的芯片和元器件之外,还应使软件具备如下功能。

①对电源过压、欠压、切换和断电等情况的诊断功能,排除电源故障。

②对于可变内存(如RAM等)的诊断功能,包括排除数据和地址的DC故障、内存单元的动态交叉、软错误引起的信息改变、寻址等故障。一般采用跳步模式或透明模式RAM测试法、Abraham RAM测试法、软件比较和读/写测试的双RAM[4]等算法。

③对于不可变内存(如EPPROM等)的诊断功能,排除内存中数据的存储故障。一般采用多位冗余字保护、修正校验、单字或双字签名和块复制[4]等算法。

④对于外部的输入输出接口,必须先确定数据传输的格式、类型和范围;每次传输都至少使用防御性编程防止数据的不合理性,采用奇偶校验来检验其正确性。

⑤对于硬件接口,在进行读写操作时,软件须能检测外部输入或输出设备的失效,且在硬件失效时,软件能恢复到某个可接受的安全状态。

⑥合理设置看门狗,保证程序运行序列正确。

有些硬件只在上电时进行一次诊断就可以保证其安全性。但对于存储、通信及相关的硬件,只有一次诊断是不行。所以在使用系统/产品时,软件设计还要对该类硬件进行定期监督诊断或检验。对于通信,可以在数据传输之前对数据传输通道进行定期的检测,以确保数据传输的正确性。

如果嵌入式软件设有人机交互接口(LCD/触摸屏、键盘、鼠标等),且设有需要操纵员访问或更改数据的功能,则软件应提供限制访问权限功能,从而使得未授权人员或系统不能读取或修改数据。对于人因可能带来的安全性威胁,软件在相关的设计、配置和(或)参数分配中,应采取以下有效保护措施。

①分析配置和(或)参数修改的数据是否为安全数据。安全数据尽量限制其在配置状态进行配置。

②设备运行过程中,通过界面修改安全数据。首先,应限制其权限,再对修改后的数据进行校验,并反馈数据是否配置、修改成功。

③软件设计应考虑参数修改的可追溯性,以能记录参数修改时间、修改人等信息为宜。

④软件设计应便于操作员采用单一操作即可让系统退出潜在不安全状态,恢复到安全状态。

⑤设计保护措施避免误触发操作,造成无意激活。例如设计启动安全功能时,可由两个或多个人员在“与”方式下操作,或者一个人至少两个以上的操作才能触发。

⑥安全操作手册应提供清晰、简明且无歧义性的界面操作步骤、图标、显示信息等。

3 软件安全分析

目前,常用的安全分析方法有检查表分析法、假设分析法、软件失效模式及影响分析(software failure mode and impact analysis,SFMEA)[5]、软件故障树分析法(software fault tree analysis,SFTA)[6]、事件树分析法(event tree analysis,ETA)和危害与可操作性分析法(hazard and operability analysis,HAZOP)。在软件安全分析方面,最实用的是软件失效分析,而且在软件的生命周期阶段的系统需求、软件需求及设计阶段都应进行分析。例如,在需求和设计阶段,对软件初始化模块进行失效分析,得到相应的软件需求规格书(software requirements specification,SRS)。软件设计说明(software design discription,SDD)。初始化模块的软件失效分析结果如表1所示。

表1 初始化模块的软件失效分析结果

4 软件设计

软件设计描述是便于分析、计划、实施和决策而创建的软件表示。一般采用一种或数种较高级的形式进行描述,例如数理逻辑、集合论、伪代码、真值表、逻辑图等。为了避免其歧义性,应尽可能地让所有系统都使用相同的架构和技术方法(例如均采用自上而下的方法),以防设计产生错误。例如,软件的安全性设计可以从以下几个方面考虑。

(1)模块设计方面。①应选择模块化设计,且要求清晰简单、可测试,以尽可能降低后期的修改对软件的影响。②软件模块间内聚耦合应采用高内聚低耦合。③除中断外,每个模块只能有一个入口和一个出口,以避免死循环。④模块的大小尽量限制在两个屏幕之内,即大约200行之内。⑤高层模块高扇出,底层模块高扇入,可适当增加模块的扇入,避免代码重复。⑥最小化共模故障,便于共因故障的检测。⑦应确定模块的存储量、输入输出通道的吞吐能力及处理时间要求,从而确认留下足够的余量要求(例如,安全软件要求余量大于30%,内存建议大于40%)。⑧每个模块都应有足够详细的功能性或算法注释,注释率至少大于20%。

(2)功能设计方面。①软件设计要求没有本身的设计故障,例如死锁、访问非授权的资源、资源泄漏等。②如有软件组件或硬件自带代码,必须考虑其软件接口。特别是有些自带诊断功能的硬件,要增加报警功能。③根据设备的特性确定时间周期,如采样周期、数据计算处理周期、控制周期、自诊断周期、输入输出周期等。④确保执行安全防御功能在规定的时间内执行,且故障响应时间应小于最小安全时间。⑤采取适当的防御性编程,以防止数据结构的改变和破坏,特别是在数据出现坏值或超量程时。⑥安全功能可设为受控于两个独立的功能[7],避免误动作降低设备的可用性。⑦执行安全或其相关功能的模块应尽量放在一起,并同其他模块隔离,以便对其进行保护。⑧与硬件状态变化有关的设计应考虑状态监测的时间或次数。若无此要求,则可利用循环等待次数作为依据,超出之后作为超时处理,以防软件进入死循环。⑨能由软件自己完成的功能,应尽量避免人工干预。

安全设计前后的算法流程如图4所示。

图4 安全设计前后的算法流程图

(3)编程设计方面。

① 编写编码标准,使用安全语言子集编程。特别是对于高级语言程序,不可用非结构化控制流。

② 限制使用中断,以防产生同步问题或运行时间问题。特别是在被执行的关键部分(例如时间转折、数据改变),应禁用中断。当使用中断时,不可中断的部分应规定最大计算时间,以及允许禁止一次中断的时间。

③ 限制使用递归,以防不可验证或测试的子程序调用。如果必须使用,则应制定一个明显的、可预测递归深度的判据。

④ 在建立动态变量或动态对象过程中,需提供在线检查功能。在分配之前,借助硬件或软件检查被分配存储器是空闲的,从而保证在软件运行时动态变量和对象的内存分配不会影响现存的变量、数据或代码。

⑤ 任何数据都应规定其合理的范围,并有明确的边界值。需要特别注意特殊数据的处理,例如零除数、空白ASCII字符、空栈或者表元素、满矩阵等。

⑥ 应尽量采用简单的算术表达式代替复杂表达式,以便测试及修正。

⑦ 不使用逻辑“0”或“1”表示“安全”或“危险”状态,其判断条件不依赖于全“0”或全“1”[7]。

⑧ 使用简单的数据结构,不使用非结构化控制流。

5 结论

嵌入式软件的安全性设计主要是将软件中出现故障和错误的风险降至最小,从而确保遗留在软件中的风险不会导致不可接受的后果,使设备满足安全相关要求。但如何保证安全设计时所采取技术或措施的有效性和正确性,就要求对软件进行验证与确认[8]。只有经过验证与确认后的软件,才能保证系统/产品的安全性[9]。

猜你喜欢

嵌入式软件嵌入式软件
禅宗软件
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
嵌入式软件测试数据传输稳定性检测方式分析
TS系列红外传感器在嵌入式控制系统中的应用
软件对对碰
嵌入式PLC的设计与研究
全景相机遥控器嵌入式软件V1.0 相关操作分析
嵌入式单片机在电机控制系统中的应用探讨
即时通讯软件WhatsApp
基于Eclipse的航天嵌入式软件集成开发环境设计与实现