引言:第一篇对轨交信号系统从铁路系统分类和组成、城市轨交系统分类和组成、城市轨交系统功能、城市轨交系统发展方面做了介绍,第二篇从信号基础出发讲述了信号机、转辙机、轨道电路等设置原则和含义,第三篇从轨交系统的安全性设计的必要性、控制设计、需求分析以及实现等方面进行分析,第四篇重点从联锁系统的原理方面进行阐述。第五篇从轨交软件测试过程管理分析,第六篇从轨交软件的测试技术入手进行讲解,第七篇继续介绍轨交软件的测试技术,本文将从轨交软件安全性设计及实现讲解。
01轨交软件安全性设计原则
软件安全性设计基本原则:
• 功能分配
• 程序接口
• 故障检测、恢复和安全保护
• 继承或重用
• 性能和余量
• 可追踪性
• 可测试性
功能分配:确定模块、类等将实现安全关键需求;最小化安全关键部件的数量;文档化安全关键部件在设计层次结构中的位置和功能;每个安全关键部件的安全性需求追溯以及功能分配;安全性设计和实现的约束;执行控制、中断特定、初始化、同步和对部件的控制。
程序接口:定义所有部件之间的功能接口;标识软件内部的共享数据;文档化安全关键数据故障检测、恢复和安全保护;制定检测或恢复方案;异常响应的处理;设计危险操作场景;运行过程中的内存测试;内存的使用饱和度;安全关键数据的保护,防篡改和删除;容错机制等。
继承:考虑开发绩效和成熟技术,采用继承方式或重用方式,必要时采用现货软件。
性能和余量:定义部件在最大处理时的余量;采样频率对决策的影响;时间基准的控制(数据处理、信号处理、数据读取和存储等)。
可追踪性:标识需求的追踪性。
可测试性:设计时考虑如何测试和测试方式。
02轨交软件安全性设计
2.1 容错和容失效设计
1)在故障和失效的设计方面
• 必须工作的功能
• 必须不工作的功能
• 故障/失效检测、隔离和恢复
2)在冗余和容错设计方面
• 屏蔽
• 多数表决
• N版本设计
• 故障封锁区域
• 部件的自我保护和检测
• 为了防止故障在软件中传播,安全关键的部件应安全独立与非安全关键的部件,还应能够检测出自身的错误,又不能允许将错误传递,即接收和处理错误,不能传递错误。
2.2 软硬件接口设计
1)与硬件的接口设计
• 反馈回路
• 接口控制
• 判定语句
• 数据传输报文
• 外部功能
• 输入合理性检查
2)与软件的接口设计
• 参数个数的一致性
• 参数属性的一致性
• 参数单位的一致性
• 参数次序的一致性
• 传递参数的一致性
• 全局变量的使用
• 常数作为参数传递的处理等
反馈回路:软件设计过程中应确保不应因为硬件的反馈传感器出现失效而引起失控条件,在软件中应进行类似的设计。
接口控制:软件应检测接口状态,并在上电、电源波动、中断时的接口安全,确保不会因接口异常导致系统失效。
判定语句:不能依靠全1或全0的输入进行判定,尤其是外部传感器时。
数据传输报文:应为定义的格式数据,并须明确具体的长度和校验信息。
外部功能:安全关键信号来自外部时,须确保不从单个输入输出寄存器或缓存器接受全部必要信息,外部传感器的信息更应确保多个冗余。
输入合理性检查:对于模拟或数字信号,进行时间范围、失序、依从关系检查。
2.3 人机交互界面设计
• 显示界面
• 人机接口
• 安全状态恢复
• 安全关键操作启动
• 误操作防护
• 报警设计
1)显示界面:向操作员提供安全关键信息、图标及其他人机交互方式,并应显著的标识,考虑颜色、字体和位置、格式或页面;页面内的必要信息的一致性设计;简要。
2)人机接口:确保无效操作的标记;避免操作员在未知情况下的状态改变,应由警示或确认;状态变更应提示和确认;清晰区别关键输入,并检查输入的合法性;允许撤销和恢复;提供实时状态信息;处理过程应有进度提示。
3)安全状态恢复:便于单一动作处理当前事务,使系统退出潜在的不安全状态并恢复到某安全状态。该动作须多键控制。设计安全退出危险状态机制。
4)安全关键操作启动:确保安全关键启动由多人共同操作情况下实现,并设计误触发保护措施。如多按键的距离应确保不会发生误操作。
5)误操作防护:具备检测不正确的输入或操作,防止非正常使用安全关键功能,提供报警设计或提醒设计。
6)报警设计:例行报警和安全关键报警区别,安全关键报警不得取消。
2.4 通信设计
• 发送方须充分考虑接收方的处理能力
• 数据接受方须充分考虑发送方的各种情况
• 接口协议的帧格式协调统一
• 严格按照协议进行数据处理
• 交换字格式设计
• 双口RAM读写冲突设计
• 加密设计
1)发送方须充分考虑接收方的处理能力:考虑接受方对于数据的处理能力,如内存、处理时序、处理时间等。
2)数据接受方须充分考虑发送方的各种情况:能识别和处理重复的数据帧,相应的错误处理能力,单帧数据错误导致通信阻塞等。
3)接口协议的帧格式协调统一:确保数据帧的帧头、数据项(帧号、帧长、数据体)、校验字、帧尾;串行异步通信帧头须确保多字节、唯一性;帧间隔大于字节间隔。
4)严格按照协议进行数据处理:接收数据后应严格判定后方可处理。
5)交换字格式设计:状态标识不能用1或0标识,最少用两个或以上的位进行标识和确认,最好多路或多次判定。
6) 双口RAM读写冲突设计:设计握手要求,确保访问冲突。
7)加密设计:确保数据安全。
2.5 数据安全性设计
• 属性控制
• 数值运算范围控制
• 精度控制
• 合理性检查
• 特殊问题
1)属性控制:应规定合理范围(值域、变化率等),超出范围,出错处理,对参数、数组下标、循环变量进行范围检查。尤其数组下标计算所得。
2)数值运算范围控制:保证输入、输出、运算过程中数据的范围控制。
3)精度控制:确保运算的数据精度,合理选择数据类型。
4)合理性检查:软件的出口、入口及其他关键点上,对重要的物理量进行合理性检查,并确定处理措施。
5)特殊问题:在进行数学运算时,考虑浮点数趋近0时的处理方式,在可能发生下溢,使用适当的浮点数代替0,在关系判断时,不应对浮点数进行相等判定。
2.6 中断设计
• 使用的原则
• 初始化
• 慎用嵌套
• 避免中断中使用非中断返回
• 中断现场的保护和恢复
• 屏蔽不用的中断源
• 系统功能寄存器设置前关中断
• 考虑中断的优先级
• 考虑中断的处理时序
1)使用的原则:能用查询方式别用中断方式;中断服务程序精简;屏蔽无用中断,并设置入口并返回;设置边缘触发时防止毛刺,电平触发确保电平宽度;(针对具体CPU中断机制)同一中断的多次相应须明确处理措施;禁止使用中断嵌套。
2)初始化:严格按照“阻止-关中断-初始化-开中断-使能”的顺序操作;初始化须将所需要的全部资源进行初始化设置,如触发方式或所需要使用的变量等;仔细分析和设置中断的时机。
3)慎用嵌套:尽量不嵌套使用中断,最好关掉不希望嵌套的所有中断,考虑优先级,使能和阻止中断的语句位置要进行仔细分析。
4)避免中断中使用非中断返回:确保使用正常中断返回语句。
2.7 模块设计
• 模块设计单入单出
• 模块的独立性
• 控制扇入扇出
• 耦合方式
• 内聚方式
1)模块设计单入单出:除中断外,模块设计为单入单出。
2)模块的独立性:采用模块调用,不采用直接访问模块内部数据的形式;适当限制模块间传递参数的个数;模块内参数局部化;应变更的因素或经常修改的集中管理设计。
3)控制扇入扇出:模块在逻辑上分层次结构,扇出数控制在7以下,为了避免代码的重复,可适当增加扇入;高层次模块设计较高的扇出,低层次模块设计较高的扇入。
4)耦合方式:数据耦合;控制耦合;外部耦合;公共数据耦合;内容耦合。
5)内聚方式:功能内聚;顺序内聚;时间内聚;逻辑内聚;偶然内聚。
2.8 防错设计
• 参数化
• 标志
• 安全关键信息
• 安全关键功能
• 非授权存取的限制
• 无意指令的跳转处理
• 程序检测点的设置
• 寻址模式的选用
• 数据区的隔离
• 信息的存储
• 算法的选择
1)参数化:统一的符号标识参数、常量和标志。
2)标志:唯一、单一目的,包括名称和位定义,功能和作用,使用范围(有效),生存周期(初始状态、运行中的变化条件、状态和时刻、最终状态),使用情况(该标志的模块名和使用方式)。
3)安全关键信息:至少4位标识,不能全0或全1;不用寄存器和IO端口存储安全关键信息等。
4)安全关键功能:应得到多个相同信息后方可执行。
5)非授权存取的限制:防止对程序的自修改,防止对数据的非授权更改,安全关键功能设置密码等。
6)无意指令的跳转处理。
7)程序检测点的设置。
8)寻址模式的选用:慎用间接寻址方式。
9)数据区的隔离。
10)信息的存储:可选择多处存储,选择表决,确保信息的正确。
11)算法的选择:采用可控的算法,算法使用的空间、内存的可控。
03轨交软件安全性实现
3.1 编程语言的使用
• 采用标准的程序设计语言进行编码。
• 同一系统,减少编程语言的种类。
• 使用正版软件。
• 为提高可移植性和保证程序的正确性,建议只用语言编译程序中符合标准的部分进行编程,避免使用编译程序引入的非标准部分。
• 不使用无条件跳转指令。
• 并行结构的程序,选择便于测试且简单的结构来实现。
• 禁止使用未初始化的变量。
• 内存使用的管理须规范,尤其动态内存的使用。
3.2 复杂度控制
• 圈复杂度一般不大于20。
• 高级语言实现的模块行数不得大于200行。
• 模块传递的参数一般不超过6个。
• 每模块的扇入扇出一般不大于7。
3.3 注释要求和方法
• 为提高程序的可读性,注释应足够详细,且应为功能性的注释,一般不得少于有效代码行的20%。
• 模块头部注释一般应用一段文字注释进行说明。
• 模块名,功能,输入输出,参数,调用,限制,异常结束,方法,外部环境及资源等。
• 模块内注释。
• 分支转移语句、输入输出语句、循环语句、调用语句等。
3.4 指针的使用
• 禁止将参数指针赋值给过程指针
• 禁止指针的指针超过两级
• 禁止引用空指针和无效指针
• 谨慎使用指针的逻辑比较
• 谨慎对指针进行代数运算
• 谨慎将过程声明为指针类型
3.5 多余物处理
• 文档中未包含内容的处理
• 多余代码
• 未使用的内存处理
• 不可达代码的处理
3.6 程序检测点的设置
• 共用数据和共用变量
• 文件的处理要求
• 禁止程序修补
程序检测点的设置:在安全关键软件中的关键点上进行监控,在发现故障时进行故障隔离,必要时,使系统进入安全状态;在完成必要的检测功能的前提下,检测点尽量少。
共用数据和共用变量:应指明由两个或多个模块公用的数据和公用变量,并尽量减少对公用变量的使用和改变,减少模块间的依赖度和读写冲突。
文件的处理要求:文件唯一且用于单一目的,在使用前成功打开,使用后成功关闭,属性应与它的使用一致。
04总 结
轨交软件安全等级定级siL0~siL4,核心软件等级要求为siL4。对于软件的安全性设计尤为重要。从安全性设计到安全性设计的实现,重点要从容错和容失效、数据安全性、软硬件接口、通信安全、人机交互界面安全性等方面考虑。针对于软件相关测试或开发的工具也有安全等级的要求,本文不再赘述,后续文章中做介绍。
作者 | 刘艳青 上海控安安全测评部测试经理
版块 |鉴源论坛 · 观通
社群 |添加微信号“TICPShanghai”加入“上海控安51fusa安全社区”
参考文献:
[1] GJB102A-2012军用软件安全性设计指南
https://wenku.so.com/d/10ab35c713ed036d8c62ad26aac63af8?src=www_rec
[2] GBT 37691-2019 可编程逻辑器件软件安全性设计指南
https://wenku.so.com/d/bd18bdc0f2c5fe2486bf132311d6bc73
[3] 城市轨道交通信号系统运行风险及对策
https://wenku.so.com/d/ff06751d586c6b814754e161bc342d24