虹科Vdoo安全研究团队不断研究领先的嵌入式设备及其供应链,在RAUC 嵌入式固件更新框架中发现的重大漏洞。

CVE-2020-25860是一个潜在的严重漏洞,其在RAUC (一个用于固件更新的开源框架)中的 CVSSv3 得分为 8.8。此漏洞存在于 RAUC 的所有版本中,直到 1.5,其中包含补丁。
该漏洞是一个 Time-of-Check-Time-of-Use ( CWE-367 ) 问题允许有权限的攻击者在固件更新文件被验证后(但在安装完成前)覆盖它,从而允许安装一个任意的固件更新,绕过加密签名检查机制。与供应链漏洞一样,很难准确估计有多少设备受其影响。鉴于RAUC这是一个开源工具,而且许多与供应商没有关系的不同公司都可以使用它,因此这种估计更加复杂。

RAUC 背景

RAUC 即“Robust Auto-Update Controller”,该项目始于 2015 年,被开发为轻量级工具,可为基于 Linux 的嵌入式设备执行故障安全的图像更新。
RAUC 允许嵌入式 Linux 开发人员在他们的嵌入式设备上集成一个强大的更新客户端,只需最少的努力,同时避免编写任何更新代码。RAUC框架支持许多常见的引导程序(U-Boot、grub等)和存储技术(ext4、UBIFS等),因此,它试图尽可能地接近嵌入式设备固件更新的 "统包 "解决方案。
RAUC 的主要特性是安全性(原子性、故障安全更新操作)、保障性(加密签名检查)和可定制性(在安装过程中添加用户挂钩)。

技术深究

RAUC 使用捆绑文件作为保存新固件的存档。我们发现在固件升级过程中,此文件可以被攻击者替换(在初始验证步骤之后),并且通过这样做会安装恶意固件,从而有效地允许攻击者控制系统。
运行rauc install bundle.raucb时RAUC 会运行以下内部函数:

  1. check_bundle() – 使用 openssl 库调用验证包
  2. mount_bundle() – 使用“mount”shell 调用挂载包

在这些步骤之后,安装的包被提取并覆盖当前固件。
关键问题在于一旦 check_bundle() 完成运行,捆绑文件就会关闭,并且不会以任何方式保留已验证的数据。
当 mount_bundle() 开始运行时,mountshell 调用会导致重新读取包数据:

gboolean mount_bundle(RaucBundle *bundle, GError **error)
{...g_message("Mounting bundle '%s' to '%s'", bundle->path, mount_point);res = r_mount_loop(bundle->path, mount_point, bundle->size, ...
gboolean r_mount_full(const gchar *source, const gchar *mountpoint, const gchar* type, goffset size, const gchar* extra_options, GError **error)
{...if (getuid() != 0) {g_ptr_array_add(args, g_strdup("sudo"));g_ptr_array_add(args, g_strdup("--non-interactive"));}g_ptr_array_add(args, g_strdup("mount"));...g_ptr_array_add(args, g_strdup(source));...sproc = r_subprocess_newv(args, G_SUBPROCESS_FLAGS_NONE, &ierror);...

因此——攻击者可以在调用 check_bundle() 和 mount_bundle() 之间切换包文件。这让攻击者可以部署任意恶意固件,基本上可以在设备上提供root权限。

赢得竞争条件(在检查/挂载包调用之间替换包文件)的机会非常高,因为在包括shell 调用(“mount”命令)在内的两个操作之间存在不可忽略的代码量,这是一个非常缓慢的操作。

观察到的远程攻击场景

尽管在大多数情况下,我们认为该漏洞可作为本地权限升级加以利用,但我们观察到一个真实场景,即远程攻击者可利用一组默认硬编码凭据利用该漏洞。
目标设备使用了一组默认的硬编码凭据(用户名和密码设置为“admin”),首次登录时不需要更改这些凭据。
这些凭证可以被能够访问设备固件的攻击者轻易提取,或者通过简单的暴力攻击来猜测。
查看设备的攻击面:

  1. 目标设备暴露了一个经过认证的 CGI 端点upload.cgi,它允许将任意文件上传到硬编码的文件路径 -/tmp/rauc/bundle.raucb
  2. 目标设备暴露了一个经过认证的 CGI 端点install.cgi,该端点运行硬编码的 shell 命令 -rauc install /tmp/rauc/bundle.raucb
  3. 两个 CGI 端点之间没有适当的锁定机制

在这种情况下,攻击者可以远程接管设备,只需调用:

  1. upload.cgi 带有正确签名的固件
  2. install.cgi
  3. (很快)upload.cgi带有恶意固件

本地攻击场景和 PoC

假设本地用户有调用 RAUC 的权限(例如,通过只允许rauc命令的 sudo 配置),但没有签署RAUC捆绑包所需的私钥,利用是没有价值的:
将正确签名的固件复制到某个路径,例如:./bundle.raucb
Invoke RAUC –sudo rauc install ./bundle.raucb
迅速用恶意的固件替换./bundle.raucb
如果本地用户无法调用 RAUC 命令,假设调用 RAUC 命令的特权用户使用攻击者可以写入的路径,则这种情况也可以被利用。
我们开发了一个概念验证,它利用了这个确切的场景:

  1. PoC 接受要替换的包文件的完整路径
  2. PoC通过监控一个默认目录(/mnt/rauc)来等待另一个用户运行rauc安装,该目录在验证步骤之后但在安装步骤之前被创建。
  3. 一旦验证结束(目录被创建),PoC 就会用任意的输入覆盖包文件。

攻击的bundle文件可以被移到正确签名的bundle文件上(这比在正确的位置写一个新文件要快)。

作为设备供应商,如何知道设备是否受此漏洞影响?

可以通过在您的设备上运行此命令来检查您的 RAUC 版本是否存在漏洞

rauc --version

如果报告的版本低于1.5,则您的设备包含有漏洞的代码。实际上,只有当本地或远程攻击者有可能在安装捆绑包时修改该文件,该设备才会有漏洞。
例如,这可能发生在以下情况。

  1. 非特权用户可以通过sudo机制、setuid机制或任何其他专有机制,以root权限调用rauc命令。例如,/etc/sudoers文件中的以下行将允许“vdoo”用户以 root 身份调用 RAUC:
    vdoo ALL=(root) /usr/bin/rauc
  2. rauc install可以由非特权用户修改的捆绑路径随时调用。例如:
    /usr/bin/rauc install /tmp/mybundle.raucb
    由于/tmp默认情况下是全局可写的,因此通常任何用户都可以修改其下的文件。

虹科Vdoo 在其Vision平台中添加了一个适用性扫描器,可以通过检测所有 RAUC 调用并检查相关安装路径的权限来自动验证是否发生这种情况。
作为资产所有者,如何知道部署的设备是否存在漏洞?
不幸的是,似乎很难判断此漏洞是否存在,更重要的是,仅仅使用网络工具或不实际查看设备代码,就很难适用。
如果您的设备供应商为设备提供了软件物料清单 (SBOM),请查看是否使用了 RAUC,如果使用了,那么理论上您很可能容易受到攻击(除非版本明确列为 1.5),因为有漏洞代码存在。但这并不意味着该漏洞是可利用的。

如有需要,请随时联系虹科Vdoo,我们将尽力提供帮助。

如果无法升级 RAUC,如何降低风险?

如上所述,这是一个经典的 Time-of-Check-Time-of-Use 漏洞,其中攻击利用非原子性的动作,涉及到对资源的检查和资源的使用。在这种情况下,进行签名检查,用法为安装/升级。
通过确保安装是原子性的并且从安全路径发生,可以减轻攻击。
在运行rauc install之前,将捆绑文件从全局可写位置复制到安全位置(仅限 root 可写)并从该路径运行安装。使用安全位置的存在作为锁定机制。这将确保未经授权的用户(无论是本地还是远程)无法插手安装过程。
这可以通过这个示例 shell 脚本来完成:

# Assuming firmware is uploaded to /tmp/uploads/bundle.bin
# Assuming /data/fw_upgrade can be written to only by root
if [ ! -e /data/fw_upgrade/bundle.bin ]; thencp /tmp/uploads/bundle.bin /data/fw_upgrade/bundle.bin/usr/bin/rauc install /data/fw_upgrade/bundle.binrm /data/fw_upgrade/bundle.bin
fi

请注意,在使用像Yocto这样的构建系统时,更改安装脚本可能并不比切换到固定的RAUC版本容易得多。

虹科方案 | 虹科Vdoo安全平台:CVE-2020-25860 - 在 RAUC 嵌入式固件更新框架中发现的重大漏洞相关推荐

  1. 虹科方案|虹科Vdoo安全平台-D-Link路由器的安全漏洞

    前言 美国联邦贸易委员会 (FTC)起诉D-Link,因为其路由器和摄像头的安全性不足,将消费者最敏感的个人数据置于危险之中.D-Link因发布缺乏基本安全措施的产品以及在这些产品中发现安全问题时响应 ...

  2. 虹科方案 | 虹科基于空口测试的新型5G毫米波测试方案

    在3GPP R15已发布的V15.0.0版TS38.104规范中,首次出现了5G NR这一概念,NR是指New Radio,即新空口.根据标准,5G NR的频率范围被定义为不同的FR,分别为FR1与F ...

  3. 虹科案例|虹科Vdoo与安全社区合作披露多个网络交换机中的重大漏洞

    虹科Vdoo长时间致力于改善物联网和嵌入式设备安全状态的工作,除了我们的内部研究外,虹科Vdoo一直作为第三方机构与信息安全社区密切合作,帮助研究人员与供应商进行沟通,协助供应商以最专业和最安全的方式 ...

  4. 虹科方案 | 不再为联网设备的安全问题提心吊胆

    IIOT 物联网&数据安全挑战 随着工业物联网的推进,越来越多工业设备如工控机.网关.路由器.摄像头.办公电子设备和嵌入式系统等因应用需要被接入到网络中,同时带来了数据不安全的风险.这些联网设 ...

  5. 虹科案例之安全性防护平台-高通QCMAP发现的主要漏洞

    在最近的供应链安全评估中,虹科Vdoo分析了多个网络设备的安全漏洞和暴露.在分析过程中,我们发现并负责地披露了这些设备所基于的高通QCMAP(移动接入点)体系结构中的四个主要漏洞.利用这些漏洞,攻击者 ...

  6. 【虹科方案】各向同性的重要性

    ►►► 各向同性行为,被遗忘的规范 EMC 测试实验室使用电场 (E-) 场探头来确定辐射抗扰度测试期间产生的电场强度. 电场探头可用来验证产生电场强度的值,同时也是唯一且绝对的参考.因此,电场探头的 ...

  7. 虹科方案 | 助力高性能视频存储解决方案-2

    上篇文章<虹科方案 | 助力高性能视频存储解决方案-1>我们分享了虹科&ATTO 和 Avid 共同创建协作解决方案,助力高性能视频存储,今天我们再深入介绍一下我们的案例详情. 一 ...

  8. 虹科喜报 | 虹科技术工程师【国内首批】拿下Redis认证开发者证书!

    要说虹科数据库技术工程师有多强悍,认证考试2022年12月上线,次年2月就以全国首批速度强势通过考试,并于两周后正式收到[Redis认证开发人员]证书! 虹科小云忍不住浅浅炫耀一下: 或许大家对Red ...

  9. 虹科分享 | 虹科智能自动化2022文章精选

    虹科智能自动化事业部一直围绕着工业自动化.能源管理与楼宇自动化三大方向,为客户提供最满意的技术服务和最适合的解决方案,并结合客户需求.行业发展动向和产品资讯,虹科智能自动化团队为大家带来了丰富的技术文 ...

最新文章

  1. Linux多台服务器共用密钥ssh自动登陆
  2. android菜单详解三:上下文菜单
  3. 直接拿来用!最火的Android开源项目(完结篇)
  4. 百度面试题:从输入url到显示网页,后台发生了什么?
  5. solidity开发以太坊代币智能合约
  6. 外存中的对换区和文件区
  7. 吴恩达-《深度学习DeepLearning》汇总目录
  8. java通过POI技术将HTML文件转成Word
  9. php文件防删改,PHP实现增删改查以及防SQL注入
  10. 疲劳综合征的原因及解决办法
  11. 为什么要对1000000007取模
  12. 计算机应用基础2016高起专,2016年秋季《计算机应用基础(高起专)》期末考核
  13. windows下 Mysql 错误1067 Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
  14. 如何解决飞秋FeiQ绑定端口错误
  15. 常见电子元器件的常用品牌汇总
  16. __android_log_print 打印中文乱码,打印日志中文乱码 (Print log Chinese garbled)
  17. 51单片机带闹钟c语言程序,51单片机编写的闹钟程序
  18. 如何从零开始学习SEM?
  19. Python入门习题大全——数字 8
  20. revit 二次开发之创建图纸和放置视图

热门文章

  1. linux c 读取目录及其子目录下所有.jpg文件的文件名(无后缀)
  2. MATLAB实现传递函数
  3. Pgpool-II安装部署
  4. (十)ES 入门教程
  5. 【操作教程】AI智能视频安防平台EasyCVR如何隐藏页面底部文字信息?
  6. 尾插法建立单链表 数据结构
  7. UWA DAY 2021 课程推荐四——优化篇
  8. 可滚动且可排序的表格
  9. 解析JS如何运用断点进行调试
  10. android手机字体库相关问题深入剖析