0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

21克888 来源:厂商供稿 作者:IAR Systems 2022-05-27 15:49 次阅读

随着越来越多的嵌入式产品连接到外部网络,嵌入式产品的信息安全性(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代码,从而使攻击者获得操作权限。


堆栈保护

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

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

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

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

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

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


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)入口,暂停后发现编译器在函数入口处入栈操作之后额外将堆栈金丝雀保存:


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


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


总结

本文主要介绍了堆栈粉碎攻击如何利用堆栈缓存溢出来影响代码的安全性。通过在IAREmbedded 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
    +关注

    关注

    5

    文章

    350

    浏览量

    36669
  • 函数
    +关注

    关注

    3

    文章

    4329

    浏览量

    62579
  • 代码
    +关注

    关注

    30

    文章

    4780

    浏览量

    68541
收藏 人收藏

    评论

    相关推荐

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

    的ECU通过CAN总线与T-box相连,而T-box通过移动网络可以连接到外部网络。特别是对于一些高功能安全性(Safety)要求的产品,如工业,汽车,医疗产品等,信息安全成为了功能安全的前提(There Is No Safet
    的头像 发表于 06-01 18:19 7735次阅读
    <b class='flag-5'>在</b><b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b><b class='flag-5'>开发工具</b><b class='flag-5'>中</b>如何<b class='flag-5'>实现</b><b class='flag-5'>堆栈</b><b class='flag-5'>保护</b><b class='flag-5'>来</b><b class='flag-5'>提高</b><b class='flag-5'>代码</b>的<b class='flag-5'>安全性</b>

    如何在IAR Embedded Workbench配置生成对应代码区域的CRC校验码

    “使用IAR Embedded Workbench和MCU的CRC模块检查代码的完整
    的头像 发表于 10-27 11:49 1639次阅读
    如何在<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b><b class='flag-5'>中</b>配置生成对应<b class='flag-5'>代码</b>区域的CRC校验码

    IAR Embedded Workbench中计算多个地址区间的Checksum

    在前面的文章“使用IAR Embedded Workbench和MCU的CRC模块检查代码的完整
    的头像 发表于 01-05 12:33 1526次阅读
    <b class='flag-5'>在</b><b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>中计算多个地址区间的Checksum

    IAR Embedded Workbench中进行ARM+RISC-V多核调试

    之前的文章,我们介绍了如何在IAR Embedded Workbench for Arm中进行多核调试,其中所有的CPU内核都是基于AR
    发表于 06-14 16:55

    IAR_embedded_Workbench用户指南介绍

    IAR embedded Workbench for ARM 是 IAR Systems 公司为 ARM 微处理器开发的一 个集成
    发表于 11-09 18:08 90次下载

    IAR EWARM软件免费下载(嵌入式应用编程开发工具

    ARMIAREWARM。 嵌入式应用编程开发工具IAR embedded Workbench是一套高度精密且使用方便的嵌入式应用编程开发工具。该集成
    发表于 11-23 16:45 24次下载
    <b class='flag-5'>IAR</b> EWARM软件免费下载(嵌入式应用编程<b class='flag-5'>开发工具</b>)

    如何利用现代嵌入式开发工具堆栈保护功能

     以被广泛使用的IAR Embedded Workbench for Arm嵌入式开发工具为例,使用Project》Options》C/C++ Compiler》Code》Stack
    的头像 发表于 03-29 14:50 1427次阅读
    如何利用现代嵌入式<b class='flag-5'>开发工具</b><b class='flag-5'>中</b>的<b class='flag-5'>堆栈</b><b class='flag-5'>保护</b>功能

    IAR embedded Workbench激活工具下载

    IAR embedded Workbench的激活工具下载
    发表于 06-20 10:08 18次下载

    IAR Systems开发工具3.10版IAR全面支持Renesas RH850

    全球唯一为 Renesas 全系列 MCU 提供开发工具的供应商,IAR Systems 推出的最新版本 IAR Embedded Workbenc
    发表于 07-10 14:36 2692次阅读

    IAR Embedded Workbench创新工具促进智能医疗设备小型化

    创新工具促进智能医疗设备小型化、降低功耗、提高性能、加快开发速度。 2022 年 8 月 11 日 — 全球嵌入式开发软件工具和服务供应商
    发表于 08-12 14:22 732次阅读

    IAR Systems RISC-V 功能安全开发工具支持最新的 SiFive 汽车解决方案

    Workbench™ for RISC-V 支持最新的 SiFive 车用 E6-A 和 S7-A 产品系列,以满足信息娱乐、连接和 ADAS 等汽车应用的需求。IAR 的完整开发工具链帮助 OEM 和供应商的嵌入式软件
    发表于 10-24 17:40 674次阅读
    <b class='flag-5'>IAR</b> Systems RISC-V 功能<b class='flag-5'>安全</b>版<b class='flag-5'>开发工具</b>支持最新的 SiFive 汽车解决方案

    YRDKRX62N 快速入门指南(IAR Embedded Workbench)

    YRDKRX62N 快速入门指南 (IAR Embedded Workbench)
    发表于 04-12 19:14 0次下载
    YRDKRX62N 快速入门指南(<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>)

    IAR Embedded Secure IP保障产品开发后期安全性

    有了IAR Embedded Secure IP,使以MCU为中心的系统的开发者不必重置其软件开发过程。即使是
    的头像 发表于 04-14 09:28 908次阅读

    YRDKRX62N 快速入门指南(IAR Embedded Workbench)

    YRDKRX62N 快速入门指南 (IAR Embedded Workbench)
    发表于 08-04 18:30 1次下载
    YRDKRX62N 快速入门指南(<b class='flag-5'>IAR</b> <b class='flag-5'>Embedded</b> <b class='flag-5'>Workbench</b>)

    IAR推出新版IAR Embedded Workbench for Arm功能安全

    全球知名的嵌入式系统开发软件解决方案供应商IAR Systems近日宣布,其旗舰产品IAR Embedded Workbench for A
    的头像 发表于 02-22 17:29 1392次阅读