一种航天软件系统溢出检测和破坏限制机制的制作方法

文档序号:6538471阅读:159来源:国知局
一种航天软件系统溢出检测和破坏限制机制的制作方法
【专利摘要】本发明公开了一种航天软件系统溢出检测和破坏限制机制,其特征在于:步骤如下:将任务运行栈分割成平均的两部分,函数的调用分别交叉在两个栈中进行,实现缓冲区溢出检测和破坏限制;首先是溢出检测和破坏限制栈空间被分割为2部分,确保了至少1/2栈的有效性;其次是改变了函数返回时控制流转移的方向,使得控制流转移和溢出具有异向性。本发明使得缓冲区溢出检测和破坏限制成为可能,改变了函数返回时控制流转移的方向,使得控制流转移和溢出具有异向性。
【专利说明】一种航天软件系统溢出检测和破坏限制机制
【技术领域】
[0001]本发明属于嵌入式操作系统开发领域,具体地说,涉及一种航天软件系统溢出检测和破坏限制机制。
【背景技术】
[0002]缓冲区溢出是航天器软件系统的一个重要的安全威胁。首先,C语言仍然是航天软件的主要开发语言。尽管航天软件开发仅利用C语言的一个相对安全子集,但是C语言的安全威胁并没有得到彻底解决。其次,受能耗、抗辐照增强等多方面的影响,航天器计算机系统处理能力有限,没有提供传统的保护机制。例如,大多数航天器板载计算机都不提供内存管理单元(MMU)。所有的软件都在同一地址空间、同一权限级别下运行,这使得缓冲区溢出导致的后果更为严重。再次,航天软件系统需要与大量不可靠外部设备如传感器、激励器等交换数据;而这些不可靠、不可信的数据成为溢出数据的来源。最后,外太空的高能粒子或者宇宙射线引起的单粒子翻转、多粒子翻转、单粒子击穿等可以从软件系统内部触发溢出。
[0003]当前有多种预防和检测缓冲区溢出的方法,如基于金丝雀的Stackguard、返回地址随机化、地址空间随机化等,但是传统的缓冲区溢出检测和防御技术无法有效的抵御航天软件中的溢出威胁。主要原因如下:
[0004]这些防御技术基于恶意用户攻击假设,其目的是防御攻击者获取系统控制权,如地址空间随机化、输入检查、影子返回地址栈等。而航天软件系统的溢出防御主要目的是破坏限制,避免安全关键的软件被破坏。有效地对恶意攻击的防御并不意味着减少溢出自身的破坏。
[0005]航天软件系统缺乏硬件保护机制支持。而一些传统的保护机制依赖硬件能力,如SmashGuard修改硬件call和ret指令语义来检查栈溢出。
[0006]航天软件系统运行于计算能力受限的硬件平台之上,以单地址空间为组织方式,缺乏任务之间的破坏保护机制,溢出处理机制应当兼顾这方面的要求。

【发明内容】

[0007]本发明要解决的技术问题是克服上述缺陷,提供一种航天软件系统溢出检测和破坏限制机制,将任务运行栈分割成平均的两个部分,函数的调用分别交叉在两个栈中进行。这种方法使得缓冲区溢出检测和破坏限制成为可能。首先,栈空间被分割为2部分,确保了至少1/2栈的有效性。其次,改变了函数返回时控制流转移的方向,使得控制流转移和溢出具有异向性。
[0008]为解决上述问题,本发明所采用的技术方案是:
[0009]一种航天软件系统溢出检测和破坏限制机制,其特征在于:所述溢出检测和破坏限制机制是一种基于双栈纠缠执行的缓冲溢出检测和破坏隔离机制,步骤如下:将任务运行栈分割成平均的两部分,函数的调用分别交叉在两个栈中进行,实现缓冲区溢出检测和破坏限制;首先是溢出检测和破坏限制栈空间被分割为2部分,确保了至少1/2栈的有效性;其次是改变了函数返回时控制流转移的方向,使得控制流转移和溢出具有异向性。
[0010]作为一种改进,所述任务运行栈根据函数调用顺序和后进先出的原则压入栈帧;每个栈巾贞设置一个编号,以表不其相对栈底的位置;根据栈巾贞的编号,一个栈巾贞编号为k,那么它所直接调用的所有函数的栈帧为k+Ι ;双栈纠缠执行为:所有编号为奇数的栈帧被依次安排在一起,所有编号为偶数的栈帧被安排在一起,当一个函数调用子函数时,会完成如下操作:l)、call指令将返回值保存在父函数的栈帧中;2)、切换到子函数的栈帧;3)、复制函数参数到子函数栈帧;4)、分配局部变量空间;5)、继续子函数逻辑执行;6)、当子函数完成执行后,根据父函数栈帧中保存的返回地址返回父函数继续执行。
[0011]作为一种改进,所述步骤I)中,双栈纠缠执行的栈帧除了临时变量之外必须维持相应的控制结构;当发生函数调用和函数返回时,控制结构保证了栈帧之间的平滑切换;双栈执行也必须维持栈帧之间的顺序关系,当调用一个函数时,须保证在正确位置上创建新的栈帧;当从一个函数返回时,必须保证能回到调用函数的栈帧上继续执行;在任务运行栈中,只有栈顶的栈帧是活动,其它栈帧是非活动的。
[0012]作为一种改进,所述步骤2)中双栈纠缠执行的函数调用过程为:首先,父函数为子函数准备参数,按照一定的顺序将参数压入栈中,然后调用call指令,将call指令下一条指令作为返回值压入栈中,并且将eip设定为被调用函数的入口地址继续执行;接下来的控制由子函数的程序逻辑决定,直到函数准备返回。
[0013]作为一种改进,所述双栈纠缠执行的函数返回过程的一个基本原则就是将栈的基本形态调整为执行call指令之前的形式;第I条指令将ptop指向的caller栈巾贞的顶部设置给寄存器,由于子函数已经完成计算,它的局部变量和临时空间将被丢弃,直接将寄存器设置为caller栈帧顶部是合理的;第2条指令将父函数栈帧顶地址设置为caller父函数的栈帧顶部,由于caller的父函数的栈帧下紧邻子函数的栈帧位置,因此,子函数的帧底就是父函数栈帧顶地址的值;第3、4条指令将栈帧基设置为寄存器,利用栈操作恢复caller的栈巾贞基地址;第5条指令则将父函数栈巾贞的基地址设置为caller的父函数栈中贞基地址。至此,栈帧完全恢复到call指令执行之后的布局,上述过程完成了函数返回的准备工作;第6条指令ret返回。
[0014]作为一种改进,所述函数参数处理函数调用的参数由父函数准备,并且按照一定的规则压入自己的栈帧中;而子函数则处于自己的栈帧进行操作;在双栈纠缠执行中,由于父函数的栈帧和子函数的栈帧是分割开的,直接利用父函数栈帧顶地址同时引用函数参数和局部变量是不现实的;父函数的栈帧顶由父函数栈帧顶地址指定。
[0015]由于采用了上述技术方案,与现有技术相比,本发明是一种基于双栈纠缠执行的缓冲溢出检测和破坏隔离机制。该机制将任务运行栈分割成平均的两个部分,函数的调用分别交叉在两个栈中进行。这种方法使得缓冲区溢出检测和破坏限制成为可能。首先,栈空间被分割为2部分,确保了至少1/2栈的有效性。其次,改变了函数返回时控制流转移的方向,使得控制流转移和溢出具有异向性。
【具体实施方式】
[0016]实施例:
[0017]一种航天软件系统溢出检测和破坏限制机制,所述溢出检测和破坏限制机制是一种基于双栈纠缠执行的缓冲溢出检测和破坏隔离机制,步骤如下:将任务运行栈分割成平均的两部分,函数的调用分别交叉在两个栈中进行,实现缓冲区溢出检测和破坏限制;首先是溢出检测和破坏限制栈空间被分割为2部分,确保了至少1/2栈的有效性;其次是改变了函数返回时控制流转移的方向,使得控制流转移和溢出具有异向性。
[0018]在本实施例中,所述任务运行栈根据函数调用顺序和后进先出的原则压入栈帧;每个栈巾贞设置一个编号,以表不其相对栈底的位置;根据栈巾贞的编号,一个栈巾贞编号为k,那么它所直接调用的所有函数的栈帧为k+Ι ;双栈纠缠执行为:所有编号为奇数的栈帧被依次安排在一起,所有编号为偶数的栈帧被安排在一起,当一个函数调用子函数时,会完成如下操作:l)、call指令将返回值保存在父函数的栈帧中;2)、切换到子函数的栈帧;3)、复制函数参数到子函数栈帧;4)、分配局部变量空间;5)、继续子函数逻辑执行;6)、当子函数完成执行后,根据父函数栈帧中保存的返回地址返回父函数继续执行。
[0019]在上述步骤中,步骤I)中,双栈纠缠执行的栈帧除了临时变量之外必须维持相应的控制结构;当发生函数调用和函数返回时,控制结构保证了栈帧之间的平滑切换;双栈执行也必须维持栈帧之间的顺序关系,当调用一个函数时,须保证在正确位置上创建新的栈帧;当从一个函数返回时,必须保证能回到调用函数的栈帧上继续执行;在任务运行栈中,只有栈顶的栈帧是活动,其它栈帧是非活动的。
[0020]所述步骤2)中双栈纠缠执行的函数调用过程为:首先,父函数为子函数准备参数,按照一定的顺序将参数压入栈中,然后调用call指令,将call指令下一条指令作为返回值压入栈中,并且将eip设定为被调用函数的入口地址继续执行;接下来的控制由子函数的程序逻辑决定,直到函数准备返回。
[0021]作为一种改进,所述双栈纠缠执行的函数返回过程的一个基本原则就是将栈的基本形态调整为执行call指令之前的形式;第I条指令将ptop指向的caller栈巾贞的顶部设置给寄存器,由于子函数已经完成计算,它的局部变量和临时空间将被丢弃,直接将寄存器设置为caller栈帧顶部是合理的;第2条指令将父函数栈帧顶地址设置为caller父函数的栈帧顶部,由于caller的父函数的栈帧下紧邻子函数的栈帧位置,因此,子函数的帧底就是父函数栈帧顶地址的值;第3、4条指令将栈帧基设置为寄存器,利用栈操作恢复caller的栈巾贞基地址;第5条指令则将父函数栈巾贞的基地址设置为caller的父函数栈中贞基地址。至此,栈帧完全恢复到call指令执行之后的布局,上述过程完成了函数返回的准备工作;第6条指令ret返回。
[0022]步骤2)中所述函数参数处理函数调用的参数由父函数准备,并且按照一定的规则压入自己的栈帧中;而子函数则处于自己的栈帧进行操作;在双栈纠缠执行中,由于父函数的栈帧和子函数的栈帧是分割开的,直接利用父函数栈帧顶地址同时引用函数参数和局部变量是不现实的;父函数的栈帧顶由父函数栈帧顶地址指定。
[0023]根据上述描述,一旦检测出缓冲区溢出发生,必须对缓冲区溢出产生的破坏进行评估,确定其严重程度。然后,根据严重程度采取相应的破坏限制措施。
[0024]双栈纠缠执行为每个栈帧设置封装,保存了栈结构的冗余信息。并且非活跃的1/2栈的完整性得到保护,这是破坏评估的基础。利用所给出的关系遍历栈结构,可以计算得出溢出破坏的范围。
[0025]轻微破坏:如果缓冲区溢出仅导致少量栈帧被破坏,那么它的影响范围较少。可以采取重新执行函数的方式纠正破坏。遍历任务栈,找到最上一个被破坏的栈帧。重新执行对应函数,重构破坏的栈结构。如果i是最上层的坏帧,那么通过如下代码段;重新执行被破坏的函数,恢复原始状态或者利用新输入重新执行函数。第I和2条语句将栈切换到第1-Ι个栈帧。第3条语句通过返回地址获得栈帧i对应的函数地址,然后调用该函数。
[0026]严重破坏:如果溢出导致大量栈帧(1/4以上)破坏,破坏程度较大,需要重新启动任务。
[0027]系统破坏:如果缓冲区溢出超过了活动帧所在的1/2栈,那么它将破坏其他任务的数据,形成系统性破坏。这类破坏需要向操作系统报告。操作系统提供健康检查机制来处理系统性破坏。
[0028]以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种航天软件系统溢出检测和破坏限制机制,其特征在于:所述溢出检测和破坏限制机制是一种基于双栈纠缠执行的缓冲溢出检测和破坏隔离机制,步骤如下:将任务运行栈分割成平均的两部分,函数的调用分别交叉在两个栈中进行,实现缓冲区溢出检测和破坏限制; 首先是溢出检测和破坏限制栈空间被分割为2部分,确保了至少1/2栈的有效性;其次是改变了函数返回时控制流转移的方向,使得控制流转移和溢出具有异向性。
2.根据权利要求1中所述的航天软件系统溢出检测和破坏限制机制,其特征在于:所述任务运行栈根据函数调用顺序和后进先出的原则压入栈帧;每个栈帧设置一个编号,以表示其相对栈底的位置;根据栈帧的编号,一个栈帧编号为k,那么它所直接调用的所有函数的栈帧为k+Ι ;双栈纠缠执行为:所有编号为奇数的栈帧被依次安排在一起,所有编号为偶数的栈帧被安排在一起,当一个函数调用子函数时,会完成如下操作: 1)、call指令将返回值保存在父函数的栈帧中; 2)、切换到子函数的栈帧; 3)、复制函数参数到子函数栈帧; 4)、分配局部变量空间; 5)、继续子函数逻辑执行; 6)、当子函数完成执行后,根据父函数栈帧中保存的返回地址返回父函数继续执行。
3.根据权利要求2中所述的航天软件系统溢出检测和破坏限制机制,其特征在于:所述步骤I)中,双栈纠缠执行的`栈帧除了临时变量之外必须维持相应的控制结构;当发生函数调用和函数返回时,控制结构保证了栈帧之间的平滑切换; 双栈执行也必须维持栈帧之间的顺序关系,当调用一个函数时,须保证在正确位置上创建新的栈帧;当从一个函数返回时,必须保证能回到调用函数的栈帧上继续执行;在任务运行栈中,只有栈顶的栈帧是活动,其它栈帧是非活动的。
4.根据权利要求2中所述的航天软件系统溢出检测和破坏限制机制,其特征在于:所述步骤2)中双栈纠缠执行的函数调用过程为:首先,父函数为子函数准备参数,按照一定的顺序将参数压入栈中,然后调用call指令,将call指令下一条指令作为返回值压入栈中,并且将eip设定为被调用函数的入口地址继续执行;接下来的控制由子函数的程序逻辑决定,直到函数准备返回。
5.根据权利要求2中所述的航天软件系统溢出检测和破坏限制机制,其特征在于:所述双栈纠缠执行的函数返回过程的一个基本原则就是将栈的基本形态调整为执行call指令之前的形式; 第I条指令将Ptop指向的caller栈帧的顶部设置给寄存器,由于子函数已经完成计算,它的局部变量和临时空间将被丢弃,直接将寄存器设置为caller栈帧顶部是合理的;第2条指令将父函数栈帧顶地址设置为caller父函数的栈帧顶部,由于caller的父函数的栈帧下紧邻子函数的栈帧位置,因此,子函数的帧底就是父函数栈帧顶地址的值;第3、4条指令将栈帧基设置为寄存器,利用栈操作恢复caller的栈帧基地址;第5条指令则将父函数栈帧的基地址设置为caller的父函数栈帧基地址。至此,栈帧完全恢复到call指令执行之后的布局,上述过程完成了函数返回的准备工作;第6条指令ret返回。
6.根据权利要求5中所述的航天软件系统溢出检测和破坏限制机制,其特征在于:所述函数参数处理函数调用的参数由父函数准备,并且按照一定的规则压入自己的栈帧中;而子函数则处于自己的栈帧进行操作; 在双栈纠缠执行中,由于父函数的栈帧和子函数的栈帧是分割开的,直接利用父函数栈帧顶地址同时引用函数参数和局部变量是不现实的;父函数的栈帧顶由父函数栈帧顶地址指定。`
【文档编号】G06F11/36GK103853662SQ201410060565
【公开日】2014年6月11日 申请日期:2014年2月21日 优先权日:2014年2月21日
【发明者】李尚杰, 周启平, 卓保特, 程胜, 陈星宇 申请人:北京神舟航天软件技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1