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

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

3天内不再提示

关于嵌入式代码的致命漏洞

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:嵌入式ARM 2021-01-06 15:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

随着互联网的发展,嵌入式设备正分布在一个充满可以被攻击者利用的源代码级安全漏洞的环境中。因此,嵌入式软件开发人员应该了解不同类型的安全漏洞——特别是代码注入。

术语“代码注入”意味着对程序的常规数据输入可以被制作成“包含代码”,并且该程序可以被欺骗来执行该代码。代码注入缺陷意味着黑客可以劫持现有进程,并以与原始进程相同的权限执行任何他们喜欢的代码。

在许多嵌入式系统中,进程需要以最高的权限运行,因此成功的代码注入攻击可以完全控制机器以及窃取数据,导致设备发生故障,将其作为其僵尸网络成员或使其永久无法使用。

代码注入漏洞的关键方面是:

该程序从输入通道读取数据

该程序将数据视为代码并对其进行编译

在大多数情况下,程序故意像执行代码一样执行数据是不寻常的,但将数据用于构造有意执行的对象却很常见。

格式化字符串漏洞

大多数C程序员熟悉printf函数。大体上,这些格式字符串后跟一个其他参数的列表,并且该格式字符串被解释为一组指令,用于将剩余的参数呈现为字符串。大多数用户知道如何编写最常用的格式说明符:例如字符串,小数和浮点数——%s,%d,%f——但是不知道还有其他格式字符串指令可以被滥用。

以下是printf函数通常被滥用的一种方式。有些程序员习惯编译字符串如下:

printf(str);

虽然这将在大部分时间内都具有所期望的效果,但它是错误的,因为printf的第一个参数将被编译为格式字符串。所以,如果str包含任何格式说明符,它们就将被这样编译。例如,如果str包含'%d',它会将printf参数列表中的下一个值解释为整数,并将其转换为字符串。在这种情况下,没有更多的参数,但机器在执行的时候并不了解这一点; 它所知道的全部是,函数的一些参数已经被推送到堆栈。

因为在C运行时没有机制可以告诉机器已经没有更多的参数了,所以printf将简单地选择恰好在堆栈中的下一个项目,将其编译为一个整数并打印出来。很容易看出,这可以用来从栈中打印任意数量的信息。例如,如果str包含'%d%d%d%d',则将会打印堆栈上接下来四个字的值。

虽然这是一个代码注入安全漏洞,但由于它唯一可能造成的伤害就是可以被用来获取栈中的数据,所以它还是可以被原谅的。可如果位于那里的是敏感数据(如密码或证书密钥),情况就会变得很糟;而且由于攻击者还可以在那里写入任意内存地址,因此情况还可能会变得更糟。

使这种糟糕情况的发生成为可能的是格式说明符'%n'。通常,相应的参数是指向整数的指针。当格式字符串为了建立结果字符串而被编译时,一遇到'%n',到目前为止写入的字节数就被放置到由该指针所指示的存储单元中了。例如,在下面的printf完成之后,i中的值将为4:

printf(“1234%n”,&i);

如果函数的实际参数比格式说明符更少,那么printf会将任何在堆栈上的数据作为参数编译。因此,如果攻击者可以控制格式字符串,那么它们可以将基本上任意的值写入堆栈位置。因为堆栈是局部变量所在的位置,所以它们的值可以被改变。如果这些变量中有一些是指针,那么这个平台甚至可以到达其他非堆栈地址。

真正对攻击者来说有价值的目标是让攻击者控制程序的执行部分。如果一个局部变量是一个函数指针,则攻击者可以通过该指针的后续调用来编写代码,实现自己的目标。当函数返回时,攻击者还可以将指令要被送达的地址覆盖重写。

避免代码注入

避免代码注入的最佳方法是通过设计。如果您可以使用一种永远不会出现漏洞的语言,那么这是最好的因为您的代码在构建时就是对一切攻击免疫的。或者您可以通过设计代码来禁止可能导致这些问题的接口。不幸的是,在嵌入式系统中,这些选择并不总是可行的。即使C是一种危险的语言,充斥着漏洞,但它仍然是许多组织架构的首选语言。鉴于此,开发人员应该了解其他避免代码注入的方法。

应该遵循的两个黄金规则以防止代码注入漏洞:

1.如果你可以避免的话,尽量不要将数据像代码一样编译;

2.如果你无法避免的话,请确保在使用数据之前验证数据是否良好。

为避免格式字符串的漏洞,这些规则中的第一个是最合适的; 你可以编写代码如下:

printf(“%s”,str);

这样,str的内容只被视为数据。这是最不费脑子的办法,只要你能找到所有应该做出这种修改的地方。但这对于大型程序来说可能是棘手的,特别是对于第三方代码库。

测试漏洞

测试这些类型的漏洞可能很困难; 即使能实现非常高的代码覆盖率的测试也不能触发这些问题。测试安全漏洞时,测试人员必须采取一个攻击者的心态。诸如模糊测试的技术可能是有用的,但是该技术通常太随机,无法高度可靠。

静态分析可以有效地发现代码注入漏洞。注意到早期生成的静态分析工具(如lint及其后代衍生产品)很不擅长发现这样的漏洞,因为想要实现精确的查找漏洞就需要完成整个程序的路径敏感分析。

最近出现的先进的静态分析工具更加有效。静态分析工具厂商对于哪些接口有危险,寻找目标的知识基础以及如何有效地进行这些工作已经积累了丰富的经验。

这里使用的关键技术是污染分析或危险信息流分析。这些工具通过首先识别潜在风险数据的来源,并对信息进行追踪,了解信息是如何通过代码不经过验证就流入正在使用的位置的。同时这也是能实现整个流程可视化的最好工具。

结论

代码注入漏洞是危险的安全问题,因为它们可能允许攻击者中断程序,有时甚至完全控制程序。那些关心如何在一个充满潜在恶意的互联网环境中确保他们的嵌入式代码能够安全使用的开发人员,应该将这样的代码注入漏洞,在开发周期和严格的代码检查中尽早消除。而上面提到的高级静态分析工具是被推荐使用的。

原文标题:嵌入式代码的致命漏洞

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20159

    浏览量

    329003
  • 代码
    +关注

    关注

    30

    文章

    4942

    浏览量

    73160

原文标题:嵌入式代码的致命漏洞

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式开发的关键点介绍

    开发需要考虑嵌入式系统的资源限制,例如:内存、CPU处理能力等等。因此,嵌入式开发需要开发人员具备优化代码的能力。嵌入式系统的安全性非常重要,开发人员需要考虑各种安全问题,例如:数据加
    发表于 11-13 08:12

    嵌入式达到什么水平才能就业?

    工具定位问题具备嵌入式软件模块化设计能力:能按功能划分代码模块,编写规范的头文件与源文件,实现模块间低耦合调用会使用Git 进行版本管理:能提交代码、解决冲突、回滚版本,熟悉敏捷开发流程中需求拆解与任务分配逻辑
    发表于 09-15 10:20

    入行嵌入式应该怎么准备?

    知识: 一、C/C++编程C/C++是嵌入式系统开发中最常用的编程语言。熟练掌握C/C++语言将使你能够理解和编写底层驱动程序、操作系统以及与硬件交互的代码。对于嵌入式系统来说,效率和资源利用率
    发表于 08-06 10:34

    Linux嵌入式和单片机嵌入式的区别?

    Linux嵌入式与单片机嵌入式在多个方面存在显著的区别,以下是详细的比较和归纳: 一、基本概念 1. Linux嵌入式: 定义:将Linux操作系统运行在嵌入式设备上的一种配置。
    发表于 06-20 09:46

    飞凌嵌入式2025嵌入式及边缘AI技术论坛圆满结束

    飞凌嵌入式「2025嵌入式及边缘AI技术论坛」在深圳深铁皇冠假日酒店盛大举行,此次活动邀请到了200余位嵌入式技术领域的技术专家、企业代表和工程师用户,共享嵌入式及边缘AI技术的盛宴!
    的头像 发表于 04-28 13:57 3843次阅读
    飞凌<b class='flag-5'>嵌入式</b>2025<b class='flag-5'>嵌入式</b>及边缘AI技术论坛圆满结束

    嵌入式适合自学吗?

    :自学嵌入式的过程可能会比较漫长和枯燥,学习者可能会因为缺乏成就感和动力而放弃学习。 五)学习资源质量参差不齐 1)资料筛选困难:虽然网上有很多关于嵌入式学习的资料,但这些资料的质量参差不齐。学习者需要
    发表于 04-27 09:54

    飞凌嵌入式「2025嵌入式及边缘AI技术论坛」议程公布

    4月22日,飞凌嵌入式“2025嵌入式及边缘AI技术论坛”将在深圳举行,论坛以“新生态,智未来”为主题,旨在汇聚行业智慧,探讨嵌入式技术与边缘AI的深度融合与创新应用。
    的头像 发表于 04-02 15:12 1075次阅读
    飞凌<b class='flag-5'>嵌入式</b>「2025<b class='flag-5'>嵌入式</b>及边缘AI技术论坛」议程公布

    代码+案例+生态:武汉芯源半导体CW32嵌入式开发实战正式出版

    关于 CW32 单片机的书籍。在这本书中,我们从最基础的知识讲起,详细介绍了 CW32 单片机的硬件架构、内核特性、存储系统以及各类外设功能。无论是刚刚踏入嵌入式开发领域的新手,还是经验丰富的专业人士
    发表于 03-03 15:14

    嵌入式软件测试的实战洞察:从代码漏洞到安全屏障

    转换逻辑未考虑ARM Cortex-M7芯片在低温下的运算精度偏移。这种硬件与代码的耦合性问题,正是传统测试方法难以捕捉的“致命暗礁” ‌ ‌ ‌。 案例解析:芯片特性与代码的隐秘博弈 ‌ 问题场景 ‌ 某国产电机控制器开发团队
    的头像 发表于 02-28 13:09 634次阅读

    嵌入式主板选型与应用指南

    嵌入式主板是专为嵌入式系统设计的核心硬件平台,广泛应用于工业控制、物联网、医疗设备等领域。以下是关于嵌入式主板的详细介绍:1.嵌入式主板的核
    的头像 发表于 02-27 14:53 938次阅读
    <b class='flag-5'>嵌入式</b>主板选型与应用指南

    嵌入式系统中的代码优化与压缩技术

    在当今数字化时代,嵌入式系统广泛应用于各个领域,从智能家居设备到工业控制系统,从汽车电子到可穿戴设备,它们无处不在。而在嵌入式系统开发中,代码优化与压缩技术至关重要,直接影响着系统的性能、成本
    发表于 02-26 15:00

    如何提高嵌入式代码质量?

    嵌入式系统通常直接涉及到用户的生命安全或财产安全,因此代码的安全性和可靠性是至关重要的考量因素。 1. 输入验证:对所有外部输入进行严格的验证和过滤,防止因不良输入导致的安全漏洞或系统崩溃。 2. 异常
    发表于 01-15 10:48

    嵌入式主板的概述与发展

    随着科技的迅猛发展,嵌入式系统在现代电子产品中扮演着越来越重要的角色。嵌入式主板作为嵌入式系统的核心组件之一,承担着控制、处理和通讯等多种功能。本文将对嵌入式主板的基本概念、构成部分、
    的头像 发表于 01-13 16:30 1188次阅读
    <b class='flag-5'>嵌入式</b>主板的概述与发展

    新手怎么学嵌入式?

    新手怎么学嵌入式? 在科技飞速发展的今天,嵌入式技术已经渗透到我们生活的各个角落,从智能手机到智能家居,从汽车电子到医疗设备。对于新手而言,嵌入式技术就像是一座充满神秘和机遇的宝藏,等待着大家去挖掘
    发表于 12-12 10:51

    什么是嵌入式人工智能

    嵌入式人工智能是指将人工智能技术应用于嵌入式系统中的一种技术。嵌入式系统是嵌入到其他设备或系统中的计算机系统,通常用于控制、监测或执行特定任务,如智能手机、智能家居设备、智能汽车等中的
    的头像 发表于 12-11 09:23 1524次阅读
    什么是<b class='flag-5'>嵌入式</b>人工智能