《一种航天软件系统溢出检测和破坏限制机制.pdf》由会员分享,可在线阅读,更多相关《一种航天软件系统溢出检测和破坏限制机制.pdf(7页完整版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 103853662 A (43)申请公布日 2014.06.11 CN 103853662 A (21)申请号 201410060565.9 (22)申请日 2014.02.21 G06F 11/36(2006.01) (71)申请人 北京神舟航天软件技术有限公司 地址 100094 北京市海淀区永丰路 28 号 (72)发明人 李尚杰 周启平 卓保特 程胜 陈星宇 (74)专利代理机构 北京世誉鑫诚专利代理事务 所 ( 普通合伙 ) 11368 代理人 孙国栋 (54) 发明名称 一种航天软件系统溢出检测和破坏限制机制 (57) 摘要 本发明公开了一种航天软件系统溢。
2、出检测和 破坏限制机制, 其特征在于 : 步骤如下 : 将任务运 行栈分割成平均的两部分, 函数的调用分别交叉 在两个栈中进行, 实现缓冲区溢出检测和破坏限 制 ; 首先是溢出检测和破坏限制栈空间被分割为 2 部分, 确保了至少 1/2 栈的有效性 ; 其次是改变 了函数返回时控制流转移的方向, 使得控制流转 移和溢出具有异向性。本发明使得缓冲区溢出检 测和破坏限制成为可能, 改变了函数返回时控制 流转移的方向, 使得控制流转移和溢出具有异向 性。 (51)Int.Cl. 权利要求书 2 页 说明书 4 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书2页 说明书4页。
3、 (10)申请公布号 CN 103853662 A CN 103853662 A 1/2 页 2 1. 一种航天软件系统溢出检测和破坏限制机制, 其特征在于 : 所述溢出检测和破坏限 制机制是一种基于双栈纠缠执行的缓冲溢出检测和破坏隔离机制, 步骤如下 : 将任务运行 栈分割成平均的两部分, 函数的调用分别交叉在两个栈中进行, 实现缓冲区溢出检测和破 坏限制 ; 首先是溢出检测和破坏限制栈空间被分割为2部分, 确保了至少1/2栈的有效性 ; 其次 是改变了函数返回时控制流转移的方向, 使得控制流转移和溢出具有异向性。 2. 根据权利要求 1 中所述的航天软件系统溢出检测和破坏限制机制, 其特征。
4、在于 : 所 述任务运行栈根据函数调用顺序和后进先出的原则压入栈帧 ; 每个栈帧设置一个编号, 以 表示其相对栈底的位置 ; 根据栈帧的编号, 一个栈帧编号为 k, 那么它所直接调用的所有函 数的栈帧为 k+1 ; 双栈纠缠执行为 : 所有编号为奇数的栈帧被依次安排在一起, 所有编号为 偶数的栈帧被安排在一起, 当一个函数调用子函数时, 会完成如下操作 : 1) 、 call 指令将返回值保存在父函数的栈帧中 ; 2) 、 切换到子函数的栈帧 ; 3) 、 复制函数参数到子函数栈帧 ; 4) 、 分配局部变量空间 ; 5) 、 继续子函数逻辑执行 ; 6) 、 当子函数完成执行后, 根据父函数。
5、栈帧中保存的返回地址返回父函数继续执行。 3. 根据权利要求 2 中所述的航天软件系统溢出检测和破坏限制机制, 其特征在于 : 所 述步骤 1) 中, 双栈纠缠执行的栈帧除了临时变量之外必须维持相应的控制结构 ; 当发生函 数调用和函数返回时, 控制结构保证了栈帧之间的平滑切换 ; 双栈执行也必须维持栈帧之间的顺序关系, 当调用一个函数时, 须保证在正确位置上 创建新的栈帧 ; 当从一个函数返回时, 必须保证能回到调用函数的栈帧上继续执行 ; 在任 务运行栈中, 只有栈顶的栈帧是活动, 其它栈帧是非活动的。 4. 根据权利要求 2 中所述的航天软件系统溢出检测和破坏限制机制, 其特征在于 : 。
6、所 述步骤 2) 中双栈纠缠执行的函数调用过程为 : 首先, 父函数为子函数准备参数, 按照一定 的顺序将参数压入栈中, 然后调用 call 指令, 将 call 指令下一条指令作为返回值压入栈 中, 并且将 eip 设定为被调用函数的入口地址继续执行 ; 接下来的控制由子函数的程序逻 辑决定, 直到函数准备返回。 5. 根据权利要求 2 中所述的航天软件系统溢出检测和破坏限制机制, 其特征在于 : 所 述双栈纠缠执行的函数返回过程的一个基本原则就是将栈的基本形态调整为执行 call 指 令之前的形式 ; 第 1 条指令将 ptop 指向的 caller 栈帧的顶部设置给寄存器, 由于子函数已。
7、经完成计 算, 它的局部变量和临时空间将被丢弃, 直接将寄存器设置为 caller 栈帧顶部是合理的 ; 第 2 条指令将父函数栈帧顶地址设置为 caller 父函数的栈帧顶部, 由于 caller 的父函数 的栈帧下紧邻子函数的栈帧位置, 因此, 子函数的帧底就是父函数栈帧顶地址的值 ; 第 3、 4 条指令将栈帧基设置为寄存器, 利用栈操作恢复 caller 的栈帧基地址 ; 第 5 条指令则将父 函数栈帧的基地址设置为 caller 的父函数栈帧基地址。至此, 栈帧完全恢复到 call 指令 执行之后的布局, 上述过程完成了函数返回的准备工作 ; 第 6 条指令 ret 返回。 6. 根。
8、据权利要求 5 中所述的航天软件系统溢出检测和破坏限制机制, 其特征在于 : 所 权 利 要 求 书 CN 103853662 A 2 2/2 页 3 述函数参数处理函数调用的参数由父函数准备, 并且按照一定的规则压入自己的栈帧中 ; 而子函数则处于自己的栈帧进行操作 ; 在双栈纠缠执行中, 由于父函数的栈帧和子函数的栈帧是分割开的, 直接利用父函数 栈帧顶地址同时引用函数参数和局部变量是不现实的 ; 父函数的栈帧顶由父函数栈帧顶地 址指定。 权 利 要 求 书 CN 103853662 A 3 1/4 页 4 一种航天软件系统溢出检测和破坏限制机制 技术领域 0001 本发明属于嵌入式操作系。
9、统开发领域, 具体地说, 涉及一种航天软件系统溢出检 测和破坏限制机制。 背景技术 0002 缓冲区溢出是航天器软件系统的一个重要的安全威胁。 首先, C语言仍然是航天软 件的主要开发语言。 尽管航天软件开发仅利用C语言的一个相对安全子集, 但是C语言的安 全威胁并没有得到彻底解决。其次, 受能耗、 抗辐照增强等多方面的影响, 航天器计算机系 统处理能力有限, 没有提供传统的保护机制。 例如, 大多数航天器板载计算机都不提供内存 管理单元 (MMU)。所有的软件都在同一地址空间、 同一权限级别下运行, 这使得缓冲区溢出 导致的后果更为严重。 再次, 航天软件系统需要与大量不可靠外部设备如传感器。
10、、 激励器等 交换数据 ; 而这些不可靠、 不可信的数据成为溢出数据的来源。最后, 外太空的高能粒子或 者宇宙射线引起的单粒子翻转、 多粒子翻转、 单粒子击穿等可以从软件系统内部触发溢出。 0003 当前有多种预防和检测缓冲区溢出的方法, 如基于金丝雀的 Stackguard、 返回地 址随机化、 地址空间随机化等, 但是传统的缓冲区溢出检测和防御技术无法有效的抵御航 天软件中的溢出威胁。主要原因如下 : 0004 这些防御技术基于恶意用户攻击假设, 其目的是防御攻击者获取系统控制权, 如 地址空间随机化、 输入检查、 影子返回地址栈等。 而航天软件系统的溢出防御主要目的是破 坏限制, 避免安。
11、全关键的软件被破坏。有效地对恶意攻击的防御并不意味着减少溢出自身 的破坏。 0005 航天软件系统缺乏硬件保护机制支持。而一些传统的保护机制依赖硬件能力, 如 SmashGuard 修改硬件 call 和 ret 指令语义来检查栈溢出。 0006 航天软件系统运行于计算能力受限的硬件平台之上, 以单地址空间为组织方式, 缺乏任务之间的破坏保护机制, 溢出处理机制应当兼顾这方面的要求。 发明内容 0007 本发明要解决的技术问题是克服上述缺陷, 提供一种航天软件系统溢出检测和破 坏限制机制, 将任务运行栈分割成平均的两个部分, 函数的调用分别交叉在两个栈中进行。 这种方法使得缓冲区溢出检测和破坏。
12、限制成为可能。首先, 栈空间被分割为 2 部分, 确保了 至少 1/2 栈的有效性。其次, 改变了函数返回时控制流转移的方向, 使得控制流转移和溢出 具有异向性。 0008 为解决上述问题, 本发明所采用的技术方案是 : 0009 一种航天软件系统溢出检测和破坏限制机制, 其特征在于 : 所述溢出检测和破坏 限制机制是一种基于双栈纠缠执行的缓冲溢出检测和破坏隔离机制, 步骤如下 : 将任务运 行栈分割成平均的两部分, 函数的调用分别交叉在两个栈中进行, 实现缓冲区溢出检测和 破坏限制 ; 首先是溢出检测和破坏限制栈空间被分割为 2 部分, 确保了至少 1/2 栈的有效 说 明 书 CN 103。
13、853662 A 4 2/4 页 5 性 ; 其次是改变了函数返回时控制流转移的方向, 使得控制流转移和溢出具有异向性。 0010 作为一种改进, 所述任务运行栈根据函数调用顺序和后进先出的原则压入栈帧 ; 每个栈帧设置一个编号, 以表示其相对栈底的位置 ; 根据栈帧的编号, 一个栈帧编号为 k, 那么它所直接调用的所有函数的栈帧为 k+1 ; 双栈纠缠执行为 : 所有编号为奇数的栈帧被 依次安排在一起, 所有编号为偶数的栈帧被安排在一起, 当一个函数调用子函数时, 会完成 如下操作 : 1) 、 call 指令将返回值保存在父函数的栈帧中 ; 2) 、 切换到子函数的栈帧 ; 3) 、 复 。
14、制函数参数到子函数栈帧 ; 4) 、 分配局部变量空间 ; 5) 、 继续子函数逻辑执行 ; 6) 、 当子函数 完成执行后, 根据父函数栈帧中保存的返回地址返回父函数继续执行。 0011 作为一种改进, 所述步骤 1) 中, 双栈纠缠执行的栈帧除了临时变量之外必须维持 相应的控制结构 ; 当发生函数调用和函数返回时, 控制结构保证了栈帧之间的平滑切换 ; 双栈执行也必须维持栈帧之间的顺序关系, 当调用一个函数时, 须保证在正确位置上创建 新的栈帧 ; 当从一个函数返回时, 必须保证能回到调用函数的栈帧上继续执行 ; 在任务运 行栈中, 只有栈顶的栈帧是活动, 其它栈帧是非活动的。 0012 。
15、作为一种改进, 所述步骤 2) 中双栈纠缠执行的函数调用过程为 : 首先, 父函数为 子函数准备参数, 按照一定的顺序将参数压入栈中, 然后调用 call 指令, 将 call 指令下一 条指令作为返回值压入栈中, 并且将 eip 设定为被调用函数的入口地址继续执行 ; 接下来 的控制由子函数的程序逻辑决定, 直到函数准备返回。 0013 作为一种改进, 所述双栈纠缠执行的函数返回过程的一个基本原则就是将栈的基 本形态调整为执行 call 指令之前的形式 ; 第 1 条指令将 ptop 指向的 caller 栈帧的顶部 设置给寄存器, 由于子函数已经完成计算, 它的局部变量和临时空间将被丢弃,。
16、 直接将寄存 器设置为 caller 栈帧顶部是合理的 ; 第 2 条指令将父函数栈帧顶地址设置为 caller 父 函数的栈帧顶部, 由于 caller 的父函数的栈帧下紧邻子函数的栈帧位置, 因此, 子函数的 帧底就是父函数栈帧顶地址的值 ; 第 3、 4 条指令将栈帧基设置为寄存器, 利用栈操作恢复 caller 的栈帧基地址 ; 第 5 条指令则将父函数栈帧的基地址设置为 caller 的父函数栈帧 基地址。至此, 栈帧完全恢复到 call 指令执行之后的布局, 上述过程完成了函数返回的准 备工作 ; 第 6 条指令 ret 返回。 0014 作为一种改进, 所述函数参数处理函数调用的。
17、参数由父函数准备, 并且按照一定 的规则压入自己的栈帧中 ; 而子函数则处于自己的栈帧进行操作 ; 在双栈纠缠执行中, 由 于父函数的栈帧和子函数的栈帧是分割开的, 直接利用父函数栈帧顶地址同时引用函数参 数和局部变量是不现实的 ; 父函数的栈帧顶由父函数栈帧顶地址指定。 0015 由于采用了上述技术方案, 与现有技术相比, 本发明是一种基于双栈纠缠执行的 缓冲溢出检测和破坏隔离机制。该机制将任务运行栈分割成平均的两个部分, 函数的调用 分别交叉在两个栈中进行。这种方法使得缓冲区溢出检测和破坏限制成为可能。首先, 栈 空间被分割为 2 部分, 确保了至少 1/2 栈的有效性。其次, 改变了函数。
18、返回时控制流转移的 方向, 使得控制流转移和溢出具有异向性。 具体实施方式 0016 实施例 : 0017 一种航天软件系统溢出检测和破坏限制机制, 所述溢出检测和破坏限制机制是一 说 明 书 CN 103853662 A 5 3/4 页 6 种基于双栈纠缠执行的缓冲溢出检测和破坏隔离机制, 步骤如下 : 将任务运行栈分割成平 均的两部分, 函数的调用分别交叉在两个栈中进行, 实现缓冲区溢出检测和破坏限制 ; 首先 是溢出检测和破坏限制栈空间被分割为2部分, 确保了至少1/2栈的有效性 ; 其次是改变了 函数返回时控制流转移的方向, 使得控制流转移和溢出具有异向性。 0018 在本实施例中, 。
19、所述任务运行栈根据函数调用顺序和后进先出的原则压入栈帧 ; 每个栈帧设置一个编号, 以表示其相对栈底的位置 ; 根据栈帧的编号, 一个栈帧编号为 k, 那么它所直接调用的所有函数的栈帧为 k+1 ; 双栈纠缠执行为 : 所有编号为奇数的栈帧被 依次安排在一起, 所有编号为偶数的栈帧被安排在一起, 当一个函数调用子函数时, 会完成 如下操作 : 1) 、 call 指令将返回值保存在父函数的栈帧中 ; 2) 、 切换到子函数的栈帧 ; 3) 、 复 制函数参数到子函数栈帧 ; 4) 、 分配局部变量空间 ; 5) 、 继续子函数逻辑执行 ; 6) 、 当子函数 完成执行后, 根据父函数栈帧中保存。
20、的返回地址返回父函数继续执行。 0019 在上述步骤中, 步骤 1) 中, 双栈纠缠执行的栈帧除了临时变量之外必须维持相应 的控制结构 ; 当发生函数调用和函数返回时, 控制结构保证了栈帧之间的平滑切换 ; 双栈 执行也必须维持栈帧之间的顺序关系, 当调用一个函数时, 须保证在正确位置上创建新的 栈帧 ; 当从一个函数返回时, 必须保证能回到调用函数的栈帧上继续执行 ; 在任务运行栈 中, 只有栈顶的栈帧是活动, 其它栈帧是非活动的。 0020 所述步骤 2) 中双栈纠缠执行的函数调用过程为 : 首先, 父函数为子函数准备参 数, 按照一定的顺序将参数压入栈中, 然后调用 call 指令, 将。
21、 call 指令下一条指令作为返 回值压入栈中, 并且将 eip 设定为被调用函数的入口地址继续执行 ; 接下来的控制由子函 数的程序逻辑决定, 直到函数准备返回。 0021 作为一种改进, 所述双栈纠缠执行的函数返回过程的一个基本原则就是将栈的基 本形态调整为执行 call 指令之前的形式 ; 第 1 条指令将 ptop 指向的 caller 栈帧的顶部 设置给寄存器, 由于子函数已经完成计算, 它的局部变量和临时空间将被丢弃, 直接将寄存 器设置为 caller 栈帧顶部是合理的 ; 第 2 条指令将父函数栈帧顶地址设置为 caller 父 函数的栈帧顶部, 由于 caller 的父函数的。
22、栈帧下紧邻子函数的栈帧位置, 因此, 子函数的 帧底就是父函数栈帧顶地址的值 ; 第 3、 4 条指令将栈帧基设置为寄存器, 利用栈操作恢复 caller 的栈帧基地址 ; 第 5 条指令则将父函数栈帧的基地址设置为 caller 的父函数栈帧 基地址。至此, 栈帧完全恢复到 call 指令执行之后的布局, 上述过程完成了函数返回的准 备工作 ; 第 6 条指令 ret 返回。 0022 步骤 2) 中所述函数参数处理函数调用的参数由父函数准备, 并且按照一定的规则 压入自己的栈帧中 ; 而子函数则处于自己的栈帧进行操作 ; 在双栈纠缠执行中, 由于父函 数的栈帧和子函数的栈帧是分割开的, 直。
23、接利用父函数栈帧顶地址同时引用函数参数和局 部变量是不现实的 ; 父函数的栈帧顶由父函数栈帧顶地址指定。 0023 根据上述描述, 一旦检测出缓冲区溢出发生, 必须对缓冲区溢出产生的破坏进行 评估, 确定其严重程度。然后, 根据严重程度采取相应的破坏限制措施。 0024 双栈纠缠执行为每个栈帧设置封装, 保存了栈结构的冗余信息。 并且非活跃的1/2 栈的完整性得到保护, 这是破坏评估的基础。 利用所给出的关系遍历栈结构, 可以计算得出 溢出破坏的范围。 0025 轻微破坏 : 如果缓冲区溢出仅导致少量栈帧被破坏, 那么它的影响范围较少。 可以 说 明 书 CN 103853662 A 6 4/。
24、4 页 7 采取重新执行函数的方式纠正破坏。遍历任务栈, 找到最上一个被破坏的栈帧。重新执行 对应函数, 重构破坏的栈结构。如果 i 是最上层的坏帧, 那么通过如下代码段 ; 重新执行被 破坏的函数, 恢复原始状态或者利用新输入重新执行函数。第 1 和 2 条语句将栈切换到第 i-1 个栈帧。第 3 条语句通过返回地址获得栈帧 i 对应的函数地址, 然后调用该函数。 0026 严重破坏 : 如果溢出导致大量栈帧(1/4以上)破坏, 破坏程度较大, 需要重新启动 任务。 0027 系统破坏 : 如果缓冲区溢出超过了活动帧所在的 1/2 栈, 那么它将破坏其他任务 的数据, 形成系统性破坏。这类破坏需要向操作系统报告。操作系统提供健康检查机制来 处理系统性破坏。 0028 以上所述仅为本发明的较佳实施例而已, 并不用以限制本发明, 凡在本发明的精 神和原则之内所作的任何修改、 等同替换和改进等, 均应包含在本发明的保护范围之内。 说 明 书 CN 103853662 A 7 。