管理培训搜索
18318889481

IT
| 网络安全管理师

信息安全工程 网络蠕虫

| 系统集成项目管理工程师

每日一练 报名考试 考试大纲 知识考点 综合知识 直播动态 考试用书 政策法规 系统集成产学研实践 资质认定

| 金融科技师

职业前景 CGFT专题 政策动态

| 网络工程师

考试动态 每日一练 学习笔录 技术考点 知识考点 直播动态 考试用书 技术与应用 网络工程 网络技术入门 考试大纲

| 计算机学苑

数字媒体艺术 计算机科学与技术 软考报名 信息处理技术员 行业资讯 考试大纲 直播动态 网络安全 网络管理 通信技术 OpenHarmony 计算机与网络 企业信息化 软件工程 Linux 嵌入式Linux开发基础(ARMAtom) 离散数学 操作系统 C++程序设计 Java 语言程序设计 智能感知与无人系统 机器学习算法与人工智能 Python 软考资讯

| 计算机应用水平考试

考试动态 报考指南 全国计算机应用水平考试 中国计算机等级考试 江西计算机等级考试 广东计算机等级考试 江苏计算机等级考试 贵州计算机等级考试 湖南计算机等级考试 福建计算机等级考试 河南计算机等级考试 广西计算机等级考试 山西计算机等级考试 吉林计算机等级考试 江苏计算机等级考试 湖北计算机等级考试 北京计算机等级考试 安徽计算机等级考试 宁夏计算机等级考试 浙江计算机等级考试 陕西计算机等级考试 湖北计算机等级考试 河北计算机等级考试 天津计算机等级考试

| 电子商务平台

互联网营销师 电子商务师 农村电商

| 计算机技术与软件专业技术资格(水平)考试
| 信息系统项目管理师

学习笔记 考试动态 直播动态 考试用书 考试大纲 信息系统项目管理

| 信息系统监理师

IT实务 直播预告 信息系统监理师综合 答疑QA 监理资质

| 信息处理技术员

考试动态 直播动态 考试用书 知识分享 技术百科

| 基于行为监测的嵌入式操作系统堆栈溢出测试当前您所在的位置:首页 > IT > 计算机学苑 > 软件工程 > 操作系统

基于行为监测的嵌入式操作系统堆栈溢出测试*

杨兴达1,2,陈 灿1,2,方 菱1,2

(1.安徽大学物质科学与信息技术研究院,安徽 合肥 230000;2.中国科学院合肥物质科学研究院,安徽 合肥 230000)

摘 要:堆栈测试是嵌入式操作系统安全评估的重要环节,堆栈溢出会覆盖邻近堆栈中的数据,造成数据错乱进而引发系统崩溃。然而捕获并定位堆栈溢出具有一定难度。首先,溢出数据可能会侵占操作系统中其它任务的私有堆栈,而发生溢出的任务本身没有异常表现,以致难以确定堆栈溢出的根源;其次,由于操作系统任务的优先级差异,堆栈溢出的暴露时间可能滞后于其发生时间。提出了一种基于实时堆栈分配与回收行为监测的动态堆栈测试方法,首先在堆栈行为测试点插入桩函数,以采集任务堆栈的测试码;然后设置上位机测试程序,以分析测试码并提供测试结果,实现实时捕获并定位堆栈溢出。利用此方法,在基于车载远程信息处理终端的实际测试中,定位到了3处造成系统崩溃或复位的堆栈溢出异常,评估了操作系统堆栈的安全性。另外,根据测试结果,优化了堆栈大小的静态分配,在单个任务中最多节省了42%的堆栈空间,并将整个任务RAM压缩至原来的63%。

关键词:操作系统;程序插桩;堆栈测试;动态测试

1 引言

嵌入式操作系统是一种面向安全关键的系统,其堆栈安全至关重要。丰田的凯美瑞车型曾发生过严重的意外加速UA(Unintended Acceleration)事故,事故就是由于堆栈溢出造成TASK X死亡所导致的[1]。堆栈溢出通常难以捕捉,因为异常暴露的时间可能滞后于其发生时间。例如,任务P的堆栈溢出,并侵占优先级较低的任务Q的私有堆栈,则至少在任务Q被调度并运行前,系统看起来一切正常。当任务Q显露异常时,开发者难以确定此异常是由任务Q本身造成的还是由其它任务的堆栈溢出引起的,更难以定位造成堆栈溢出的具体代码[2]。另外,为了避免堆栈溢出,开发者经常会无意识地过度分配堆栈,而嵌入式系统是一种资源受限的系统,堆栈资源的浪费将会增加随机存取存储器RAM(Random Access Memory)的成本。在理想的情况下,开发者为各任务堆栈预分配的空间应该略大于该任务实际使用堆栈的极大值。但是,人为地预估堆栈空间十分困难,也无法保证预估结果的准确性。

2 相关研究

关于堆栈溢出测试,相关研究人员进行了一定的研究。

Zhang等人[3]定义了一种用于描述函数间调用行为的树形结构,并通过在树形结构中提取极端树的方式来计算堆栈使用的极大值,从而避免可能的堆栈溢出问题。这种方法虽然可以静态地对系统堆栈进行评估,但是其分析过程比较复杂,需要人为考虑所有的极端情形并绘制函数树模型,且每种函数树的模型都不尽相同,导致此方法在实际工程测试中不够高效。

Xie等人[4]提出了一种算法,可以将堆栈溢出的检测问题转化为整数范围的分析问题。该算法先使用函数定位模块计算代码检测范围,然后将调用函数与风险函数库中的函数进行比对,以扫描检测范围内所有的风险函数,最后通过对风险函数的参数进行分析来准确计算当前函数所需堆栈是否会溢出。该算法仍具有一定的局限性,因为它十分依赖风险函数库。如果被调函数不在风险函数库中,或者造成堆栈溢出的只是一条赋值语句而非函数,那么该算法就会失效。

Choi等人[5]提出了一种基于静态分析配置文件的堆栈最大值动态监测方法。该方法首先通过分析可执行与可链接格式ELF(Executable and Linkable Format)文件提取与函数相关的数据,然后使用深度优先搜索DFS(Depth First Search)确定堆栈最大值,最后通过监测堆栈最大值的地址是否被改写来捕获堆栈溢出。该方法虽然可以动态地发现堆栈溢出,但是不能定位溢出位置。

针对相关研究中存在的不足,本文提出了一种基于实时堆栈分配与回收行为监测的动态堆栈测试方法。首先,静态地确定堆栈行为测试点;接着在测试点上采用一套标准的数据采集与分析流程进行堆栈监测,无需对不同测试点进行特殊改动,在测试效率上有所提高,并在静态分析方法上进行了动态补充;其次,通过插桩来覆盖源代码中所有的堆栈行为测试点,并不依赖于任何第三方库,不会出现失效问题;最后,不仅可以通过堆栈指针SP(Stack Pointer)地址判定堆栈溢出,还能够实时定位发生溢出的源代码,对堆栈溢出测试的功能性进行了拓展。

3 堆栈行为动态监测方法

本节将介绍任务堆栈分配与回收行为实时监测方法的总体设计与具体实现。

3.1 相关技术概述

下面将简单介绍后文所提及的相关技术。

(1)静态测试与动态测试:在嵌入式软件测试中,静态测试是基础,动态测试是必要补充[6]。静态测试往往是通过提取源代码编译生成的汇编代码或二进制代码中的一些特征进行分析,或者构建模型后对模型进行测试验证。比如Fang等人[7]先通过形式化方法建模并验证模型,然后再根据模型开发测试用例生成器,对嵌入式实时操作系统进行了高效的测试验证。动态测试则是通过某种方式获取程序运行时的轨迹信息进行分析[8,9]。动态测试所发现的漏洞是软件中实际存在的,不会误报,并且动态测试不需要像静态测试那样进行复杂的数据流分析[10]

(2)软件插桩技术:软件插桩是一种在软件运行时进行的状态分析技术,广泛应用于软件质量评价、漏洞挖掘、性能分析与优化等领域中,是解决软件执行路径收集、关键函数调用分析等问题的主要手段[11,12]

(3)HOOK技术:HOOK是一种操作系统内部的回调函数,会在特定的事件到来之际被回调执行。

(4)控制器局域网络CAN(Controller Area Network)协议:CAN是一种用于实时应用的串行通信协议总线,可用于汽车中各种不同元件之间的通信。

(5)分布式处理:将位于不同地点或具有不同功能或拥有不同数据的多台计算机通过通信网络连接起来,协调地完成信息处理。

3.2 测试框架概述

本文方法首先静态分析了源代码中所有可能的测试点。对于堆栈溢出测试来说,测试点就是具有堆栈分配或回收行为的代码行。接着,通过软件插桩技术在测试点插入用于采集堆栈数据的桩函数接口。开发者在编写代码时就可以自行插桩,以减轻测试者的负担,桩函数的插入逻辑和编码行为类似于HOOK函数。

插桩后,桩函数应在被测系统实际运行时动态收集测试点的堆栈数据并进行实时分析。为了规避数据分析给操作系统带来的额外工作负荷,本文方法采用了分布式处理的设计思想来进行数据分析,即被测系统仅采集数据,数据分析的工作则交由另一台机器负责。被测系统在完成数据采集后立即将数据传送给上测试器UT(Upper Tester),再由UT完成实时的数据分析和溢出判定工作。另外,测试数据的统计和堆栈溢出的报警服务也由UT提供。

因为本文方法的被测系统通过CAN进行数据传输,其在传输超过8字节的数据时需要分包,为了进一步降低数据传输对操作系统运行效率的影响,本文方法将采集到的数据压缩成8字节长度的测试码,具体的测试码设计规则将在3.4节中介绍。最后,UT根据测试码的设计规则来反向解析,得到实时的堆栈数据,并进行堆栈溢出判定。当堆栈溢出发生时,测试者可以通过UT实时发现异常,并根据测试点的信息来定位源代码中造成堆栈溢出的确切位置。本文方法的测试流程如图1所示,测试架构如图2所示。

Figure 1 Workflow diagram of the proposed method
图1 本文方法工作流程图

Figure 2 Test frame of the proposed method
图2 本文方法测试框架图

3.3 消除数据解析延迟的影响

测试码由被测系统发送至UT显然需要时间,且UT的解析反馈也会造成无法避免的延迟。为了消除延迟对测试的实时性影响,本文方法的测试码包含了详细的堆栈异常信息,其中包括发生异常的任务内部函数编号,使得UT只依靠延迟收到的测试码也能准确定位到发生堆栈溢出的代码位置。

3.4 基于堆栈结构与行为确定测试点

本文方法中被测操作系统进行任务堆栈分配时,会由高地址向低地址递减分配,不同任务的私有堆栈空间被静态确定后,在物理地址上是连续的,如图3所示。

Figure 3 Physical structure diagram of task stack
图3 任务堆栈物理结构图

每一块任务私有堆栈都是由3个区域组成的,如图4所示。A区域用于存放静态数据,如普通指针、数组和常量等;B区域是任务的内部函数被调用时所申请的一块空间,可以在被调用函数返回后回收再利用;C区域只有一个魔术数字,被用作堆栈溢出检测。其中,B区域的F1和F2是2个不同的函数,F2在F1的调用返回后重用了F1的堆栈空间。F1.1是F1内部调用的一个函数,其堆栈是紧接着F1的栈顶分配的。图4中的P1、P3、P5是具有堆栈分配行为的测试点,P2、P4则是具有堆栈回收行为的测试点,操作系统各任务中的每个测试点都需要被监测。另外,中断服务程序ISR(Interrupt Service Routines)的堆栈行为与普通函数一致。对于A区域来说,其堆栈的分配行为在编译器编译完成后就已经确定了,故A区域只需要一个测试点就可以监测整个静态数据区的堆栈情况。

Figure 4 Example of task stack allocation and reuse behavior
图4 任务堆栈分配与复用行为示例

在测试点插桩后,桩函数会将相应的测试码通过CAN发送出去,每个任务都需要额外承担发送测试码的工作,所以每个任务的执行时间会加长,并且执行用时与测试点数量成正比。因此,本文通过一个全局宏开关来控制测试点桩函数的有效性,只有在测试模式时,宏开关才会被打开,桩函数才会得到执行。

3.5 堆栈数据压缩与测试码设计

测试码需要记录各种不同的测试资源,本文方法将测试码的8字节作为8个数位以最大范围地表示这些资源。

操作系统中每个任务的堆栈空间都是静态分配的,从任务堆栈的起始地址(栈底,高地址,变量名为BOS)计算出其结束地址(栈顶,低地址,变量名为TOS)。因此,测试码需要记录BOS,而任务堆栈的静态分配大小是已知的,无需记录。另外,测试码还需记录当前任务SP的实时地址,用于判定堆栈是否溢出,正常堆栈的SP应该在[BOS,TOS]。最后,测试码还应记录任务中实时调用的函数信息,以在堆栈溢出时确定源代码中发生异常的具体位置。鉴于某些函数签名十分冗长,本文方法为各任务中的函数建立了映射,以数字而非字符串来标识不同的函数,使得测试码能够以较大的进制在有限的数位上表示更大的数据范围。测试码中各数位的职能信息如表1所示。另外,被测系统中的堆栈地址都具有0x40000000大小的固定偏移,为了压缩数位空间,本文方法在采集堆栈地址信息后会移除偏移,以缩小数据范围。例如,UT接收到的16进制测试码“10 5C 10 04 30 30 30 34”表示当前任务已经回收了编号为4的函数所申请的堆栈空间,并且当前SP的地址为0x40001004,当前任务的堆栈上界为0x4000105C。

Table 1 Bit mapping table of test code

表1 测试码数位映射表

3.6 UT设计

UT接收到测试码后,会解析测试码并得到各个数位的信息。被测系统中测试所需的有效信息都应在UT中备份,这样UT在进行数据分析时无需被测系统介入。另外,UT除了监测堆栈溢出,还需要比对任务在调用函数前后的SP记录,以保证堆栈回收的正确性。如果某测试点的SP在堆栈分配前后不一致,则说明堆栈回收过程出现了异常,此时UT不能直接定位异常代码,测试者需要排查其余任务的堆栈溢出异常来确定此回收异常的原因。

UT对每个测试点的测试结果进行分析和记录并将其统计到全局测试数据报表,以此为参考方便开发者提供操作系统中各任务堆栈的优化建议。

4 实验与分析

本文通过对基于MPC5748G芯片的车载远程信息处理器T-BOX(Telematics BOX)系统进行堆栈溢出测试,发现了如下问题:在1 ms周期性任务中,虽然没有发生堆栈溢出,但是其堆栈被静态分配得过大,造成了系统资源的浪费;在500 ms周期性任务和全球定位系统GPS(Global Positioning System)任务中,利用本文方法定位到了3处堆栈溢出。

具体地,在500 ms任务的数据打包函数中,开发者申请了一块数组空间用于业务数据采集,当数组容量达到阈值时会打包上传当前数据并清空数组以复用。但是,程序在擦除旧数组时发生了问题,导致数组前10个索引上的数据没有被清除。随着系统的持续运行,未被清除的垃圾数据越积越多,最终造成了任务堆栈溢出,系统被强制复位,RAM数据全部丢失。本文方法准确地定位到了这个异常,并且发现此异常溢出的数据覆盖了与500 ms任务堆栈相邻的任务中的部分数据。GPS任务中的1处堆栈溢出则是由于函数递归调用嵌套太深导致的,因为开发者在静态分配任务堆栈时忽略了递归与ISR所需的堆栈空间,溢出直接造成了系统崩溃。另外,开发者违反了MISRA-C标准,该标准明令禁止任何直接的和间接的递归函数调用。

在修正了堆栈异常的代码后,500 ms任务和GPS任务实际使用的堆栈极值分别为228和164。这2个任务中共有10个由极端环境触发的硬件保护函数未被执行,导致测试点未触发完全。通过估计并补偿这部分函数所需的堆栈空间,本文方法最终将500 ms任务和GPS任务静态分配的堆栈大小优化至242和190。

测试发现的全部堆栈异常信息如表2所示;操作系统中部分任务堆栈空间的静态分配值和实际使用极大值对照如图5所示;测试统计数据和相关优化如表3所示。

Figure 5 Comparison diagram of actual space used by task stack
图5 任务堆栈实际使用空间对照图

Table 2 Exception information table of task stack
表2 任务堆栈异常信息表

Table 3 Statistics table of test data

表3 测试数据统计表

5 结束语

本文针对嵌入式操作系统的堆栈安全问题,提出了一种基于实时堆栈分配与回收行为监测的动态堆栈溢出测试方法。该方法不依赖于任何第三方库,且不会产生误报,解决了嵌入式操作系统堆栈溢出测试的实际工程问题,在实验中精确定位到了3处堆栈异常,并检测到1处受其它任务堆栈溢出影响而导致的数据覆写异常。实验结果表明,使用该方法动态监测嵌入式操作系统中的实时堆栈溢出问题是可行且有效的。另外,本文的测试结果可以指导操作系统任务堆栈的静态分配。通过对全部6个操作系统任务插入232个测试点,本文方法共监测了232个函数,并在测试后对异常代码进行了修正,对静态分配过大的堆栈空间进行了优化。最后,将1 700个双字的任务RAM优化到了1 071,即压缩至原RAM空间的63%,开发者可以利用空余出的堆栈为操作系统增添一些新任务,或者更换RAM更小的设备以降低硬件成本。在未来,重点研究一种自动化的插桩工具,用于改善开发者或测试者需要主动执行代码插桩的情形,以提高测试效率。

参考文献:

[1] Junko Y.Toyota case:Single bit flip that killed[EB/OL].[2013-10-25].https://www.eetimes.com/toyota-case-single-bit-flip-that-killed.

[2] Yan K,Liu D,Meng F Z.A highly automated binary software vulnerability risk evaluation method for off-by-one stack based buffer overflow[C] ∥Proc of 2015 IEEE International Conference on Computer and Communications,2015:16-20.

[3] Zhang G,Liu Z.Study on approach of determining size of μC/OS-II task stack[J]. Journal of Computers,2011,6(4):676-682.

[4] Xie W G,Hu J C,Kudjo P K,et al.A new detection method for stack overflow vulnerability based on component binary code for third-party component[C]∥Proc of 2018 IEEE SmartWorld,Ubiquitous Intelligence & Computing,Advanced & Trusted Computing,Scalable Computing & Communications,Cloud & Big Data Computing,Internet of People and Smart City Innovation,2018:1255-1259.

[5] Choi K,Kim S,Seok M G,et al.Maximum stack memory monitoring method assisted by static analysis of the stack usage profile[C]∥Proc of International Conference on Computer Science and its Applications,2018:756-765.

[6] Yu Quan-xi,Zhang Yi-kun,Hu Yan-jing,et al.Data collection in embedded software path coverage test[J].Computer Engineering,2009,35(21):54-56.(in Chinese)

[7] Fang L,Takashi K,Do T B N,et al.Formal model-based test for AUTOSAR multicore RTOS[C]∥Proc of 2012 IEEE 5th International Conference on Software Testing,Verification and Validation,2012:251-259.

[8] Wei Qiang,Hu Ding-wen,Wang Qing-xian.Design and implementation of object code based dynamic testing frame-work[J].Computer Engineering and Applications,2008,44(6):113-116.(in Chinese)

[9] Li Qian,Mei Lin,Ling Hui,et al.EASTT:An embedded application software test system[J].Computer Engineering & Science,2002,24(2):66-69.(in Chinese)

[10] Liang Xiao-bing,Kong Ling-da,Liu Yan,et al.Lightweight dynamic binary instrumentation algorithm for embedded software[J].Netinfo Security,2021,21(4):89-95.(in Chinese)

[11] Khamparia A,Banu J S.Program analysis with dynamic instrumentation pin and performance tools[C]∥Proc of 2013 IEEE International Conference on Emerging Trends in Computing,Communication and Nanotechnology,2013:436-440.

[12] Zhang Peng,Yang Qiu-hui,Li Hai-nu.Research of memory leak detection method on embedded system[J].Computer Engineering and Applications,2013,49(14):56-59.(in Chinese)

附中文参考文献:

[6] 于全喜,张毅坤,胡燕京,等.嵌入式软件路径覆盖测试数据采集[J],计算机工程,2009,35(21):54-56.

[8] 魏强,胡定文,王清贤.目标码动态测试框架的设计及实现[J].计算机工程与应用,2008,44(6):113-116.

[9] 李茜,梅琳,凌辉,等.EASTT:一种嵌入式应用软件测试系统[J].计算机工程与科学,2002,24(2):66-69.

[10] 梁晓兵,孔令达,刘岩,等.轻量级嵌入式软件动态二进制插桩算法[J].信息网络安全,2021,21(4):89-95.

[12] 张鹏,杨秋辉,李海怒.嵌入式软件内存泄露检测方法研究[J].计算机工程与应用,2013,49(14):56-59.


课程
财会类
税务类
金融类
经管类
认证类
学历类
建工类
健康类
专家
政府专家
财税名家
高校教授
文化传媒
金融科技
金融电子化
企业管理
财政金融
生物医药
诺贝尔奖得主
合规法律
科学技术
银行智库
财会
中国注册会计师
AIA
会计实务
财务经理人
初级会计师
税务实务
中级会计师
中国会计智库
CFO成长营
会计学苑
建工
二级造价工程师
建筑工程资讯
二级建造师
一级造价工程师
监理工程师
消防设施操作员
产教融合
建工学苑
一级建造师
安全工程师
消防工程师
造价工程事务所
BIM工程师
经管
转创人力
中级经济师
二级人力资源管理师
三级人力资源师
人力资源管理师
碳排放管理师
期刊中心
教材参考
军队文职人员
产教融合
劳动关系协调员
初、中级经济考试
企业合规师
初级经济师
企业人力资源管理师
职业指导师
教育
英语学习考试
专升本
成人高等教育
自考中国
自学考试研究所
普通专升本
小自考中心
高等继续教育学院
中外教育
智库与社会服务
高等职业本科
金融
证券从业
基金从业
金融智库
银行从业
转创博学
ICCM
项目
高管培训
国际学历
财经证书
专项课程
企业内训
教育技术产品
高校学科建设服务
教学资源开发
国际合作服务
产业服务
国内院校
海外院校
海外留学
合作院校
观点
政治经济
IT&财务融合
高校教授
文化传媒
金融科技
金融电子化
企业管理
财政金融
生物医药
诺贝尔奖
合规法律
科学技术
银行智库
商业产经
医卫
医卫健康
主管药师
保育员
药卫学苑
心理咨询师
家庭照护员
养老护理员
健康管理师
公共营养师
执业药师
育婴师(员)
主管护师
护士执业
医院招聘
IT
网络安全管理师
系统集成项目管理工程师
金融科技师
网络工程师
计算机学苑
计算机应用水平考试
电子商务平台
计算机技术与软件专业技术资格(水平)考试
信息系统项目管理师
信息系统监理师
信息处理技术员
考研
考研资讯
信息中心
专业硕士
考研公共课
同等学力申硕中心
复试调剂
研究生工作
考研中国
硕士入学考试
考研直播动态
教师
高中教师
考试动态
直播动态
考试报名
教育智库
幼儿教师
小学教师
初中教师
教师中国
教师招聘
中小学教师资格考试
普通话测试
教师企业
校长领导力
社工
社会工作者
技能中国
智库与社会服务
初级社会工作者
中级社会工作者
报考动态
社会工作事务所
职称评审
家庭教育指导师
转创网校APP
18318889481
在线QQ
在线留言
返回首页
返回顶部
留言板
发送