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

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

3天内不再提示

符号执行技术可识别安全关键代码中的漏洞

星星科技指导员 来源:嵌入式计算设计 作者:PAUL ANDERSON 2022-11-08 11:33 次阅读

多核处理器在安全关键型应用中越来越受欢迎,因为它们提供了显著的价格和性能改进。但是,为多核硬件编写多线程应用程序是出了名的困难,并可能导致灾难性故障。下面描述了用于识别问题(包括数据争用)的符号执行技术?最常见的并发缺陷之一?以及静态分析如何帮助开发人员找到并消除它们。

最大化性能对于军事嵌入式系统尤为重要,因为在日益数字化的战场上,人们越来越需要保持低成本,同时满足连接要求。随着制造商达到小型化和集成度提高所能达到的极限,提高性能的最佳方法是使用多核处理器。

缺点是,为了充分利用并行执行的许多内核,必须将软件编写为本质上是多线程的。为单核处理器编写为单线程的软件在多核处理器上执行时将实现很少或没有性能优势:必须重写或调整它以使用多线程。关键挑战是尽可能保持核心繁忙,同时确保它们正确协调对共享资源的访问。不幸的是,编写这样的代码比编写单线程代码要困难得多。当存在死锁或争用条件等缺陷时,它们可能会以难以诊断的方式表现出来。查找和消除并发 bug 的传统技术可能无效。

并发错误如此困难的核心原因之一是,当线程执行时,线程中的事件可以通过多种方式交错。随着线程或指令数量的增加,交错的数量呈指数级增长。如果线程 A 执行 M 条指令,线程 B 执行 N 条指令,则两个线程可能存在 N+MCN 交错。例如,给定两个平凡的线程,每个线程有 10 条指令,这些指令有 184,756 个可能的交错。即使使用非常小的程序,很明显也几乎不可能测试所有可能的组合。其次,即使可以识别导致故障的单个交错,也很难设置使用该特定交错的可重复测试用例,因为线程调度实际上是不确定的。因此,调试并发程序可能非常昂贵且耗时。争用条件是一类并发缺陷,很容易意外引入,并且很难通过常规测试消除。但是,程序员可以使用一些技术来查找和删除它们。

潜在的灾难性故障

与单线程代码相比,并发程序中可能会出现全新的缺陷类别,包括死锁、饥饿和争用条件。这些缺陷主要会导致开发过程中难以诊断和消除的神秘故障。我们合作过的一家航空电子制造商花了两个人年的时间应用传统的调试技术,努力找到间歇性软件故障的根本原因,结果证明这是一种竞争条件。有时后果可能很可怕——有史以来最臭名昭著的两个软件故障是由竞争条件引起的。Therac-25放射治疗机具有导致几名患者死亡的种族条件。同样,2003 年东北停电因竞争条件而加剧,导致误导性信息被传达给技术人员。

有几种不同类型的竞争条件。最常见和最隐蔽的形式之一 - 数据竞争 - 是涉及访问内存位置的竞争条件类。

当有两个或多个执行线程访问共享内存位置,至少一个线程正在更改该位置的数据,并且没有用于协调访问的显式机制时,就会发生数据争用。如果发生数据争用,则可能会使程序处于不一致状态。

考虑控制襟翼位置的航空电子代码。在正常情况下,襟翼处于飞行控制软件指示的位置,但飞行员可以通过按下控制面板上的按钮来覆盖该位置,在这种情况下,使用手动设置的位置。为了简单起见,假设程序中有两个线程:一个控制翻盖,另一个监视控制面板上元素的位置。还有一个名为 is_manual 的共享布尔变量,它对手动覆盖是否设置进行编码。摆动位置螺纹检查is_manual的值,如果为 true,则相应地设置位置。控制面板线程侦听按钮按下事件,如果按下替代按钮,它将is_manual设置为 true。图 1 显示了为实现此规范而可能编写的代码。此代码可能在大多数情况下都有效;但是,由于 is_manual 变量对两个线程共享的状态进行编码,因此它容易受到数据争用的影响,因为对它的访问不受锁保护。如果在飞行员按下超控按钮的确切时间执行襟翼定位代码,则程序可能会进入不一致的状态,并且将使用错误的襟翼位置。图 2 显示了这种情况是如何发生的。

图1:访问共享变量的两个线程中的代码

21

图2:导致数据争用的指令交错

22

这个例子巧妙地说明了数据争用的一个属性,这使得它们难以诊断:损坏的症状可能只有在数据争用发生很久之后才能观察到。在这种情况下,只有当飞行员注意到飞机没有按预期响应时,才会注意到使用错误的襟翼位置的事实。

人们普遍认为,数据竞争的某些实例是良性的,可以容忍。然而,现在毫无疑问,这很少是真的。C 标准[4] 明确指出,编译器可以假设没有数据争用,因此优化器可以并且确实进行了对提高单线程代码性能有效的转换,但在存在明显良性的竞争条件时引入了错误。这些都是微妙的影响——即使是经验丰富的程序员也经常对它们感到惊讶。(有关完整的解释和几个令人信服的示例,请参阅参考文献 [1]。因此,为了实现高水平的保证并避免灾难性故障,查找并删除所有数据争用非常重要。

消除并发缺陷

鉴于并发缺陷,尤其是数据争用,风险很大,因此使用多种技术来消除它们非常重要。由于不确定性,传统的动态测试不太适合发现许多并发缺陷。通过测试数百次的程序以后可能会在具有完全相同输入的相同环境中失败,因为该错误可能对时间非常敏感。寻求高保证的工程师如果要消除并发缺陷,就必须转向其他技术。

静态分析工具提供了一种查找此类错误的方法。测试和静态分析之间的主要区别在于,它针对给定的一组输入测试程序的特定执行,而静态分析查找适用于所有可能执行和所有输入的属性。(在实践中,静态分析工具进行近似以获得可接受的性能和精度,因此达不到这个理想模型。尽管如此,它们确实涵盖了比传统测试更多的情况。

粗略地说,静态分析工具的工作原理是创建程序模型并对该模型进行符号执行,在此过程中查找错误条件。例如,GrammaTech的CodeSonar静态分析工具通过创建哪些锁由哪些线程持有的映射,并通过推理可能导致对共享变量的不同步访问的可能交错来查找数据竞争。使用类似的技术发现死锁和其他并发缺陷(包括锁管理不善)。

自定义并发构造:案例研究

当程序使用标准方法来管理并发时,标准缺陷检测技术最有用。大多数工具识别并推理标准库(如POSIX线程库)或专有接口(如VxWorks)的特殊属性。但是,许多系统使用自定义技术来管理并发性。

例如,与我们合作的另一家制造商在使用自定义抢占式多线程软件接口的平台上构建了一个安全关键型设备。在此设计中,一个关键约束是,必须使用适当的保护构造保护可以从多个优先级线程访问的所有数据实例。在使用静态分析之前,验证是否遵守此约束需要花费人工月的手动分析时间。为了降低成本,他们通过转向静态分析来寻求解决方案。现代高级静态分析工具的一个重要特性是它们是可扩展的:它们提供了一个带有抽象的 API,可以方便地实现自定义静态分析算法。使用 CodeSonar 的 API,他们能够编写一个解决方案,该解决方案利用现有分析核心使用的算法来查找代码中违反设计约束的位置。生成的工具作为插件实现,能够自动查找违反关键约束的情况,所有这些都只需一小部分成本和比以前少得多的时间。

多核权衡

转向多核处理器设计有令人信服的理由,但风险在于这样做可能会在软件中引入并发缺陷。这些很容易引入 - 即使是看似无辜的代码也可能隐藏令人讨厌的多线程错误 - 并且众所周知,当它们发生时很难诊断和消除。仅靠传统的测试技术不足以确保高质量的软件,这主要是因为高度的非确定性。使用使用符号执行的高级静态分析工具是一种可以提供帮助的方法,因为此类工具可以推理代码执行的所有可能方式。这些工具可以在使用标准多线程库的代码中发现数据争用和死锁等缺陷,甚至可以适应使用非标准并发构造的设计。

审核编辑:郭婷

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

    关注

    68

    文章

    18309

    浏览量

    222439
  • 嵌入式
    +关注

    关注

    4985

    文章

    18305

    浏览量

    289002
收藏 人收藏

    评论

    相关推荐

    英特尔处理器+Linux发行版设备出现新型侧信道缺陷,修复难度较大

    来自阿姆斯特丹VU VUSec安全团队的研究人员揭示了Spectre v2漏洞,他们同时提供了一款检测工具,用以通过符号执行方法,识别Linux内核中的潜在可利用
    的头像 发表于 04-11 11:21 119次阅读

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

    。 3、CodeQL:在 CodeQL 代码被视为数据,安全漏洞则被建模为可以对数据库执行的查询语句。 4、SonarQube:是一个用于代码
    发表于 01-17 09:35

    汽车网络安全:防止汽车软件中的漏洞

    汽车网络安全在汽车开发中至关重要,尤其是在 汽车软件 日益互联的情况下。在这篇博客中,我们将分享如何防止汽车网络安全漏洞。 静态分析工具有助于执行关键的汽车编码指南(如MISRA和AU
    的头像 发表于 12-21 16:12 787次阅读
    汽车网络<b class='flag-5'>安全</b>:防止汽车软件中的<b class='flag-5'>漏洞</b>

    再获认可,聚铭网络入选国家信息安全漏洞库(CNNVD)技术支撑单位

    近日,国家信息安全漏洞库(CNNVD)公示2023年度新增技术支撑单位名单。经考核评定,聚铭网络正式入选并被授予《国家信息安全漏洞库(CNNVD)三级技术支撑单位证书》。     国家
    的头像 发表于 12-21 10:14 288次阅读
    再获认可,聚铭网络入选国家信息<b class='flag-5'>安全漏洞</b>库(CNNVD)<b class='flag-5'>技术</b>支撑单位

    人工智能识别安全帽佩戴监测系统

    人工智能识别安全帽佩戴监测系统利用智能视频分析技术快速准确地识别图像中的作业人员,运用多感知的处理技术对监控画面进行实时剖析识别
    的头像 发表于 12-11 10:30 201次阅读
    人工智能<b class='flag-5'>识别安全</b>帽佩戴监测系统

    静态代码块、构造代码块、构造函数及普通代码块的执行顺序

    代码块)使用static关键字和{}声明的代码块: public class CodeBlock { static { System.out. println ( "静态代码块" );
    的头像 发表于 10-09 15:40 440次阅读
    静态<b class='flag-5'>代码</b>块、构造<b class='flag-5'>代码</b>块、构造函数及普通<b class='flag-5'>代码</b>块的<b class='flag-5'>执行</b>顺序

    面向OpenHarmony终端的密码安全关键技术

    最重要的密码安全层面,提出完整的解决思路与方案;创新地在智能终端实现了软件随机数生成;构建软硬件双机制的敏感参数保护机制与技术,同时在性能上也进行了代码实现的优化与提升;提出全国产智
    发表于 09-13 19:20

    M051通过检查自定义UID来确定IO是否被切换的示例代码

    nuvoton 核 M051系列微处理器提供了一个 UID(唯一识别器) 。 开发者可以通过确定 UID 的正确性以及确保产品不被复制来确定应用程序是否继续执行。 简单 UID 识别安全似乎不够, 因而可以
    发表于 08-30 08:51

    如何使用机器学习在M480上执行关键识别

    应用程序: 本样本代码使用机器学习来在 M480 上执行关键识别。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487
    发表于 08-29 06:46

    用于缓解高速缓存推测漏洞的固件接口

    CVE-2017-5715,也称为Spectre Variant 2,是某些ARM CPU设计漏洞,允许攻击者控制受害者执行上下文中的推测执行流,并泄露攻击者在体系结构上无法访问的
    发表于 08-25 07:36

    通过检查自定义UID来确定IO是否被切换的示例代码

    nuvoton 核 M051系列微处理器提供了一个 UID(唯一识别器) 。 开发者可以通过确定 UID 的正确性以及确保产品不被复制来确定应用程序是否继续执行。 简单 UID 识别安全似乎不够, 因而可以
    发表于 08-23 06:20

    使用机器学习在M480上执行关键识别

    应用程序: 本样本代码使用机器学习来在 M480 上执行关键识别。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件: NuMaker-PFM-M487
    发表于 08-22 08:02

    基于ARMv8-M处理器的安全堆叠密封

    模式之间执行非标准转换时,例如,创建假异常返回堆栈帧以取消对中断的特权,则非安全世界软件可能操纵安全堆栈,并潜在地影响安全控制流。 这不是硬件漏洞
    发表于 08-17 06:31

    安全风险分析-Arm A配置文件的Arm固件框架

    的缺陷的成本很高,因为它们会影响体系结构的实现。在早期阶段识别问题有助于最大限度地减少成本和工作量。 固件框架规范的安全方面可以通过执行固件框架的威胁模型和安全分析(TMSA)以及规范
    发表于 08-09 07:26

    某CMS的命令执行漏洞通用挖掘思路分享

    大概是在上半年提交了某个CMS的命令执行漏洞,现在过了那么久,也想通过这次挖掘通用型漏洞,整理一下挖掘思路,分享给大家。
    的头像 发表于 05-18 17:18 2318次阅读
    某CMS的命令<b class='flag-5'>执行</b><b class='flag-5'>漏洞</b>通用挖掘思路分享