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

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

3天内不再提示

嵌入式代码的致命安全漏洞

GReq_mcu168 来源:玩转单片机 作者:玩转单片机 2021-01-15 15:07 次阅读

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

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

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

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

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

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

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

格式化字符串漏洞

大多数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及其后代衍生产品)很不擅长发现这样的漏洞,因为想要实现精确的查找漏洞就需要完成整个程序的路径敏感分析。

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

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

结论

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

21563f90-56fc-11eb-8b86-12bb97331649.png

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

文章出处:【微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    5082

    文章

    19115

    浏览量

    304935
  • 代码
    +关注

    关注

    30

    文章

    4782

    浏览量

    68546

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

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    对称加密技术有哪些常见的安全漏洞

    对称加密技术在实际应用中可能面临的安全漏洞主要包括: 实现不当: 错误的加解密实现、弱随机数生成器或其他逻辑错误都可能导致安全漏洞漏洞利用: 利用已知的弱点或攻击手段,如理论上可行的分组攻击或侧
    的头像 发表于 12-16 13:59 76次阅读

    物联网系统的安全漏洞分析

    随着物联网技术的快速发展,越来越多的设备被连接到互联网上,从智能家居、智能城市到工业自动化,物联网的应用范围不断扩大。然而,随着物联网设备的增多,安全问题也日益凸显。 一、物联网系统安全漏洞的成因
    的头像 发表于 10-29 13:37 362次阅读

    【「嵌入式Hypervisor:架构、原理与应用」阅读体验】+ Hypervisor应用场景调研

    ,不依赖宿主操作系统,直接运行在硬件资源之上,如下图: 那嵌入式系统为什么要引入Hypervisor呢?书中说是因为嵌入式系统功能越来越多,系统架构越来越复杂,随之而来的就是嵌入式系统面临许多
    发表于 10-14 11:21

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被称为嵌入式系统的核心组件,是一种用于控制和数据处理的计算机硬件,其设计旨在嵌入特定设备中执行专门任务。嵌入式主板如同是设备的“大脑”,主要功能是根据需要管理和控制设备
    的头像 发表于 09-30 10:05 456次阅读

    如何使用 IOTA 分析安全漏洞的连接尝试

    在当今数字化世界中,网络安全变得至关重要。本文将探讨如何利用流量数据分析工具来发现和阻止安全漏洞和恶意连接。通过分析 IOTA 流量,您可以了解如何识别不当行为,并采取适当的措施来保护您的网络和数据。我们将深入研究IOTA的工作流程,以了解如何准确地分析连接尝试,并识别可
    的头像 发表于 09-29 10:19 264次阅读
    如何使用 IOTA 分析<b class='flag-5'>安全漏洞</b>的连接尝试

    漏洞扫描的主要功能是什么

    弱点,以减少潜在的安全风险。 1. 漏洞识别 漏洞扫描的首要功能是识别系统中存在的安全漏洞。这些漏洞可能包括: 操作系统
    的头像 发表于 09-25 10:25 402次阅读

    FPGA赋能嵌入式设备,筑牢安全防线

    在探讨嵌入式设备领域时,安全性始终是核心议题,但遗憾的是,当前社会的关注焦点似乎偏离了问题的本质。物联网(IoT)与边缘计算网络中的安全隐患频频曝光,揭示了一个不容忽视的事实:系统中最薄弱的环节——往往被忽略的部分,正是
    的头像 发表于 08-26 16:02 590次阅读

    学习hypervisor嵌入式产品安全设计

    第一部分(第1~2章)介绍Hypervisor基础,涵盖虚拟化技术与实现、主流的嵌入式Hypervisor产品,以及基于分离内核的嵌入式Hypervisor等内容。第二部分(第3~12章)介绍嵌入式
    发表于 08-25 09:11

    嵌入式系统中工业4.0网络安全

    C和C++在嵌入式系统中占主导地位。多年来,实施工业4.0和物联网的组织已经认识到所有代码中的信息安全性的重要性,特别是对于嵌入式设备中的C和C++,其中损失的成本可能不仅仅是财务方面
    的头像 发表于 08-12 21:45 485次阅读
    <b class='flag-5'>嵌入式</b>系统中工业4.0网络<b class='flag-5'>安全</b>

    如何提升嵌入式编程能力?

    和使用。 9. 网络编程:嵌入式设备越来越多地连接到网络,因此学习TCP/IP、UDP、HTTP等网络协议是必要的。 10. 关注安全性:了解嵌入式系统的安全问题,学习如何编写
    发表于 06-21 10:01

    嵌入式技术领域的视觉、安全与AI应用

    本次2024年度德国版嵌入式世界展的大奖评选共收到全球百余家企业的申请,经由评审团严格筛选,最终选出三项候选提名,并于会场进行了隆重的颁奖仪式。其中,嵌入式视觉、安全与安防、人工智能等应用领域备受瞩目。
    的头像 发表于 04-29 11:20 366次阅读

    iOS 17.4.1修复两安全漏洞,涉及多款iPhone和iPad

     据报道,iOS/iPadOS17.4.1主要解决了Google Project Zero团队成员Nick Galloway发现并报告的两大安全漏洞(CVE-2024-1580)。
    的头像 发表于 03-26 10:47 729次阅读

    苹果承认GPU存在安全漏洞

    苹果公司近日确认,部分设备中的图形处理器存在名为“LeftoverLocals”的安全漏洞。这一漏洞可能影响由苹果、高通、AMD和Imagination制造的多种图形处理器。根据报告,iPhone 12和M2 MacBook Air等设备也受到了这一
    的头像 发表于 01-18 14:26 677次阅读

    代码审计怎么做?有哪些常用工具

    代码审计是一种通过检查源代码来发现潜在的安全漏洞的方法。 下面是常用的源代码审计工具: 1、Fortify:通过内置的五大主要分析引擎,对源代码
    发表于 01-17 09:35

    基于功能安全的汽车嵌入式软件单元验证技术研究

    随着汽车嵌入式软件功能的不断叠加,软件复杂性不断提升,对汽车嵌入式软件的安全性提出了更高要求,基于功能安全嵌入式软件开发和测试已成为汽车行
    的头像 发表于 01-07 11:27 1051次阅读
    基于功能<b class='flag-5'>安全</b>的汽车<b class='flag-5'>嵌入式</b>软件单元验证技术研究