本文的俄语版本。引言
现代计算机主板的固件根据
UEFI规范工作,自2013年以来,它们支持下载程序和安全启动驱动程序的身份验证技术,该技术旨在保护计算机免受启动包的攻击。 安全启动会阻止执行未签名或不受信任的程序代码:程序的.efi文件和操作系统的引导加载程序,附加设备的固件(OPROM视频卡,网络适配器)。
可以在任何商店的主板上禁用安全启动,但是更改其设置的物理要求是计算机上的物理存在。 您需要在计算机启动时进入UEFI设置,然后才可以禁用该技术或更改其设置。
大多数主板仅带有受信任的Microsoft密钥,这就是为什么引导软件的创建者被迫与Microsoft联系以获取引导加载程序的签名,进行审核过程,以及如果他们希望驱动器或闪存驱动器不必要地运行而需要对其文件进行全局签名的理由禁用安全启动或在每台计算机上手动添加其密钥。
微软必须为Linux发行版,虚拟机管理程序,防病毒启动盘和计算机恢复程序的开发人员签署启动加载程序。
我想用各种计算机恢复软件制作一个可启动的USB闪存驱动器,该软件可以在不禁用安全启动的情况下启动。 让我们看看如何实现。
签名的Bootloader下载器
因此,要在启用安全启动的情况下引导Linux,您需要一个签名的引导程序。 由于许可证规则禁止
旋转, Microsoft禁止了根据GPLv3许可的软件的签名,因此
GRUB将无法签名 。
作为响应,Linux Foundation发布了
PreLoader ,并且Matthew Garrett编写了
shim小型引导程序,用于验证下一次下载的签名或哈希值。 PreLoader和填充程序不使用
UEFI db证书,而是在其内部包含允许散列(PreLoader)或证书(填充程序)的数据库。
这两个程序除了自动下载受信任的文件外,还允许您以安全启动模式下载任何以前不受信任的文件,但是需要用户的实际状态:首先,您需要在图形界面中选择添加的证书或哈希文件,然后将数据输入到特殊的NVRAM变量中无法从已加载的操作系统进行更改的主板。 文件仅会受到这些预引导加载程序的信任,而通常不会受到安全引导的信任,并且如果没有PreLoader / shim,您仍然无法运行它们。
通过填充程序首次启动不受信任的程序时需要执行的操作。由于证书支持,当前所有流行的Linux发行版都使用填充程序,这使得无需用户交互即可轻松更新下一个引导程序。 通常,shim用于运行GRUB2,它是Linux上最流行的引导程序。
GRUB2
为了防止攻击者借助某些分发工具包的已签名引导加载程序悄悄开展业务,Red Hat为GRUB2制作了补丁,以在启用安全启动后阻止“危险”功能:insmod / rmmod,appleloader,linux(由linuxefi代替),multiboot,xnu,memrw, or 链式加载器模块可加载任意的.efi文件,并通过自身的.efi(PE)加载器进行了补充,而无需使用UEFI LoadImage / StartImage命令以及通过shim下载的文件的验证代码,从而能够下载受shim信任但不受信任的文件就UEFI而言。 他们为什么这样做,目前尚不清楚。 UEFI允许您重新定义(挂钩)检查下载图像的功能,这是PreLoader的工作方式,并且shim本身具有
此功能 ,但默认情况下
处于禁用状态。
一种或另一种方式,使用来自某些Linux发行版的已签名GRUB将失败。 有两种方法可以创建通用的可引导USB闪存驱动器,而无需将每个下载文件的密钥添加到受信任的USB闪存驱动器中:
- 使用修改后的GRUB,该GRUB可以自己下载EFI文件,而无需检查数字签名,也不会阻止模块;
- 使用您自己的预加载器(第二个)来覆盖UEFI数字签名验证功能(EFI_SECURITY_ARCH_PROTOCOL.FileAuthenticationState,EFI_SECURITY2_ARCH_PROTOCOL.FileAuthentication)
第二个选项更可取-下载的不受信任程序也将能够下载不受信任的程序(例如,您可以通过UEFI Shell下载文件),在第一个版本中,只有GRUB可以下载所有内容。
我们修改了PreLoader ,从其中删除了多余的代码,并允许启动任何文件。
总体而言,闪存驱动器的体系结构如下:
______ ______ ______ ╱│ │ ╱│ │ ╱│ │ /_│ │ → /_│ │ → /_│ │ │ │ → │ │ → │ │ │ EFI │ → │ EFI │ → │ EFI │ │_______│ │_______│ │_______│ BOOTX64.efi grubx64.efi grubx64_real.efi (shim) (FileAuthentication (GRUB2) override) ↓↓↓ ↑ ↑ ______ ↑ ╱│ │ ║ /_│ │ ║ │ │ ═══════════╝ │ EFI │ │_______│ MokManager.efi (Key enrolling tool)
因此,有了
超级 UEFIinSecureBoot磁盘 。
超级UEFIinSecureBoot磁盘-带有GRUB2引导程序的磁盘映像,旨在方便地在UEFI安全引导模式下运行未签名的efi程序和操作系统。
该磁盘可用作创建具有计算机恢复实用程序的USB驱动器的基础,用于启动各种Linux live发行版和WinPE,通过网络启动而不禁用主板设置中的“安全启动”,这在维修其他人的计算机或公司时很方便。例如,笔记本电脑的密码已设置为更改UEFI设置。
该映像包括三个组件:Fedora的填充程序预加载器(使用大多数主板和笔记本电脑上预装的Microsoft密钥签名),改良的Linux Foundation PreLoader预加载器(在加载.efi文件时禁用签名验证)和改良的GRUB2引导加载程序。
在使用安全启动的计算机上第一次启动磁盘期间,您需要通过MokManager菜单选择一个证书(它会自动启动),此后启动加载程序将像关闭安全启动一样工作:GRUB加载任何未签名的.efi文件或Linux内核,已下载EFI程序可以运行缺少签名或不可信签名的其他程序和驱动程序。
为了演示可操作性,该映像包含Super Grub Disk(即使引导加载程序已损坏,也用于搜索和加载已安装的操作系统的脚本),GRUB Live ISO Multiboot(用于直接从ISO方便地进行Linux LiveCD引导的脚本,而无需进行初步的包装和处理),文件Linux(内核和initrd放在一个文件中,用于系统恢复),以及多个UEFI实用程序。
该驱动器与没有安全启动功能的UEFI兼容,也与具有BIOS的旧计算机兼容。
签名下载者
我想知道是否有可能绕开第一次启动时通过垫片添加密钥的需要。 也许有一些签名的下载器可以使您做的工作超出作者的预期?
事实证明-有这样的装载机。 其中之一用于
卡巴斯基救援磁盘18-带有防病毒软件的启动盘。 来自磁盘的GRUB允许您加载模块(insmod命令),而GRUB中的模块允许您加载常规可执行代码。 磁盘预加载器是本地的。
当然,仅因为磁盘上的GRUB不会加载不受信任的代码。 必须修改链加载程序模块,以便GRUB不使用UEFI LoadImage / StartImage函数,而是将.efi文件独立加载到内存中,执行重定位,找到入口点并跟随它。 幸运的是,几乎所有必需的代码都在
具有Red Hat Secure Boot支持的
GRUB存储库中,这是唯一的问题:没有
PE标头解析代码,标头解析并返回shim,以响应通过特殊协议进行的函数调用。 通过将适当的代码从shim或PreLoader移植到GRUB,可以轻松解决此问题。
因此,出现了
静音 UEFIinSecureBoot磁盘。 产生的磁盘体系结构如下:
______ ______ ______ ╱│ │ ╱│ │ ╱│ │ /_│ │ /_│ │ → /_│ │ │ │ │ │ → │ │ │ EFI │ │ EFI │ → │ EFI │ │_______│ │_______│ │_______│ BOOTX64.efi grubx64.efi grubx64_real.efi (Kaspersky (FileAuthentication (GRUB2) Loader) override) ↓↓↓ ↑ ↑ ______ ↑ ╱│ │ ║ /_│ │ ║ │ │ ═══════════╝ │ EFI │ │_______│ fde_ld.efi + custom chain.mod (Kaspersky GRUB2)
结论
在本文中,我们发现使用支持安全启动模式的Microsoft密钥签名的可靠启动加载程序不足。
使用签名的Kaspersky Rescue Disk文件,我们实现了“无声”下载启用了安全启动的所有不受信任的.efi文件,而无需向UEFI db或shim MOK添加证书。
这些文件既可以用作善举(用于从USB闪存驱动器下载),也可以用作恶作剧(用于在计算机所有者不知情的情况下安装引导程序包)。
我假设Kaspersky证书不会持续很长时间,并且将被添加到已
撤销UEFI证书的
全局列表中 ,该
列表将通过Windows Update安装在运行Windows 10的计算机上,这将破坏Kaspersky Rescue Disk 18和Silent UEFIinSecureBoot磁盘的加载。 让我们看看这会发生多久。
下载超级UEFIinSecureBoot磁盘:
https :
//github.com/ValdikSS/Super-UEFIinSecureBoot-Disk在
ZeroNet Git Center网络上下载静默UEFIinSecureBoot磁盘:
http :
//127.0.0.1 :43110/1KVD7PxZVke1iq4DKb4LNwuiHS4UzEAdAv/
关于ZeroNetZeroNet是一个非常强大的系统,用于创建分散的分布式动态网站和服务。 与BitTorrent中一样,访问资源时,用户开始下载和分发资源。 同时,可以创建完整的资源:带有评论的博客,论坛,视频托管,Wiki站点,聊天,电子邮件,Git。
ZeroNet将代码和站点数据的概念分开:用户数据存储在.json文件中,并且在同步后,它们以标准化方案导入到站点的sqlite数据库中,这使您可以做奇妙的事情:本地文本搜索所有打开的站点,以毫秒为单位,自动实时模拟所有站点的RSS。
标准化的身份验证和授权系统(类似于OAuth),支持在NAT和Tor下运行。
ZeroNet速度非常快,用户友好,具有现代化的界面和小型但非常方便的功能,例如站点上日/夜主题的全局切换。
我认为ZeroNet是一个被低估的系统,我有意仅在ZeroNet Git中发布Silent版本,以吸引新用户。