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

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

3天内不再提示

开源Zephyr和MCUboot堆栈中的26个缺陷

星星科技指导员 来源:嵌入式计算设计 作者:Brandon Lewis 2022-08-15 15:12 次阅读

开源 Zephyr RTOSMCUboot 项目在物联网生态系统中的供应商和开发人员中越来越受欢迎,因为它们一起包括开发适合的成熟应用程序所需的所有驱动程序、库、堆栈和文件系统微型边缘设备。他们是免费的也没有什么坏处。

与任何开源技术一样,维护和改进 Zephyr 和 MCUboot 代码库属于社区,这在许多人看来等同于提高安全性。事实上,福布斯最近一篇报道 Zephyr 项目的文章指出“开源软件通常被认为更安全,因为任何人都可以检查和调试代码。 ”

全球最大的安全咨询公司之一NCC 集团最近进行了一项独立研究检查,分析了 Zephyr RTOS 和 MCUboot 安全引导加载程序的安全状况,发现了更多 26 个不同严重程度的漏洞。

NCC 研究主管 Jennifer Fernick 与 Embedded Computing Design 就该公司“研究报告 - Zephyr 和 MCUboot 安全评估”中的发现进行了交谈。

在您对 Zephyr RTOS 和 MCUboot 安全引导加载程序的检查中发现了哪些严重漏洞,更重要的是,它们对物联网系统的安全性有何影响?

FERNICK:本报告中的研究重点是 Zephyr RTOS 和 MCUboot 引导加载程序,研究人员在其中发现了 Zephyr 中的 25 个漏洞和 MCUboot 中的 1 个漏洞。我们知道 Zephyr RTOS 拥有约 3% 的物联网市场份额,并且由于包括英特尔NXP、Nordic Semiconductor 等许多芯片组制造商的支持,这种影响力正在迅速增长。

pYYBAGL587mAeAtYAAH4uNsGa5I665.png

关键漏洞都在 Zephyr 网络堆栈中,其中包括堆栈缓冲区溢出攻击和内存损坏漏洞。通过利用这个特定的缓冲区溢出,当在启用特定构建选项的设备上接收到恶意 ICMP 数据包时,攻击者可能会导致拒绝服务或在设备内核中执行代码,而通过利用这个特定的内存损坏漏洞远程攻击者可以发送带有格式错误的标头的 MQTT 数据包,以在 Zephyr 内核中引发内存损坏,从而可能导致代码执行。

高风险漏洞既是 Zephyr USB 堆栈中的数据验证错误,也包括用于通过 USB 进行固件更新的驱动程序中的全局缓冲区溢出攻击,以及 USB 大容量存储驱动程序中的任意读取/限制写入。通过利用这些 USB 漏洞,对 Zephyr 设备具有物理访问权限的攻击者可以诱导拒绝服务或可能在内核中实现代码执行。拒绝服务漏洞可能意味着部署在远程位置的物联网设备可能需要物理访问设备以执行手动重启,然后设备才能再次运行,并且内核级代码执行允许攻击者破坏并完全控制设备,运行任意代码,破坏设备的功能,

修复这些 Zephyr 漏洞有多难?让我们特别关注 USB 堆栈中的那些?

FERNICK: NCC Group 报告了 Zephyr USB 堆栈中的五个漏洞。风险最高的漏洞是USB DFU 模式可以溢出 DFU_Upload 命令中的全局缓冲区以及 USB 海量存储驱动程序中的任意读取和有限写入。

USB DFU 模式全局缓冲区溢出攻击涉及利用 Zephyr 的 USB DFU 驱动程序中存在的缓冲区溢出漏洞,该驱动程序通常用于通过 USB 进行本地固件更新。通过此漏洞,对设备具有物理访问权限的攻击者至少能够在设备内引发拒绝服务,在某些情况下甚至可以在内核中执行代码,方法是通过以下方式将恶意负载插入内部闪存USB DFU 接口,然后触发全局缓冲区溢出。但是,应该注意的是,这种可利用性取决于特定 Zephyr 构建的内存布局。此问题已得到修复,可以通过对特定输入变量的大小进行基本检查以减轻缓冲区溢出来解决。

在研究 USB 海量存储驱动程序时,我们的团队发现 USB 海量存储驱动程序(用于使 Zephyr 设备充当 USB 存储驱动器)与 RAM 存储之间的交互存在问题大于 RAM 磁盘总大小的地址将导致 USB 驱动程序出错,从而导致恶意磁盘读取查询能够读取超过全局缓冲区末尾的内存,这可能会泄露内核内存内容并启用攻击者在内核中获取代码执行。此问题已得到修复,可以通过对特定输入变量中的大小进行基本检查来缓解缓冲区溢出,并确保以不会无意中从生产构建中剥离的方式执行边界检查。

一个中等风险的漏洞是USB 大容量存储器内存写入处理程序中大小未对齐的越界写入。memoryWrite 处理程序中的发现是,当 USB 数据包和存储块大小未对齐时,在从 buf 到页面的 USB 传输数据的复制过程中,页面数组可能会被覆盖,这取决于特定全局变量的布局/顺序,可能在有些情况是可以利用的。此问题已得到解决,可以通过增加页面缓冲区的大小以满足某个最小阈值以及在写入完成后将任何剩余数据移动到缓冲区的开头来解决此问题。

另一个中等风险漏洞是USB 海量存储驱动程序写入和验证处理程序中的整数下溢。此漏洞与 Zephyr 中的 memoryWrite 和 memoryVerify 函数有关,其中输入清理未正确执行,导致整数溢出。此漏洞使攻击者能够根据所选大小值泄漏堆栈内存内容或破坏全局内核内存,但仅可用于特定内存布局,因为攻击者不直接控制堆栈缓冲区的必要部分。此问题已以类似于前面讨论的其他输入清理检查的方式修复。

最后,一个低风险漏洞是USB DFU 模式允许读取主插槽绕过图像加密。这一发现意味着,在启用(可选)USB DFU 模式时,可以通过在启用 Zephyr USB DFU 和 MCUboot 加密映像功能时使用上传命令从主映像插槽中读取明文固件映像来解密加密固件映像。 这种攻击需要对设备进行物理访问。此问题尚未得到解决,但可以通过在 Zephyr 中提供禁用 DFU_Upload 命令的选项(允许读取固件映像)或简单地在 MCUboot 文档中说明绕过固件映像加密是“允许以任何方式转储内部闪存的攻击向量,”文档警告说,MCUboot 的威胁模型并未涵盖这一点。

MCUboot 应该能够覆盖多少 Zephyr 中的潜在危害,以及在开源安全引导加载程序中发现的漏洞的影响是什么?

FERNICK:引导链实现的稳健性在嵌入式操作系统的安全性中起着重要作用。在 Zephyr 和 MCUboot 的情况下,MCUboot 执行大部分启动时固件完整性验证检查,尽管 Zephyr 对运行时执行的固件升级保留一些责任。此外,安全启动保证所需的芯片配置的某些方面超出了 两者的范围 MCUboot 和 Zephyr,而是在制造过程中由设备 OEM 负责。这方面的一些示例包括禁用 JTAG 或 SWD 以防止运行时调试,或启用闪存读取保护以防止提取设备机密。因此,安全引导链对于运行 Zephyr 或任何其他 RTOS 的嵌入式系统的高度安全保证是必要的,但还不够。出于这个原因,来自整个供应链的多个级别的利益相关者和组件必须承担特定的责任,以确保实现所需的安全属性。

MCUboot漏洞是串行启动过程中对未初始化变量的潜在访问,意味着由于MCUboot中的输入处理函数存在缺陷,该函数可能会利用未首先初始化的变量,如果该值这个变量非常大或非常小,它可能会写入内存或整数下溢/溢出,最终在解码字节写入输出缓冲区时导致内存损坏。

那么这对 Zephyr/MCUboot 用户意味着什么呢?应该避免它们吗?有快速修复吗?还有什么?

FERNICK:经过初步安全审查后,与内部未经审查的同类系统相比,用户对 Zephyr 和 MCUboot 的安全性有了一定程度的信心。但是,我要提醒的是,审查所需的覆盖范围优先考虑了一些被认为具有最高安全风险的系统组件,而其他系统组件则未经检查,因此并不完整。全面的安全审计需要进一步的工作。

研究人员确实发现了一些进一步的内核加固机会,以及许多不正确的系统调用验证的证据,即内核/用户隔离在系统范围内不一定是健壮的。

不正确的数据验证是不安全代码中的常见漏洞类型,无论生态系统如何 - 例如,未能验证用户生成的输入数据是 SQL 注入攻击和跨站点脚本的根本原因,这些攻击无处不在,足以成为其中的一部分OWASP 前十名。当然,物联网设备作为一个类别往往以经常包含更多漏洞而闻名,这些漏洞通常会在其他类型的系统中看到,包括但当然不限于数据验证漏洞。

一般来说,当嵌入式设备和用于构建物联网设备的相关组件的设计者和制造商认真对待安全性时,物联网设备的用户会更加安全,例如拥有漏洞披露程序、默认启用产品安全性等。设计和运营承诺,例如最近在 ioXt 承诺中概述的承诺。

Zephyr 项目对所披露的漏洞的反应非常好,其中最高风险的组件和其他几个已被修补,并且 Zephyr 项目似乎热衷于向他们的用户宣传我们的发现和项目的总体安全性。在我们向 Zephyr 团队披露我们的发现后,他们创建了一个 产品创建者漏洞警报注册表, 以帮助他们更好地与在其产品中使用 Zephyr 的客户建立联系。致力于不断提高安全性以及围绕减轻物联网设备中的安全风险进行透明通信是朝着更安全的世界迈出的重要一步。

审核编辑:郭婷

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

    关注

    4981

    文章

    18281

    浏览量

    288385
  • usb
    usb
    +关注

    关注

    59

    文章

    7431

    浏览量

    258076
  • 物联网
    +关注

    关注

    2867

    文章

    41622

    浏览量

    358329
收藏 人收藏

    评论

    相关推荐

    瑞萨正式加入Zephyr项目,携手共建开源实时操作系统新生态

    近日,业界领先的半导体解决方案提供商瑞萨宣布正式加入Zephyr®项目,并荣升为银级会员。Zephyr作为Linux基金会的开源项目,致力于面向未来、资源受限的设备打造安全、互联且灵活的实时操作系统(RTOS)。瑞萨的加入无疑将
    的头像 发表于 03-12 09:18 161次阅读

    瑞萨正式加入Zephyr项目

    近日,瑞萨正式加入Zephyr项目,成为银级会员。Zephyr是Linux基金会的开源项目,旨在为面向未来且资源受限的设备建立安全、互联且灵活的实时操作系统。Zephyr设计来源于开发
    的头像 发表于 03-09 17:43 1520次阅读

    如何在Zephyr OS中使用cyhal?

    我一直在使用Zephyr和 CY8CPROTO-063-BLE 模块,我需要实现一高速SPI驱动器。 不幸的是,Zephyr 驱动程序的开销使每次传输的每次 SPI 传输都有大约 25 秒的额外
    发表于 01-29 07:12

    CM0P_BLESS_OTA出现BLE堆栈断开连接问题怎么解决?

    我正在 PSOC63 上构建一具有 MCUBoot 和 OTA 功能的 MTB 3.1 TLE9243QK_BASE_BOARD 应用程序。 我在 BLE 连接上遇到了奇怪的断开连接。 之后,即使
    发表于 01-19 07:38

    堆栈存取数据时的原则是什么?

    堆栈存取数据时的原则是什么
    发表于 10-31 06:55

    如何用Ubuntu qemu跑zephyr_polling的蓝牙?

    进入 RT-Thread online packages → IoT - internet of things 目录即可看到 zephyr_polling软件包,勾选软件包。
    的头像 发表于 09-28 11:24 1360次阅读
    如何用Ubuntu qemu跑<b class='flag-5'>zephyr</b>_polling的蓝牙?

    RT-Thread平台 zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程

    RTT zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程 “开源之夏”“蓝牙HOST协议栈zephyr_polling完善” 项目个人记录 菜鸡参与项目的个人记录 项目软件包
    的头像 发表于 09-27 18:40 410次阅读
    RT-Thread平台 <b class='flag-5'>zephyr</b>_polling软件包 Bluenrg2 蓝牙芯片启动流程

    C16x堆栈

    堆栈。 在正常情况下,C166只使用16潜在堆栈指针(即通用寄存器)的一,即R0。 R0创建的堆栈
    发表于 09-04 07:05

    使用Zephyr RTOS的碳漫游者

    电子发烧友网站提供《使用Zephyr RTOS的碳漫游者.zip》资料免费下载
    发表于 06-28 14:54 0次下载
    使用<b class='flag-5'>Zephyr</b> RTOS的碳漫游者

    Zephyr RTOS和HC-SR04超声波传感器开源

    电子发烧友网站提供《Zephyr RTOS和HC-SR04超声波传感器开源.zip》资料免费下载
    发表于 06-20 09:44 0次下载
    <b class='flag-5'>Zephyr</b> RTOS和HC-SR04超声波传感器<b class='flag-5'>开源</b>

    Office M5堆栈助手开源

    电子发烧友网站提供《Office M5堆栈助手开源.zip》资料免费下载
    发表于 06-19 10:12 0次下载
    Office M5<b class='flag-5'>堆栈</b>助手<b class='flag-5'>开源</b>

    lpcxpresso55s16 zephyr未定义对“__aeabi_d2iz”的引用怎么解决?

    我正在使用带 zephyr 堆栈的 lpcxpresso55s16 Eval Board,我刚刚创建了一调用一函数的线程,在该函数我正
    发表于 05-30 08:51

    如何使用RT685的DSP搭配Zephyr OS?

    我使用的是 NXP MIMXRT685 EVK 板。 我正在尝试创建一简单的程序来在 DSP 和 ARM 部件之间进行通信。我在 MCUXpresso 和 Xplorer IDE 上使用基本示例
    发表于 05-18 08:04

    EFR32BG22 Thunderboard扩增支持开源Zephyr RTOS

    ,团队与专注于开源构建工业软件和硬件解决方案的 Antmicro 密切合作,开始为 Zephyr 做出贡献, Zephyr 是一个开源计划,拥有一个活跃的社区,在物联网领域越来越受欢迎
    的头像 发表于 05-17 20:30 424次阅读
    EFR32BG22 Thunderboard扩增支持<b class='flag-5'>开源</b><b class='flag-5'>Zephyr</b> RTOS

    Zephyr支持LPC54114的USB控制器吗?

    Zephyr 支持 LPC54114 的 USB 控制器吗?据我所知,USB 基于 LpcIP3511,它确实受支持,但我无法让它工作或找到匹配的示例。
    发表于 05-17 06:42