主要观点:
- 之前发现安装 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 等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。