在安全系统的软件开发中,软件工程师除了具备软件开发的基本能力,还需要对安全软件的设计要求有深入的理解。如何能使开发的软件能够安全的运行,大部分安全要求与软件应用需求、功能场景有关,也有一些软件的通用性安全要求,下面是安全系统软件开发时需要遵循的通用设计要求:
序号 |
软件设计要求 |
1 |
软件启动时,包括正常的上电启动和意外的重启,需要初始化到一个已知的安全状态,如一些变量值,赋值到外部指令的输出值,确定启动时必须运行的功能和不能运行的功能; |
2 |
软件设计时,涉及到不同状态的相互转换,应确保每个状态的跳转条件都是预先定义的,有清晰的文档用于开发人员和测试人员理解; |
3 |
软件执行的功能终止时,应执行到一个已知的安全状态; |
4 |
当人机接口涉及到对安全命令的操作或安全参数的写入,至少需要操作者两次独立的动作,并对操作成功或失败有明确的提示,以防止操作者无意或有意的错误操作; |
5 |
软件能够设计为检测到非预期的内存修改,并在读取内存数据非预期时转向已知的安全状态,对安全数据可以存储在不同的物理空间,读取时进行对比,或者增加安全数据的校验码; |
6 |
执行安全命令时应检查前提条件是否满足,如果按照顺序对执行命令的前置条件进行检查,当前置条件未满足预设的顺序时,应拒绝执行命令; |
7 |
软件根据外部的输入执行命令,至少有两个外部输入源,两个输入源为异构或独立的信息源,不存在共因失效; |
8 |
软件对于系统的输入或输出应进行完整性检查,经过完整性检查确定为无效的输入或输出应拒绝执行; |
9 |
软件执行安全命令要考虑到最差响应时间,如软件任务执行优先级,或安全任务被任务中断的可能; |
10 |
软件设计通过时间分区和空间分区的方法,将安全软件组件和非安全软件组件进行逻辑隔离; |
11 |
对软件加载的参数进行完整性和合法性的检查; |
12 |
对软件任务的执行顺序应能进行检测,依靠软件本身达不到安全完整性时需要增加独立的外部监控; |
13 |
软件设计需要考虑硬件资源的限制如CPU占用率、内存占用率、通信总线的带宽; |
14 |
安全数据的定义避免用简单的数据位表示,单一位的翻转不能造成安全数据的非预期改变; |
15 |
软件能够正确处理信息流中缺失或虚假的数据; |
16 |
软件能够使用不同功能的控制路径来执行安全功能,避免单一失效造成安全功能丧失。 |
众所周知,软件的错误将会造成系统性失效,即使是多重冗余的系统,也会由于软件的共模失效出现不同冗余系统的同时故障,使系统的可靠性大大下降。
在2015年,美国航空安全局FAA发布波音787 Dreamliner在实验室测试出的一个软件缺陷,飞机的发电机系统每经过大约248天就会进入一种故障安全模式,导致供电系统完全关闭,如果此时飞机正在飞行、起飞或着陆期间,由于冗余的四个发电机控制系统将同时发生故障,将会造成灾难性的后果。FAA给出的临时解决方案是定期重启供电系统,作为日常维护的一项工作。——完整的信息可以查看阅读原文。
248天有什么特别之处呢,248天=248*24*3600=21427200秒,与2的31次方2147483648非常接近,可能的推断是在发动机控制系统的软件中存在一个有符号的32位时间计数器,该计数器每10ms递增一次,在连续运行的第248天,该计数器溢出,导致系统进入了故障检测并导向安全状态。
FAA官方没有发布该缺陷详细信息,以上是对这个问题原因一个可能的推断,但可以确定的是,软件缺陷是由于涉及时间相关的参数不正确引起的,对于软件使用的数据和参数应该做完整性和合法性的检查,确保不因数据的异常进入非预期的软件处理逻辑中。假设发动机控制系统的软件如果没有为数据异常设计合理的处理逻辑,造成的后果就会不可预测,更加严重。
以上仅为安全系统设计中一些常见的安全要求,除此以外,还要遵循安全编码的常用编码规范,网络安全的设计要求,以及基于系统需求和应用场景的特定安全要求。
原文始发于微信公众号(薄说安全):功能安全之通用软件安全要求
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论