LWN:LVFS规范化的固件升级!

关注了就能看到更多这么棒的文章哦~

LVFS tames firmware updates

By John Coggeshall
September 30, 2020
https://lwn.net/Articles/832550/
DeepL assisted translation

对最终用户来说,要想保持设备固件(device firmware)时时更新到最新版本,是一个不小的挑战。通常来说,固件及时更新才能确保系统能正确地工作,而且它们也会影响系统的安全性(security)。Linux Vendor Firmware Service (LVFS)项目正在发挥越来越大的作用,使终端用户和厂商的固件更新更加简单。LVFS 刚刚宣布了其第 2000 万次固件下载。在如今这个年代,即使是一个无线鼠标的 USB 接收器这么一个小东西也会构成安全威胁(https://www.theverge.com/2019/7/14/20692471/logitech-mousejack-wireless-usb-receiver-vulnerable-hack-hijack ),因此简单、可靠、易于部署的固件更新的就非常重要了。

Red Hat 公司的 Richard Hughes 在 2016 年启动了 LVFS,2019 年,Linux 基金会将该项目纳入旗下。自成立以来,LVFS 已经发展到为大约 100 个不同供应商的 2000 多个设备提供固件更新。

在 2019 年的一次演讲[YouTube](幻灯片 https://2019.osfc.io/uploads/talk/paper/9/Introducing_the_Linux_vendor_Firmware_service.pdf )中,Hughes 从人力、组织和技术复杂性方面讨论了固件更新。正如他所解释的那样,最终用户通常不知道他们的机器中到底有什么硬件,其固件是否可以更新,如果该固件需要更新,在哪里获得该更新,或者如何进行更新。此外,用户往往不了解这些更新的重要性。正如 Hughes 所指出的那样,"当你的鼠标工作正常时,更新你的鼠标固件似乎是一件可笑的事情"。

此外,一家厂商的硬件往往包含了另一家厂商的某个可更新组件,而每家厂商只为其直接负责的硬件提供固件。综上所述,正如 Hughes 所言,"用户没有机会把这个问题解决好"。LVFS 通过提供一个集中的固件和相关描述数据的仓库,将厂商和最终用户聚集在一起,从而解决了这类复杂的问题。然而,LVFS 不仅仅是一个集中的固件发布网站。用 Hughes 的话说,LVFS 提供了 "一条从固件作者直到最终用户的管道"。

该项目由两个开源组件组成:LVFS 网站,允许厂商管理各自的固件(维护在https://github.com/fwupd/lvfs-website 这个 GitHub 仓库中);以及 fwupd 项目(GitHub 仓库为https://github.com/fwupd/fwupd ),提供了命令行工具 fwupdmgr 和 fwupd 这个守护进程,同 LVFS 网站进行交互。另一个独立的项目,GNOME Software,还提供了一个用户友好的图形界面来执行更新动作,它和 fwupd 在大多数支持 GNOME 的发行版中都是默认可用的。

LVFS 项目的核心是二进制固件数据,由厂商以 Cabinet (即 CAB)文件格式提供出来。对于一个专注于 Linux 的项目来说,这是一个奇怪的选择,但 Hughes 解释说,这样就可以 "允许厂商为 Windows Update 使用与 LVFS 相同的发布文件了"。在 Cabinet 文件里面存放的是一个加密签名过的二进制数据文件,其中包含了 LVFS 和 Windows Update 都能使用的格式的固件以及 metadata(元数据)。在处理之后,这些 Cabinet 文件由 LVFS 重新签名,以确保 fwupd 客户端可以验证固件的完整性。用于验证的 LVFS 公钥作为 fwupd 的一部分来分发给各个用户。

Hughes 把这个给厂商提供接口的 LVFS 网站描述为 "只是一个 Python Flask 项目"。它作为各个厂商的集中式固件库和管理门户。厂商上传到网站的 Cabinet 文件会经过一些处理,一旦通过了验证,就会被添加到一个名为 AppStream 的 master XML 文档中,也会被此网站进行签名。这个文档提供了 fwupd 所需的数据,从而可以通知用户,他们的系统中是否有可用的固件更新。为了安全起见,Cabinet 文件由网站直接通过 SSL 提供,而 AppStream 文档则通过内容分发网络(CDN, content distribution network)分发。

这个网站也可以托管在本地,这样就可以确保隐私数据不流失,并且对更新过程的可以拥有完全控制能力。对于本地托管的网络服务,就可以使用公司自己的密钥、签名和固件包,进行与上述相同的工作流程。然后,需要配置公司内部机器的 fwupd 来使用本地服务器。Hughes 表示,有许多未公开的组织出于各种原因在其防火墙内部使用 LVFS。

Firmware processing

提供给 LVFS 的固件,会进行许多处理。Hughes 在一封私人电子邮件中解释说,该网站可以将各种固件有效内容给处理成一组单个可执行文件和资源文件的集合。会提取出两种类型:Pre-EFI initialization modules (PEIM)和 Driver Execution Environments (DXE),并进行 hash 操作,然后保存在 LVFS 数据库中。该项目称它们为 "shards"(碎片)。正如 Hughes 所解释的那样,当一个硬件供应商给两个 OEM 商提供了相同的驱动程序时,这些 shards 就可以在不同的固件中通用。通过收集和对它们进行 hash 操作,后续就可以对它们进行查询。例如,通过在固件数据库中查找相同的哈希值,就可以确定哪种硬件在多个 OEM 中最受欢迎。

不仅如此,该项目还可以对固件进行更多的分析。Hughes 表示,DXE shards 也会经过分析。他解释说,LVFS 项目会搜索一些不应该存放在产品固件里面的内容,例如过期证书、私钥以及其他一些诸如 "DO NOT SHIP "或 "To Be Filled by O.E.M. "的字符串。

提取 shards 的过程,按 Hughes 的说法,可以有助于 "让供应商保持诚实"。有时,厂商会上传在发布说明中描述为 "低优先级只包含一些功能改善 "的固件,结果后来发现其中还包括安全更新。虽然从固件中的二进制文件中收集到的信息是很有限的,但通常来说只是有一些功能改善的固件更新并不应该与(例如)UEFI 安全启动这样的代码有关系。当有这样的情况时,他可以联系厂商进行讨论。

将固件 blobs 分解成基本的、可追踪的二进制文件的能力是该项目的一大优势,尤其是在安全方面。例如,LVFS 提供了一种方法来阻止具有已知安全问题的 shards,在他的演讲中,Hughes 展示了一条阻止已知包含 "the Dual EC backdoor for the NSA[美国国家安全局]"的规则。Hughes 在我与他的通信中说,查询 shards 数据库中包含了 compromised Computrace module(被入侵的 Computrace 模块)的固件是 "小事一桩"。Blocklist 规则是在 LVFS 网站的 blocklist 插件中定义的。值得一提的是,安全研究人员可以在 LVFS 上获得一个免费账号,针对现有的(公共)shard 数据进行 YARA 查询。

随着 LVFS 获得了业界中的更多支持,该项目对想要参与其中的厂商也提出了也越来越严格的限制和要求。在 Hughes 介绍固件签名时的一次讨论中,他告诉听众,该项目有一个要求,"签名的有效期不能超过三年,超过半数的固件都没有达到这个要求。在过去几个月里,我们一直在增加检查的次数,并使检查越来越严格。" 虽然这些检查可以被厂商忽略,但 Hughes 指出,只要能用正确的方法来实现的话厂商会 "少很多工作"。

在 LVFS 网站上有一些只有厂商才能看到的信息,包括安装成功率和失败率等固件统计数据。这些统计数据是通过另一个被 Hughes 描述为 "非常有趣 "的功能来实现的,这是一个与安装更新的最终用户进行沟通的双向反馈机制。根据 Hughes 的说法,"传统上,当你在 FTP 站点上进行固件更新时,你不会从最终用户那里得到任何信息反馈。"然而,fwupdmgr 可以向 LVFS 提供系统中历史上固件更新的记录。这种反馈机制可以由用户通过 fwupdmgr 的 report-history 子命令来使用,不过无法从 GNOME Software 中使用。这里限制对该功能的使用是有意为之的。Hughes 认为,通过命令行升级的用户 "明白将内核版本等信息上传到第三方的后果"。Hughes 有一篇博客文章(https://blogs.gnome.org/hughsie/2018/01/10/phoning-home-after-updating-firmware/ ),详细介绍了这种反馈机制中具体传输了哪些内容。

这些反馈信息不仅可以帮助厂商确定谁的固件遇到了问题从而做出相应的反应,而且对 LVFS 也很有价值。例如,故障率较高的固件更新可以自动从分发服务中删除掉,直到问题得到解决为止。

Working with vendors

虽然最常见的固件更新协议都已经可以在 fwupd 中使用(目前支持 39 个),但一些厂商使用专有协议(proprietary protocol),他们不愿意按照项目要求在 LGPLv2+许可之下发布。Hughes 看来,这些厂商的保密需求很偏执,比起他在某些国防承包商(national defense contractors)工作时的经历来说,还要 "高一个数量级的偏执"。与这些供应商合作可能是一个挑战,该项目仍在努力克服这一点。Hughes 在演讲中描述了罗技是如何拒绝分享其烧写协议代码的。不过,开发人员还是能回答他关于这部分代码的任何问题。为了能实现这个协议,Hughes 相当于同他们进行了 20 个问题的游戏。Hughes 说,一旦向他们解释了有关知识产权没有什么价值,大多数厂商都可以被说服,直接发布他们的协议,而不需要进行这个 20 问题的游戏了。从根本上说,所有的烧写协议的操作都是一样的。

Wrapping up

LVFS 看起来是一个有用的项目,也是有用的服务,它正在努力推动硬件厂商朝着正确的方向走。GitHub 报告说,这两个项目大约有 120 个贡献者。其中,fwupd 更加活跃一些,它有 85 个发布版本,几乎每天都有提交。LVFS 网站则只有 9 个版本发布出来,大约每两周有一次提交。Hughes 明确表示欢迎更多的贡献者,他没有足够的时间来完成所有这些他希望 LVFS 能实现 的功能。

至于接下来的工作,Hughes 希望能进一步建立自动化的固件分析工具,为 LVFS 网站增加更多的功能来支持厂商,并让更多的业界重要参与者如华硕和微软等参与进来。对于想了解该项目的读者来说,这个 announcement mailing list(https://lists.linuxfoundation.org/mailman/listinfo/lvfs-announce )是一个不错的渠道。该项目还提供了 developer page,介绍了贡献代码或者提出 issue 的流程。随着更多厂商的加入,以及对更多的更新协议的支持等,LVFS 准备在未来几年内继续在固件更新领域进行加强。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值