在IAR Embedded Workbench开发工具中如何实现堆栈保护来提高代码的安全性

发布者:EE小广播最新更新时间:2022-05-27 来源: EEWORLD作者: IAR Systems关键字:IAR  开发  堆栈  代码 手机看文章 扫描二维码
随时随地手机看文章

随着越来越多的嵌入式产品连接到外部网络,嵌入式产品的信息安全性(Security)越来越多地被人们关注。其中既包括直接连接到外部网络,比如通过Wi-Fi连接;也包括间接连接到外部网络,比如汽车中的ECU通过CAN总线与T-box相连,而T-box通过移动网络可以连接到外部网络。特别是对于一些高功能安全性(Safety)要求的产品,如工业,汽车,医疗产品等,信息安全成为了功能安全的前提(There Is No Safety Without Security)。


在C/C++中,堆栈缓存溢出(Stack Buffer Overflow)是一种常见的错误:当程序往堆栈缓存(Stack Buffer)写数据时,由于堆栈缓存通常采用固定长度,如果需要写的数据长度超过堆栈缓存的长度时,就会造成堆栈缓存溢出。堆栈缓存溢出会覆盖堆栈缓存临近的堆栈数据,其中可能包含函数的返回地址,就会造成函数返回时异常。如果堆栈缓存溢出是攻击者利用代码的漏洞蓄意造成的,它就称为堆栈粉碎(Stack Smashing)。堆栈粉碎是常用的一种攻击手段。


堆栈金丝雀(Stack Canaries), 因其类似于在煤矿中使用金丝雀来感测瓦斯等气体而得名,它可以用于在函数返回之前检测堆栈缓存溢出来实现堆栈保护(Stack Protection),从而提高代码的安全性。


相对于很多更加关注发挥器件性能的原厂开发工具,一些在行业中被广泛使用的商用开发工具更加关注性能和安全性的平衡性和完整性。本文以过去数十年来在行业中被广泛采用的商用工具链IAR Embedded Workbench为例,介绍如何在工具中实现堆栈保护,从而提高代码的安全性。


堆栈粉碎


在C/C++中,堆栈(Stack)用于保存程序正常运行(比如函数调用或者中断抢占)的临时数据,可能包含如下数据:


没有存储在寄存器中的函数参数和局部变量

没有存储在寄存器中的函数返回值和函数返回地址

CPU和寄存器状态


由于堆栈保存的是保证程序正常运行的临时数据,堆栈缓存溢出会覆盖堆栈缓存临近的堆栈数据,这些数据可能包含函数的返回地址,如果发生时一般会造成程序运行异常。攻击者经常利用这一点来进行堆栈粉碎攻击。


下面通过一个简单的例子来说明堆栈粉碎攻击:


void foo(char *bar)

{

   char c[12];


   strcpy(c, bar);  // no bounds checking


}


foo()函数将函数参数输入复制到本地堆栈变量c。如下图B所示:当函数参数输入小于12个字符时,foo()函数会正常工作。如下图C所示:当函数参数输入大于11个字符时,foo()函数会覆盖本地堆栈的数据,将函数返回地址覆盖为0x80C03508,当foo()函数返回时,会执行地址0x80C03508对应的代码A,代码A有可能包含攻击者提供的shell代码,从而使攻击者获得操作权限。

         

image.png

图:堆栈粉碎示例


堆栈保护


因其功能类似于在煤矿中用来发现瓦斯的金丝雀而得名的堆栈金丝雀(Stack Canaries),可以用于在函数返回执行恶意代码之前检测堆栈缓存溢出。其检测原理是:当调用函数时,将需要保存的临时数据保存到堆栈,然后放置一个堆栈金丝雀,当函数返回时,检查堆栈金丝雀的值是否发生改变;如果发生改变,说明堆栈已被篡改,否则说明堆栈没有被篡改。


下面介绍如何在IAR Embedded Workbench这种广受欢迎的商用工具链中实现堆栈保护,从而提高代码的安全性:


在IAR Embedded Workbench中,会使用启发模式(Heuristic)来决定函数是否需要堆栈保护: 如果函数局部变量包含数组类型或者结构体成员包含数组类型,或者局部变量的地址在该函数外被使用,该函数需要堆栈保护。


IAR Embedded Workbench安装目录下面srclibruntime包含stack_protection.c,里面包含了__stack_chk_guard变量和__stack_chk_fail函数,可以作为模板使用:其中__stack_chk_guard变量就是堆栈金丝雀的值,在函数返回时,如果检测到堆栈金丝雀的值被篡改,就会调用__stack_chk_fail函数。



1. 将IAR Embedded Workbench安装目录下面srclibruntime文件夹的stack_protection.c拷贝并添加到工程。


2. 在IAR Embedded Workbench中启用堆栈保护。

 image.png


3. 在代码中声明堆栈保护相关的__stack_chk_guard变量和__stack_chk_fail函数。

extern uint32_t __stack_chk_guard;

__interwork __nounwind __noreturn void __stack_chk_fail(void);


4. 编译工程。编译器会在需要堆栈保护的函数中添加如下操作:在函数入口处先入栈(Push),然后再额外保存堆栈金丝雀,具体的值用户可以在stack_protection.c中更改__stack_chk_guard;在函数出口,会检测堆栈金丝雀的值是否还是__stack_chk_guard,如果不是,说明堆栈被篡改,会调用__stack_chk_fail函数。


调试


将断点打到需要堆栈保护的函数反汇编(Disassembly)入口,暂停后发现编译器在函数入口处入栈操作之后额外将堆栈金丝雀保存:

 

image.pngimage.png

 


在函数出口处打断点,然后运行程序,在函数返回时,会先检测堆栈金丝雀的值是否还是__stack_chk_guard,如果不是,说明堆栈被篡改,会调用__stack_chk_fail函数。

 

image.png


改变堆栈金丝雀的值使之与__stack_chk_guard不一致,然后运行程序,函数返回时将会调用__stack_chk_fail函数:

 

image.png


总结


本文主要介绍了堆栈粉碎攻击如何利用堆栈缓存溢出来影响代码的安全性。通过在IAR Embedded Workbench中实现堆栈保护可以检测堆栈的完整性,从而提高代码的安全性。


参考文献:


1. https://en.wikipedia.org/wiki/Stack_buffer_overflow

2. https://cwe.mitre.org/data/definitions/121.html

3. https://en.wikipedia.org/wiki/Buffer_overflow_protection

4. https://www.iar.com/knowledge/learn/programming/stack-protection-in-iar-embedded-workbench/

5. IAR C/C++ Development Guide (Stack protection)


关键字:IAR  开发  堆栈  代码 引用地址:在IAR Embedded Workbench开发工具中如何实现堆栈保护来提高代码的安全性

上一篇:儒卓力推出全新开发套件“RDK2”,将缩短产品上市时间
下一篇:西门子推出新版 Nucleus ReadyStart 简化和保护嵌入式 RISC-V 开发

推荐阅读最新更新时间:2024-11-02 12:56

博通获ARMv7与ARMv8架构授权,开发自家移动处理器
2013年1月10日ARM与Broadcom( 博通 )宣布,博通已获得ARMv7和ARMv8架构授权。此项协议将助力博通基于 ARM架构 研发自己的处理器产品。 ARMv7架构是包括Cortex-A15和Cortex-A9处理器在内的目前所有32位ARM Cortex处理器产品的基础。ARMv8架构则是ARM首款加入了64位执行的架构,基于该架构的处理器能够同时拥有64位执行和32位执行的能力。ARMv8架构将ARM在功耗效率上的优良传统应用到了64位计算并将 ARM处理器 的适用性拓展到了许多全新的应用领域。博通是在2012 ARM TechCon上发布的第一款ARMv8架构Cortex-A50系列处理器的先期合作伙伴之一
[工业控制]
使用STM32L5 TrustZon保护片上代码的机密性
STM32L5微控制器系列基于Arm Cortex-M33 内核,充分利用该内核的安全特性,即适用于 Arm V8-M 的 TrustZone技术,从内核到整个芯片系统,实现了安全区域和非安全区域之间的有效隔离。 在调试端口保护方面,TrustZone 和 RDP(读保护)的配合,同样可以实现灵活的调试端口访问控制,有效阻断来自调试端口对片上代码的窥探。 使用 STM32L5 TrustZone 保护片上代码的机密性 调试端口连接可控 在RDP1或者RDP0.5条件下,如果芯片使用了TrustZone上电调试接口就不可连接(具有类似RDP2的效果) 比RDP2更灵活,可以由用户代码控制后续调试端口访问权限,实现安全调试,并
[单片机]
ARM针对低风险嵌入式系统软件开发推出RealView开发工具套件3.1
新版本有助于基于ARM全线处理器的开发者极大改进性能和易用性   中国上海,2007年4月2日 ——日前在美国加利福尼亚州圣何塞硅谷举行的嵌入式系统大会上,ARM公司(伦敦证交所:ARM;纳斯达克:ARMHY)推出RealView开发工具套件3.1,再次彰显为基于ARM全线处理器产品的嵌入式系统软件开发提供业界一流集成工具的承诺。      RealView开发工具套件3.1可改进性能以及对ARM处理器的支持,尤其值得注意的是,它能够更好地优化整个Cortex处理器系列,包括最新推出的首个专为FPGA的部署而开发的Cortex-M1处理器。      RealView开发工具套件3.1是首个支持最新Cortex-M1处理器的工
[新品]
苹果的长远野心:千人团队开发无人驾驶汽车
      谷歌的无人驾驶汽车   新浪数码讯 2月15日上午消息,近日一直有传言称苹果公司正在进行汽车项目开发。今天,路透社再次发布更多详细信息,关键词包括:自动驾驶、电动车、以及近千人的开发团队。   在iPhone、iPad大获成功之后,什么能再次推动这家巨型公司股价? 答案是,汽车。   根据华尔街日报的消息,苹果内部的汽车项目被称为“泰坦(Titan)”,它是电动的,最初的设计看起来像是小型厢式车。今天路透社再次发表消息称,苹果公司汽车项目的一大卖点是无人驾驶。他们的野心似乎不小,苹果公司在与汽车厂商和汽车零件供应商接触,尝试新的电动传动系统和制造工艺,将打造完整的汽车,而不是只设计软件或某部分单
[手机便携]
网友发现星巴克Wi-Fi藏挖矿代码:电脑瞬间变卡
    以比特币、以太坊、莱特币为代表的虚拟货币在2017年成为耀眼的明星,价值猛涨,但凡是行tou情ji把握的好的矿工,小小暴富一把几无难度。   不过,这种严重依赖整数运算的挖矿对电脑CPU、显卡的负荷很重,单独组建矿机固然效率可观,但同时要面临能耗的精算,况且虚拟货币交易流通并没有想象中那么顺畅。   于是,很多人通过发挥互联网共享精神,开始在各种网络渠道暗藏挖矿代码,比如下载网站、成人网站等,但凡是浏览者,就神不知鬼不觉地被“偷跑”部分CPU、显卡资源。   据软件公司CEO Noah Dinkin在推特爆料,他在星巴克喝咖啡时发现,店里的公共Wi-Fi也暗藏了挖矿页面的导流代码,指向门罗币(Monero)。   同时,D
[手机便携]
IMEC详述ADC和60GHz无线开发
  在ISSCC(国际晶体管电路讨论会)上,IMEC研究员详细介绍了其在数据转换和无线60GHz的最新业绩。   在数据转换方面,IMEC的三篇论文详述了针对软件无线电(SDR),60GHz通信和传感器网络应用的超低功耗模数转换器(ADC)。位于比利时Leuven的IMEC微电子研发中心已经对其SAR(逐次逼近)架构、闪存和CABS(基于比较器的异步二进制搜索)ADC家族申请了专利,希望这些可以作为白盒IP授权应用到产品开发过程中。   IMEC研究人员开发了一个两步、7bit、150Msamples/s的ADC,达到每个转换步骤10fJ的品质因数。这个创新的CABS ADC架构包括一个1bit原始ADC和6bit副ADC。6
[焦点新闻]
基于AT89S51单片机开发板的设计
1 引言 单片机系统传统的编程方式是将单片机先从电路板上取下,放入专用的编程器进行编程,再放人电路板进行调试。其缺点是频繁的拔插器件容易损坏器件的引脚;如果频繁的调试程序,必须重复拔插,大大降低了开发效率。ISP技术是未来发展的方向,其优势是无需编程器就可进行单片机的实验和开发,单片机器件可直接焊接到电路板上,调试结束即为成品,免去调试时由于频繁插入取出对器件和电路板造成的损坏和带来的不便。 ISP可降低研发成本;缩短从设计、制造到现场调试的时间,简化生产流程,大大提高工作效率;在试验新品或学生试验等常需用不同的程序调试器件的场合中,在线编程技术尤为重要。 设计AT89S51 单片机开发板 ,采用ISP下载线实现在Keil C
[模拟电子]
基于AT89S51单片机<font color='red'>开发</font>板的设计
如何用CPFlex解决汽车ECU开发问题
Escrapt的整体网络安全保护--DV业务模式,涵盖了从嵌入式(例如,硬件安全模块和汽车防火墙)到云(例如密钥管理解决方案)的整个DevOps周期。
[嵌入式]
如何用CPFlex解决汽车ECU<font color='red'>开发</font>问题
小广播
最新工业控制文章
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved