本文的俄语版本。自2010年以来,现代PC主板的固件遵循
UEFI规范。2013年,出现了一种称为“安全启动”的新技术,旨在防止安装和运行启动
套件 。 安全启动可防止执行未签名或不受信任的程序代码(.efi程序和操作系统启动加载程序,其他硬件固件,例如视频卡和网络适配器OPROM)。
可以在任何零售主板上禁用安全启动,但是更改其状态的强制性要求是用户在计算机上的物理状态。 在计算机启动时,必须输入UEFI设置,然后才可以更改安全启动设置。
大多数主板仅包含受信任的Microsoft密钥,这迫使可启动软件供应商要求Microsoft对其引导加载程序进行签名。 此过程包括代码审核过程,以及如果他们希望磁盘或USB闪存在安全启动模式下工作而无需在每台计算机上手动添加密钥的情况下,需要使用全局信任密钥对其文件签名的理由。
Linux发行版,系统管理程序,防病毒启动磁盘,计算机恢复软件作者都必须在Microsoft中签名其引导程序。
我想用各种计算机恢复软件制作一个可启动的USB闪存驱动器,该软件可以在不禁用安全启动的情况下启动。 让我们看看如何实现这一目标。
引导加载程序的签名引导加载程序
因此,要在启用安全启动的情况下引导Linux,您需要一个签名的引导程序。 由于限制了
旋转限制,Microsoft禁止签署GPLv3许可的软件,因此
GRUB无法签名 。
为了解决这个问题,Linux Foundation发布了
PreLoader,而Matthew Garrett制作了
填充程序-小型引导程序,用于验证单个文件的签名或哈希并执行该文件。 PreLoader和Shim不使用
UEFI db证书存储,而是在可执行文件中包含允许散列(PreLoader)或证书(Shim)的数据库。
除了自动执行受信任的文件之外,这两个程序都允许您在安全启动模式下运行任何以前不受信任的程序,但是需要用户的实际状态。 首次执行时,您需要在图形界面中选择要添加的证书或要哈希的文件,然后将数据添加到主板上的特殊NVRAM变量中,该变量无法从加载的操作系统访问。 文件仅受这些预加载器信任,而通常不受安全启动信任,并且没有PreLoader或填充程序仍无法加载文件。
不受信任的软件会首先使用shim启动。由于证书支持,所有现代流行的Linux发行版都使用填充程序,这使得轻松为主引导加载程序提供更新而无需用户交互。 通常,shim用于运行GRUB2-Linux中最流行的引导加载程序。
GRUB2
为了防止出于恶意意图而使用签名的引导加载程序,Red Hat为GRUB2创建了补丁,这些补丁在启用安全引导时阻止了“危险”功能:insmod / rmmod,appleloader,linux(由linuxefi代替),multiboot,xnu,memrw,iorw。 用于加载任意.efi文件的chainloader模块引入了自己的自定义内部.efi(PE)加载器,而无需使用UEFI LoadImage / StartImage函数以及通过shim加载的文件的验证代码,以保留能够加载受Shim信任但不受UEFI信任的文件。 目前尚不清楚为什么该方法更可取-UEFI允许用户重新定义(挂钩)UEFI验证功能,这是PreLoader的工作方式,确实存在非常匀速
功能,但默认情况下已禁用。
无论如何,使用某些Linux发行版中的签名GRUB并不符合我们的需求。 有两种创建通用可引导闪存驱动器的方法,这些方法不需要将每个可执行文件的密钥添加到受信任文件中:
- 使用带有内部EFI加载程序的模块化GRUB,无数字签名验证或模块限制;
- 使用自定义的预加载程序(第二个)加载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引导程序的可引导映像,旨在用作恢复USB闪存驱动器的基础。
关键功能:磁盘在UEFI安全启动模式已激活的情况下具有完整功能。 它可以启动任何操作系统或.efi文件,即使签名不可信,无效或丢失。
该磁盘可用于运行各种Live Linux发行版,WinPE环境,网络启动,而无需在UEFI设置中禁用安全启动模式,这可以方便地执行其他人的PC和公司笔记本电脑的维护,例如,将UEFI设置锁定为密码。
该图像包含3个组件:Fedora的垫片预加载器(使用大多数主板和笔记本电脑中预安装的Microsoft密钥签名),修改的Linux Foundation PreLoader(禁用已执行文件的数字签名验证)和修改的GRUB2加载器。
第一次启动时,有必要使用MokManager选择证书(自动启动),然后一切都将与禁用安全启动时一样工作-GRUB加载任何未签名的.efi文件或Linux内核,执行的EFI程序可以加载任何其他不受信任的可执行文件,或者司机。
为了演示磁盘功能,该映像包含Super Grub Disk(即使引导加载程序损坏,也可以搜索和执行OS的一组脚本),GRUB Live ISO Multiboot(可以从ISO文件直接加载Linux Live发行版的一组脚本),文件Linux(内核和initrd在一个文件中,用于系统恢复)和多个UEFI实用程序。
该磁盘还与没有安全启动功能的UEFI兼容,并与具有BIOS的旧PC兼容。
签名的引导程序
我想知道是否有可能通过垫片绕过首次引导密钥注册。 是否可以有一些签名的引导加载程序,使您做的工作超出作者的预期?
事实证明-有这样的装载机。
卡巴斯基救援磁盘18(防病毒软件启动磁盘)中使用了其中之一。 磁盘上的GRUB允许您加载模块(insmod命令),而GRUB中的模块只是可执行代码。 磁盘上的预加载器是自定义的。
当然,您不能只使用磁盘上的GRUB来加载不受信任的代码。 必须修改链加载程序模块,以便GRUB不使用UEFI LoadImage / StartImage函数,而是将.efi文件自动加载到内存中,执行重定位,找到入口点并跳转到该文件。 幸运的是,几乎所有必需的代码都存在于
Red Hat GRUB安全启动存储库中 ,这是唯一的问题—缺少
PE标头解析器。 通过专用协议对功能调用的响应,GRUB从填充程序中获取了已解析的标头。 通过将适当的代码从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 Bootloader签名证书不会存在很长时间,并且将被添加到
全局UEFI证书吊销列表中 ,该
列表将通过Windows Update安装在运行Windows 10的计算机上,从而破坏Kaspersky Rescue Disk 18和Silent UEFIinSecureBoot Disk。 让我们看看这会发生多久。
超级UEFIinSecureBoot磁盘下载:
https :
//github.com/ValdikSS/Super-UEFIinSecureBoot-Disk静默UEFIinSecureBoot磁盘下载(
ZeroNet Git Center网络):
http :
//127.0.0.1 :43110/1KVD7PxZVke1iq4DKb4LNwuiHS4UzEAdAv/
关于ZeroNetZeroNet是用于分散式分布式动态网站和服务的功能非常强大的系统。 用户遵循BitTorrent原理开始访问后就开始下载和播种网站数据。 但是与其他类似的系统不同,ZeroNet允许创建带有评论,论坛,视频托管,Wiki网站,聊天,电子邮件和git的成熟博客。
ZeroNet将网站数据从网站代码中分离出来:数据存储在.json文件中,并按照定义的方案组合到sqlite数据库中,从而实现了令人难以置信的功能:以毫秒为单位在所有打开的网站中进行本地搜索,全站实类似于RSS的实时更新流。
ZeroNet提供类似于OAuth,NAT和Tor支持的标准化身份验证系统。
该系统运行速度非常快,易于使用,具有现代化的用户界面,具有小巧但方便的功能,例如所有站点的全球夜/日主题切换。
我相信ZeroNet被低估了,并且有意将磁盘的静默版本仅上传到ZeroNet Git,以吸引新用户。