追踪富士通 LIFEBOOK AH532 上的 UEFI 特性

主要观点:

  • 之前发现安装 Linux 时无法检索 EFI 变量会导致 UEFI 启动菜单为空和 BIOS 设置菜单不可访问,此次要探究问题根源及解决办法。
  • 富士通将 F2 和 F12 启动键硬编码为调用特定Boot插槽,这导致覆盖相关插槽时按键失效,UEFI 提供了基于变量的方式来覆盖启动键映射,但富士通的实现存在问题。
  • 介绍了 UEFI 变量迭代的相关接口及错误处理方式,指出 Linux 内核中efivarfs实现的错误处理存在缺陷,导致错误持续十年。
  • 通过调试追踪到错误代码来自 UEFI 实现本身,在构建基于 EDK II 的 OVMF 图像并添加调试选项后,成功捕获了 Linux 和 FreeBSD 的 UEFI 日志,发现VariableNameSize参数值是问题原因,通过修改内核补丁解决了该问题。
  • 回顾了事件链,指出多个因素导致了该漏洞的破坏性。

关键信息:

  • 富士通对启动键的硬编码方式及导致的问题。
  • UEFI 变量迭代接口及错误处理代码。
  • Linux 内核中efivarfs的错误处理缺陷。
  • 构建 OVMF 图像及调试的过程。
  • 找到VariableNameSize参数值为问题原因及解决办法。

重要细节:

  • UEFI 变量迭代通过提供变量 GUID、变量名缓冲区及大小来工作,首次迭代时变量名缓冲区大小为 0 表示从列表开头开始。
  • Linux 内核中efivarfs的错误处理代码在遇到意外错误时会停止迭代并假装正常退出,未尝试减轻错误。
  • 通过构建基于 EDK II 的 OVMF 图像并添加调试选项,成功捕获了 Linux 和 FreeBSD 的 UEFI 日志。
  • 最终通过修改内核补丁将VariableNameSize参数值从 1024 改为 512 解决了问题,该补丁已合并到 Linux 内核的稳定分支,并包含在 Ubuntu 24.04 的测试安装图像中。
  • 回顾了导致漏洞破坏性的多个因素,包括富士通的实现错误、Linux 的处理方式等。
  • 感谢了在调查过程中提供帮助的各方,如 Hacker News、Matthew Garrett、Ard Biesheuvel 等。
阅读 128
0 条评论