一. 概述
几十年来,个人电脑一直受到病毒、蠕虫和其他恶意软件的困扰。最早的一些个人电脑病毒是以引导扇区病毒的形式传播的:它们以代码形式存在于软盘的引导扇区中,当用户使用受感染的 DOS 软盘启动计算机时,病毒就会从一台计算机传播到另一台计算机。虽然随着软盘的淘汰和互联网连接的普及,其他病毒传播方式也逐渐受到重视,但预启动的恶意软件对系统安全仍造成巨大威胁。通过在操作系统内核获得计算机控制权之前执行,恶意软件可以 "隐藏 "起来,从而使病毒扫描程序几乎无法检测到恶意软件。
BIOS 几乎无法防止启动前恶意软件的感染;在 BIOS 启动路径中,操作系统默认信任作为启动加载程序执行的任何程序。不过,安全启动旨在为预启动过程添加一层保护。激活安全启动后,固件会检查执行的任何 EFI 程序是否存在加密签名。如果加密签名不存在、与计算机 NVRAM 中的密钥不一致或被列入 NVRAM 的黑名单,固件就会拒绝执行该程序。当然,这只是整个过程的开始;一个可信的 EFI 引导加载器必须以安全的方式继续引导过程,最终实现一个本身安全的操作系统。
“安全启动”是 2012 年出现的 Windows 8 预装电脑里的 UEFI 功能。目前所有的 Ubuntu 64位(非32位)版本支持此功能。简而言之,安全启动工作原理是在固件中启用信任源机制。这篇文章将以Ubuntu 为例,对Linux启动过程进行一个高层次的介绍,然后将继续探讨 SecureBoot 在启动过程中的作用。这篇文章的目的是让读者熟悉一些基本概念,包括:shim、EFI变量和MOK。
了解Linux的启动过程和 SecureBoot 非常重要,因为如果不充分了解 Linux 系统的内部运作,在尝试启用 SecureBoot 等设置时就很容易意外损坏系统,甚至会引发一系列的安全问题。
二. 传统启动过程与安全启动
BIOS/UEFI阶段--主板上的固件,通常以只读存储器 (ROM) 的形式存储,包含用于初始化计算机硬件组件和获取引导程序(bootloader)代码的代码。 Bootloader阶段--将操作系统和initrd一起加载到内存中。 内核阶段--内核在 initrd 文件系统内执行 init 脚本。这将加载硬件驱动程序并挂载根分区。 系统启动--操作系统加载系统守护进程和服务、设置网络、挂载文件系统、启动系统日志并执行其他初始化任务
安全启动是一项安全标准。当电脑开机时,安全启动程序会从主板中的固件开始,检查每个启动文件的加密签名。这包括 UEFI 固件驱动程序(又称可选 ROM)、EFI 应用程序和操作系统。一旦通过验证,电脑就会启动,固件将控制权交给操作系统。
三. 安全启动必知的几个概念
3.1
Shim
在启用安全启动时,了解 shim 非常重要。就 SecureBoot 而言,"shim "是一种预引导程序( pre-bootloader),旨在与SecureBoot固件配合使用。当Bootloader和内核模块未包含在SecureBoot数据库中,shim提供了一种机制去加载它们。在 Ubuntu 中,pre-bootloader已预先安装并由微软签名。
安全启动使用非对称加密技术。密钥对可由用户生成,私钥用于签署所有允许运行的程序,包括 GRUB。UEFI 的固件将使用公钥来验证签名,只有签名验证通过才允许程序运行。可以使用sbverify 命令来检查自己的 shim 加载器的签名。
图1. Shim签名验证
3.2
UEFI变量
UEFI变量存储在固件的非易失性 RAM(NV-RAM)中。这些变量存储各种数据,如启动顺序首选项、超时值、网络设置、存储设备详细信息和安全启动设置。每个 UEFI 变量在/sys/firmware/efi/efivars/ 下都有自己的二进制文件。这些文件的命名规则是变量名后跟供应商 GUID。例如,SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8cm可用于存储安全启动是启用(0x01)还是禁用(0x00)。可以通过列出/sys/firmware/efi/efivars/ 的内容或使用 efivarfs 工具列出并读取值来查看其中一些变量。
图2. UEFI
3.3
Secure Boot数据库
3.3
Machine Owner Keys (MOKs)
3.4
BootLoader配置和信息
/proc/cmdline 文件包含启动过程中传递给内核的内核启动命令行参数。
图4. 启动参数
该命令将输出bootloader通过 BOOT_IMAGE 加载的内核映像文件的路径。
BOOT_IMAGE是操作系统核心的二进制文件。它包含启动系统、管理内存、处理输入/输出操作和执行用户程序所需的代码和数据结构。bootloader可使用它们来启动操作系统。BOOT_IMAGE的名称通常代表其版本和架构。
bootloader包含自己的文件系统驱动程序(initramfs),可以通过查看/boot/initrd*文件。在 initramfs 中,early 和 early2 指的是initramfs的第一和第二阶段。在第一阶段,加载初始化硬件和挂载真实根文件系统所需的最小驱动程序和工具。在第二阶段,early2 会加载完全initramfs所需的其他驱动程序和工具。
initramfs 的主文件夹包含实际的根文件系统映像,以及启动过程中可能需要的其他工具或驱动程序。挂载根文件系统后,系统就可以继续加载运行操作系统所需的常规服务和守护进程。
图5. initramfs文件结构
可以使用 modinfo 命令检查哪些模块有数字签名,内核的签名将显示为一长串十六进制值,中间用冒号隔开。
图6. 内核模块签名
四. 结论
本公众号原创文章仅代表作者观点,不代表绿盟科技立场。所有原创内容版权均属绿盟科技研究通讯。未经授权,严禁任何媒体以及微信公众号复制、转载、摘编或以其他方式使用,转载须注明来自绿盟科技研究通讯并附上本文链接。
关于我们
绿盟科技研究通讯由绿盟科技创新研究院负责运营,绿盟科技创新研究院是绿盟科技的前沿技术研究部门,包括星云实验室、天枢实验室和孵化中心。团队成员由来自清华、北大、哈工大、中科院、北邮等多所重点院校的博士和硕士组成。
绿盟科技创新研究院作为“中关村科技园区海淀园博士后工作站分站”的重要培养单位之一,与清华大学进行博士后联合培养,科研成果已涵盖各类国家课题项目、国家专利、国家标准、高水平学术论文、出版专业书籍等。
我们持续探索信息安全领域的前沿学术方向,从实践出发,结合公司资源和先进技术,实现概念级的原型系统,进而交付产品线孵化产品并创造巨大的经济价值。
长按上方二维码,即可关注我
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...