Privet Privet Asked: 2024-11-03 16:13:33 +0800 CST2024-11-03 16:13:33 +0800 CST 2024-11-03 16:13:33 +0800 CST 如何从LINUX内核读取UEFI固件数据? 772 我的任务如下:需要从 BIOS 芯片读取所有 UEFI 固件数据并计算checksum这些数据。 如何做到这一点(UEFI 固件的内存区域是什么,是否可以从 Linux 内核读取 UEFI 固件)? linux-kernel 2 个回答 Voted Stephen Kitt 2024-11-04T01:18:22+08:002024-11-04T01:18:22+08:00 在许多系统上,你可以使用flashrom读取板载闪存 ROM ,无需任何专门的硬件。安装它然后运行 sudo flashrom -p internal 查看你的硬件是否受支持,以及 sudo flashrom -p internal -r backup.rom 读取系统的 ROM。 您可能会在访问时遇到问题/dev/mem;请参阅如何处理 /dev/mem 错误?以获取解决这些问题的帮助。请注意,卸载lpc_ich模块将触发系统的看门狗(如果系统配备了看门狗并且已启用);如果是这种情况,您的系统将重新启动,但除此之外不会发生任何不良情况(假设您当时没有您关心的未保存数据)。 部分 ROM 也可能受到管理引擎的保护(在英特尔系统上),但通常这只是 ME 特定的部分;根据您的具体要求,这可能会或可能不会成为您的担忧。 Best Answer Z0OM 2024-11-03T18:42:16+08:002024-11-03T18:42:16+08:00 由于现代系统的保护机制,直接读取所有固件数据(例如整个固件二进制文件)现在几乎是不可能的。 系统 ROM 地址/proc/iomem可以指示固件的位置,但是/dev/mem出于安全原因,内核通常会阻止对该内存区域的直接访问。 硬件程序员可以通过物理访问和专用硬件直接从芯片读取固件。 您可以尝试读取中的文件/sys/firmware/efi/efi/,UEFI 运行时服务提供了/sys/firmware/efi/efi/提供一些元数据的文件,尽管这不是整个固件。 检查efivarfs UEFI 变量可在 Linux 上通过 efivarfs 文件系统访问,通常安装在/sys/firmware/efi/efivars,因此您可以尝试从这里读取 UEFI 变量。 ls /sys/firmware/efi/efivars efivarfs - (U)EFI 可变文件系统 /sys/firmware/efi/efivars/ 中的 efi 变量条目 这不提供对整个固件二进制文件的直接访问,而是提供对特定 UEFI 变量的直接访问。 另请查看fwupd fwupdmgr get-devices arch - fwupd 人们可以尝试很多方法,但如果没有专门的硬件和软件就不可能访问新系统上的所有信息。 访问规格和工具 统一可扩展固件接口 如何在 Linux 系统中访问 UEFI 设置 UEFI Debian 维基 从 Linux 访问 UEFI 硬件信息 这不是指南,仅供参考! 例如,我们有一台联想笔记本电脑,我们忘记了 BIOS/UEFI 密码。我们可以更新笔记本电脑上的固件并启动 Linux 来查看 BIOS/UEFI 的部分内容。 但是,包含密码的区域与其他信息是分开的,无法用 Linux 读取,所以我们使用该设备芯片上的硬件,CH341 24 25 Series EEPROM Flasher USB BIOS, SOIC8 Clip On-Board直接读取数据和其他详细信息并重置芯片。 在这种情况下,据我了解,为了从芯片中读取 UEFI 固件数据,需要以编程方式开发类似于 UEFI shell 的东西并从中读取芯片中的数据(也就是说,不是从操作系统 - 环 0 级别,而是从较低的级别 - 环 -1) 直接从芯片读取 UEFI 固件数据,不受限制,所需的访问权限超出了操作系统级别(Ring 0)通常可用的访问权限。 要绕过/破解此机制,您需要在较低级别进行操作,例如 Ring -1,即操作系统。出于安全原因,存在保护机制来阻止访问 UEFI 固件数据。绕过/破解这些机制可能会带来一定的风险。 如上所述,您需要特定的硬件、软件和知识组合,这也可能会损坏或毁坏芯片。 “校验和以防止攻击者” | 也许你应该在这里特别询问security.stackexchange.com你在 Stack Exchange 网络上有最好的选择,并且在这个领域有最好的安全答案/帮助
在许多系统上,你可以使用flashrom读取板载闪存 ROM ,无需任何专门的硬件。安装它然后运行
查看你的硬件是否受支持,以及
读取系统的 ROM。
您可能会在访问时遇到问题
/dev/mem
;请参阅如何处理 /dev/mem 错误?以获取解决这些问题的帮助。请注意,卸载lpc_ich
模块将触发系统的看门狗(如果系统配备了看门狗并且已启用);如果是这种情况,您的系统将重新启动,但除此之外不会发生任何不良情况(假设您当时没有您关心的未保存数据)。部分 ROM 也可能受到管理引擎的保护(在英特尔系统上),但通常这只是 ME 特定的部分;根据您的具体要求,这可能会或可能不会成为您的担忧。
由于现代系统的保护机制,直接读取所有固件数据(例如整个固件二进制文件)现在几乎是不可能的。
系统 ROM 地址
/proc/iomem
可以指示固件的位置,但是/dev/mem
出于安全原因,内核通常会阻止对该内存区域的直接访问。硬件程序员可以通过物理访问和专用硬件直接从芯片读取固件。
您可以尝试读取中的文件
/sys/firmware/efi/efi/
,UEFI 运行时服务提供了/sys/firmware/efi/efi/
提供一些元数据的文件,尽管这不是整个固件。检查
efivarfs
UEFI 变量可在 Linux 上通过 efivarfs 文件系统访问,通常安装在
/sys/firmware/efi/efivars
,因此您可以尝试从这里读取 UEFI 变量。ls /sys/firmware/efi/efivars
efivarfs - (U)EFI 可变文件系统
/sys/firmware/efi/efivars/ 中的 efi 变量条目
这不提供对整个固件二进制文件的直接访问,而是提供对特定 UEFI 变量的直接访问。
另请查看
fwupd
fwupdmgr get-devices
arch - fwupd
人们可以尝试很多方法,但如果没有专门的硬件和软件就不可能访问新系统上的所有信息。
访问规格和工具
统一可扩展固件接口
如何在 Linux 系统中访问 UEFI 设置
UEFI Debian 维基
从 Linux 访问 UEFI 硬件信息
这不是指南,仅供参考!
例如,我们有一台联想笔记本电脑,我们忘记了 BIOS/UEFI 密码。我们可以更新笔记本电脑上的固件并启动 Linux 来查看 BIOS/UEFI 的部分内容。
但是,包含密码的区域与其他信息是分开的,无法用 Linux 读取,所以我们使用该设备芯片上的硬件,
CH341 24 25 Series EEPROM Flasher USB BIOS, SOIC8 Clip On-Board
直接读取数据和其他详细信息并重置芯片。直接从芯片读取 UEFI 固件数据,不受限制,所需的访问权限超出了操作系统级别(Ring 0)通常可用的访问权限。
要绕过/破解此机制,您需要在较低级别进行操作,例如 Ring -1,即操作系统。出于安全原因,存在保护机制来阻止访问 UEFI 固件数据。绕过/破解这些机制可能会带来一定的风险。
如上所述,您需要特定的硬件、软件和知识组合,这也可能会损坏或毁坏芯片。
“校验和以防止攻击者” | 也许你应该在这里特别询问security.stackexchange.com你在 Stack Exchange 网络上有最好的选择,并且在这个领域有最好的安全答案/帮助