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

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

A数据复制前

 B "hello" 作为函数参数输入 

C "AAAAAAAAAAAAAAAAAAAA\x08\x35\xC0\x80"作为函数参数输入

图:堆栈粉碎示例

堆栈保护

因其功能类似于在煤矿中用来发现瓦斯的金丝雀而得名的堆栈金丝雀(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函数:

总结

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭