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

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

    关注

    5209

    文章

    20625

    浏览量

    336782
  • 代码
    +关注

    关注

    30

    文章

    4975

    浏览量

    74354

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    代码可视化,破解嵌入式开发高门槛难题

    。PPECWorkbench以低代码可视化为核心,打造一站嵌入式开发解决方案,精准破解行业痛点,为嵌入式开发行业注入新活力。一、嵌入式开发
    的头像 发表于 03-25 14:13 183次阅读
    低<b class='flag-5'>代码</b>可视化,破解<b class='flag-5'>嵌入式</b>开发高门槛难题

    飞凌嵌入式亮相德国纽伦堡embedded world 2026,深耕全球嵌入式AI市场!

    2026年3月10日,全球嵌入式技术领域的年度盛会——embedded world 2026国际嵌入式展览会,在德国纽伦堡会展中心盛大启幕。飞凌嵌入式携多款重磅新品及全场景解决方案再一次隆重参展
    的头像 发表于 03-11 16:37 1.1w次阅读
    飞凌<b class='flag-5'>嵌入式</b>亮相德国纽伦堡embedded world 2026,深耕全球<b class='flag-5'>嵌入式</b>AI市场!

    嵌入式系统安全设计原则

    随着物联网、工业控制和智能设备的普及,嵌入式系统的安全问题越来越突出。一个小小的漏洞,就可能导致设备被入侵、数据泄露,甚至对人身安全产生威胁。因此,从设计阶段开始就考虑安全,是每一个嵌入式开发者必须
    的头像 发表于 01-19 09:06 461次阅读
    <b class='flag-5'>嵌入式</b>系统安全设计原则

    什么是嵌入式应用开发?

    。 · ‌医疗设备‌:如心电图仪、血压计等。 开发工具和技术 嵌入式开发过程中常用的工具包括: · ‌集成开发环境(IDE)‌:用于编写、编译和调试代码。 · ‌编译器‌:将高级语言代码转换为机器语言
    发表于 01-12 16:13

    分析嵌入式软件代码漏洞-代码注入

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

    系统嵌入式的学习路线

    嵌入式技术是各种电子产品的核心技术,也是工业4.0、远程医疗、3D打印等新兴产业的核心技术,具有广阔的发展前景。很多计算机、电子信息类专业的学生都想把嵌入式开发作为自己的职业目标,但是因为嵌入式涉及
    发表于 12-16 07:49

    嵌入式开发的关键点介绍

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

    嵌入式需要掌握哪些核心技能?

    : 1)C语言与底层编程 核心地位:C语言是嵌入式开发的基石,需精通指针操作、内存管理、位运算,直接操控硬件资源。 延伸技能:C++用于复杂项目架构设计,汇编语言优化底层性能(如启动代码、中断处理
    发表于 10-21 16:25

    嵌入式软件测试与专业测试工具的必要性深度解析

    场景中,单比特错误可能导致刹车失灵或呼吸机故障。嵌入式系统一旦部署后修复成本极高,专业测试工具是防止致命缺陷流入终端的核心防线。某欧洲Tier 1供应商曾因仿真环境下的测试遗漏导致量产ECU出现偶发性
    发表于 09-28 17:42

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

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

    嵌入式工程师为什么要学QT?

    受限的环境。 Qt的实现主要是采用p-impl手法,实现接口与实现分离,它有很好的消息循环机制,有助于在资源受限的嵌入式设备上运行。 提升代码质量 Qt的设计理念和架构可以帮助嵌入式工程师编写更加
    发表于 08-14 15:15

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

    知识: 一、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 4328次阅读
    飞凌<b class='flag-5'>嵌入式</b>2025<b class='flag-5'>嵌入式</b>及边缘AI技术论坛圆满结束

    嵌入式适合自学吗?

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