论文部分内容阅读
摘要:介绍了嵌入式软件在中断使用中存在的中断冲突,通过典型案例分析了冲突产生的机制和类型及对软件造成的影响与危害,针对其中的软件安全漏洞提出了检测和分析方法。针对软件中断冲突提出了三种解决方案,并分析了三种方案的优缺点,为软件设计人员提高软件安全性可靠性提供设计参考。
关键词:嵌入式软件;中断冲突;软件安全漏洞
引言
随着嵌入式软件越来越多的应用在工控领域,其承载着越来越多的数据采集和处理、数据通信、自动控制与管理、系统安全保障等重要任务,同时也满足同步处理、实时处理、突发事件处理等性能要求。嵌入式软件的复杂性要求中断技术成为软件设计中必不可少的组成部分。中断技术的使用很容易引入中断资源的使用冲突,这些冲突存在着随机性、隐蔽性和不可预知性,一旦发生将会造成程序错误,甚至导致严重软件故障,尤其对航空航天等对可靠性安全性要求极高的领域,如何发现和消除中断冲突带来的安全隐患已经成为一个严峻的课题。
一、什么是中断冲突
冲突体现在代码针对某个或某些共享资源发生了访问竞争而造成程序错误。如果某个资源在被读取的过程中被打断,进行了写操作,或在被写的过程中被打断,进行了读取或重写操作,则可能存在访问冲突。“被打断”包括主程序中的资源被某个中断服务子程序打断、一个中断服务子程序的资源被某个高级中断服务子程序打断等情况。
二、如何识别和判断中断冲突是重要前提。
(一)首先通过一个简单的例子来了解一下什么是中断冲突:
某嵌入式软件中包含遥控和遥测两个任务,由两个中断服务程序来实现,遥测任务优先级高于遥控任务,即遥控任务可以被遥测任务抢占,两个任务中均进行模式设置,模式设置由一对组合变量TM_Mode和NewModeSet实现,遥控任务中代码如下:
TM_Mode = TM_Mode| 0xC0; (1)
TM_Mode = TM_Mode& 0x03; (2)
NewModeSet = (NewModeSet& 0x38) | 0xC0; (3)
在遥测中断中会启动遥测任务,由于遥测任务优先级高,若遥控任务被遥测任务打断,遥测任务也对TM_Mode和NewModeSet进行设置,遥测任务中代码如下:
If(TM_Mode>= 0xC0)
{
TM_Mode = (TM_Mode& 0x03) >> 4;
NewModeSet = NewModeSet& 0x3F;
}
如果在遥控任务的第(1)句和第(2)句之间被遥测任务打断,则会改写TM_Mode和NewModeSet的值,遥测任务执行完成后返回遥控任务继续处理时则造成TM_Mode和NewModeSet不匹配的错误。
(二)再通过一个例子进一步分析中断冲突:
软件中设置54字节控制信息数据,控制信息数据存放在buf[0]~buf[53],其中buf[48]为压力传感器温度数据,buf[49]为压力传感器压力数据,buf[53]为前53字节的校验和。在主函数中采集buf[48]和buf[49],在外部中断4(采样中断高优先级)中依次采集buf[0]~buf[47]和buf[50]~buf[52],读取主循环中采集的buf[48]和buf[49],并计算校验和写入buf[53]。在外部中断6中(取数中断,低优先级)发送54,字节控制信息数据。与问题相关的流程图如下:
从流程图中分析,产生数据访问冲突的场景有三个:
场景一:外部中断4完成累加和计算退出中断到进入外部中断6发送数据前的时间段内,若主循环恰好运行到对buf[48]和buf[49]进行写操作语句,在外部中断6发送之前buf[48]和buf[49]被改写,而未重新计算校验和buf[53],导致外部中断6发送的控制信息数据校验和错误。
场景二:主程序写buf[48]和buf[49]之间产生外部中 v 断4,读取了buf[48]和buf[49],并对校验和进行了计算,退出外部中断4返回主程序后,又对buf[49]进行写操作,在外部中断6发送之前buf[49]被改写,而未重新计算校验和buf[53],导致外部中断6发送的控制信息数据校验和错误。
场景三:外部中断4的优先级高于外部中断6,若在外部中断6发送buf[0]~buf[53]的过程中产生外部中断4,在中断4中对buf[0]~buf[47]、buf[50]~buf[52]以及校验和进行了写操作,待退出外部中断4返回外部中断6执行时,由于一部分数据已经被发送,后一部分数据以及校验和在外部中断4中被刷新,仍会导致发送出去的控制信息校验和错误。
我们可以通过静态分析法检查中断资源冲突,针对所有中断服务子程序中访问资源,逐一分析其在主程序(含其调用的子模块)、各个中断服务子程序中的访问情况,以确定资源访问过程中是否存在冲突:
表1 中断属性表
表2 中断程序使用资源引用关系总结表
此方法不仅能有效检测多字节的变量、缓冲区、数组的数据访问冲突,同时也能够检测寄存器访问冲突,比如主程序给某个寄存器赋值后,被中断打断使用该寄存器进行其他赋值,则在中断返回后主程序使用该寄存器数值时,导致数据被意外改写。目前北京轩宇信息技术有限公司开发的检测工具SpacChecker能够有效检测此类冲突资源。
三、中断冲突的分类
中断冲突包含主程序与中断服务程序的资源冲突,低优先级中断服务程序与高优先级中断服务程序的资源冲突。可导致的故障可分为中断向量初始化故障,中断现场保护和现场恢复问题,多级中断与主程序相互干扰问题,中断嵌套问题,与时序相关的中断冲突问题。 四、冲突检测的意义
嵌入式软件研制中,广泛采用中断服务机制来实现任务需求,但中断系统的设计和实现过程很容易引入软件错误。导致软件在运行过程中不定时发生莫名的错误或遥测数据错误等不可预知的错误,影响软件的正常运行。
由于中断触发的随机性和不确定性,造成软件测试过程中很难发现和定位该类问题。一旦软件带着这些安全漏洞层层闯关并最终烙焊、生产,将会给使用者带来安全隐患,严重的甚至会造成不可估量的损失。
五、解决方法研究
(一)关中断法:读/写过程关中断是常见的数据访问冲突预防措施,在可能产生中断的位置关闭相关中断,以保证数据不被打断,尤其是多字节数据和原子操作语句,采用该措施是非常有效的。另外要注意的是在初始化完成前是不能够打开中断的,因为如果提前打开了中断,在初始化工作还未完成前有中断信号产生,程序允许中断触发,此时中断向量入口还未初始化,则程序将跑飞。关中断措施在具体实施时,需要特别注意如下两个方面:一是确认当前关中断不能意外被打开,如果此时关闭了某一个中断,但在另一个未被关的中断服务子程序中打开了该关闭中断,则造成当前关中断操作失效。二是需要结合软件需求确认当前关中断时间是否影响软件性能要求,如果关中断时间太长影响软件对中断的响应时间,则造成其他功能失效。
(二)兵乓存储法:是一种应用于数据流控制的常见处理技巧,输入数据流通过输入选择单元将数据流分配到两个数据缓冲区,一个模块对一个数据缓冲区进行读操作过程中,另一个模块对另一个数据缓冲区进行写操作,交替使用,循环进行,避免了数据冲突,提高处理速度。乒乓存储法占用的内存区相对较多,如果软件内存较小,或者内存使用率较高时,可酌情考虑。
(三)设置中断发生标记法:在读数据之前设置该标记为无效,在中断服务子程序中写该数据后置标记为有效,读写完成后判断该标记是否有效,如果有效则表明该数据已被中断改写过,需要重新读取,以保证当前数据是最新的同步数据,而不会出现跳变。此方法可常用于多字节资源访问的处理,而且常用于资源读取操作。
另外,中断冲突是设计引入的,设计时需要对资源、时序进行分析,采用针对性的规避措施。有些时候不好的编码形式也会引入中断冲突相关的错误,因此改善编码形式也是一种有效措施。
六、结束语
针对当前嵌入式软件中常见的中断冲突,本文基于静态分析技术进行了分类分析,并针对软件安全漏洞给出了不同解决方案,可有效地解决中断冲突问题,提高软件的可靠性安全性,可在较广的应用范围内推广。如果冲突资源量较大的情况下,冲突分析的工作量将会相对增加,如何快速高效准确地分析冲突则需要进一步优化。此外,解决方案也存在各自的利弊,软件设计人员需根据软件实际需求进行选择。希望本文能为软件设计人员提供参考。
参考文献:
[1]杨芳.嵌入式软件中断系统资源检测技术.计算机工程与设计,2010 年
[2]吴萍,陈意云,张健.多线程程序中断冲突的静态检测[J].计算机研究与发展,2006,43(2):329-335.
[3]董丽.航天型号并发软件测试技术研究 [D].北京: 中国航天第
二研究院硕士学位论文, 2005.
[4]Dennis Brylow, Jens Palsberg. Deadline analysis of interrupt-driven software[J].IEEE Transactions on software engineering,2004,30(10):634-655.
[5]周新蕾,缪峥红.安全关键软件的可靠性测试.载人航天 2005,06(6)
关键词:嵌入式软件;中断冲突;软件安全漏洞
引言
随着嵌入式软件越来越多的应用在工控领域,其承载着越来越多的数据采集和处理、数据通信、自动控制与管理、系统安全保障等重要任务,同时也满足同步处理、实时处理、突发事件处理等性能要求。嵌入式软件的复杂性要求中断技术成为软件设计中必不可少的组成部分。中断技术的使用很容易引入中断资源的使用冲突,这些冲突存在着随机性、隐蔽性和不可预知性,一旦发生将会造成程序错误,甚至导致严重软件故障,尤其对航空航天等对可靠性安全性要求极高的领域,如何发现和消除中断冲突带来的安全隐患已经成为一个严峻的课题。
一、什么是中断冲突
冲突体现在代码针对某个或某些共享资源发生了访问竞争而造成程序错误。如果某个资源在被读取的过程中被打断,进行了写操作,或在被写的过程中被打断,进行了读取或重写操作,则可能存在访问冲突。“被打断”包括主程序中的资源被某个中断服务子程序打断、一个中断服务子程序的资源被某个高级中断服务子程序打断等情况。
二、如何识别和判断中断冲突是重要前提。
(一)首先通过一个简单的例子来了解一下什么是中断冲突:
某嵌入式软件中包含遥控和遥测两个任务,由两个中断服务程序来实现,遥测任务优先级高于遥控任务,即遥控任务可以被遥测任务抢占,两个任务中均进行模式设置,模式设置由一对组合变量TM_Mode和NewModeSet实现,遥控任务中代码如下:
TM_Mode = TM_Mode| 0xC0; (1)
TM_Mode = TM_Mode& 0x03; (2)
NewModeSet = (NewModeSet& 0x38) | 0xC0; (3)
在遥测中断中会启动遥测任务,由于遥测任务优先级高,若遥控任务被遥测任务打断,遥测任务也对TM_Mode和NewModeSet进行设置,遥测任务中代码如下:
If(TM_Mode>= 0xC0)
{
TM_Mode = (TM_Mode& 0x03) >> 4;
NewModeSet = NewModeSet& 0x3F;
}
如果在遥控任务的第(1)句和第(2)句之间被遥测任务打断,则会改写TM_Mode和NewModeSet的值,遥测任务执行完成后返回遥控任务继续处理时则造成TM_Mode和NewModeSet不匹配的错误。
(二)再通过一个例子进一步分析中断冲突:
软件中设置54字节控制信息数据,控制信息数据存放在buf[0]~buf[53],其中buf[48]为压力传感器温度数据,buf[49]为压力传感器压力数据,buf[53]为前53字节的校验和。在主函数中采集buf[48]和buf[49],在外部中断4(采样中断高优先级)中依次采集buf[0]~buf[47]和buf[50]~buf[52],读取主循环中采集的buf[48]和buf[49],并计算校验和写入buf[53]。在外部中断6中(取数中断,低优先级)发送54,字节控制信息数据。与问题相关的流程图如下:
从流程图中分析,产生数据访问冲突的场景有三个:
场景一:外部中断4完成累加和计算退出中断到进入外部中断6发送数据前的时间段内,若主循环恰好运行到对buf[48]和buf[49]进行写操作语句,在外部中断6发送之前buf[48]和buf[49]被改写,而未重新计算校验和buf[53],导致外部中断6发送的控制信息数据校验和错误。
场景二:主程序写buf[48]和buf[49]之间产生外部中 v 断4,读取了buf[48]和buf[49],并对校验和进行了计算,退出外部中断4返回主程序后,又对buf[49]进行写操作,在外部中断6发送之前buf[49]被改写,而未重新计算校验和buf[53],导致外部中断6发送的控制信息数据校验和错误。
场景三:外部中断4的优先级高于外部中断6,若在外部中断6发送buf[0]~buf[53]的过程中产生外部中断4,在中断4中对buf[0]~buf[47]、buf[50]~buf[52]以及校验和进行了写操作,待退出外部中断4返回外部中断6执行时,由于一部分数据已经被发送,后一部分数据以及校验和在外部中断4中被刷新,仍会导致发送出去的控制信息校验和错误。
我们可以通过静态分析法检查中断资源冲突,针对所有中断服务子程序中访问资源,逐一分析其在主程序(含其调用的子模块)、各个中断服务子程序中的访问情况,以确定资源访问过程中是否存在冲突:
表1 中断属性表
表2 中断程序使用资源引用关系总结表
此方法不仅能有效检测多字节的变量、缓冲区、数组的数据访问冲突,同时也能够检测寄存器访问冲突,比如主程序给某个寄存器赋值后,被中断打断使用该寄存器进行其他赋值,则在中断返回后主程序使用该寄存器数值时,导致数据被意外改写。目前北京轩宇信息技术有限公司开发的检测工具SpacChecker能够有效检测此类冲突资源。
三、中断冲突的分类
中断冲突包含主程序与中断服务程序的资源冲突,低优先级中断服务程序与高优先级中断服务程序的资源冲突。可导致的故障可分为中断向量初始化故障,中断现场保护和现场恢复问题,多级中断与主程序相互干扰问题,中断嵌套问题,与时序相关的中断冲突问题。 四、冲突检测的意义
嵌入式软件研制中,广泛采用中断服务机制来实现任务需求,但中断系统的设计和实现过程很容易引入软件错误。导致软件在运行过程中不定时发生莫名的错误或遥测数据错误等不可预知的错误,影响软件的正常运行。
由于中断触发的随机性和不确定性,造成软件测试过程中很难发现和定位该类问题。一旦软件带着这些安全漏洞层层闯关并最终烙焊、生产,将会给使用者带来安全隐患,严重的甚至会造成不可估量的损失。
五、解决方法研究
(一)关中断法:读/写过程关中断是常见的数据访问冲突预防措施,在可能产生中断的位置关闭相关中断,以保证数据不被打断,尤其是多字节数据和原子操作语句,采用该措施是非常有效的。另外要注意的是在初始化完成前是不能够打开中断的,因为如果提前打开了中断,在初始化工作还未完成前有中断信号产生,程序允许中断触发,此时中断向量入口还未初始化,则程序将跑飞。关中断措施在具体实施时,需要特别注意如下两个方面:一是确认当前关中断不能意外被打开,如果此时关闭了某一个中断,但在另一个未被关的中断服务子程序中打开了该关闭中断,则造成当前关中断操作失效。二是需要结合软件需求确认当前关中断时间是否影响软件性能要求,如果关中断时间太长影响软件对中断的响应时间,则造成其他功能失效。
(二)兵乓存储法:是一种应用于数据流控制的常见处理技巧,输入数据流通过输入选择单元将数据流分配到两个数据缓冲区,一个模块对一个数据缓冲区进行读操作过程中,另一个模块对另一个数据缓冲区进行写操作,交替使用,循环进行,避免了数据冲突,提高处理速度。乒乓存储法占用的内存区相对较多,如果软件内存较小,或者内存使用率较高时,可酌情考虑。
(三)设置中断发生标记法:在读数据之前设置该标记为无效,在中断服务子程序中写该数据后置标记为有效,读写完成后判断该标记是否有效,如果有效则表明该数据已被中断改写过,需要重新读取,以保证当前数据是最新的同步数据,而不会出现跳变。此方法可常用于多字节资源访问的处理,而且常用于资源读取操作。
另外,中断冲突是设计引入的,设计时需要对资源、时序进行分析,采用针对性的规避措施。有些时候不好的编码形式也会引入中断冲突相关的错误,因此改善编码形式也是一种有效措施。
六、结束语
针对当前嵌入式软件中常见的中断冲突,本文基于静态分析技术进行了分类分析,并针对软件安全漏洞给出了不同解决方案,可有效地解决中断冲突问题,提高软件的可靠性安全性,可在较广的应用范围内推广。如果冲突资源量较大的情况下,冲突分析的工作量将会相对增加,如何快速高效准确地分析冲突则需要进一步优化。此外,解决方案也存在各自的利弊,软件设计人员需根据软件实际需求进行选择。希望本文能为软件设计人员提供参考。
参考文献:
[1]杨芳.嵌入式软件中断系统资源检测技术.计算机工程与设计,2010 年
[2]吴萍,陈意云,张健.多线程程序中断冲突的静态检测[J].计算机研究与发展,2006,43(2):329-335.
[3]董丽.航天型号并发软件测试技术研究 [D].北京: 中国航天第
二研究院硕士学位论文, 2005.
[4]Dennis Brylow, Jens Palsberg. Deadline analysis of interrupt-driven software[J].IEEE Transactions on software engineering,2004,30(10):634-655.
[5]周新蕾,缪峥红.安全关键软件的可靠性测试.载人航天 2005,06(6)