我知道您可以通过检查 /proc/cmdline 来推断当前正在运行的内核映像,并假设它与 /boot 挂载点上的内核映像相同。但这并不能保证。
那么有没有办法确切地知道哪个分区上有哪个映像呢?
映像文件是否可供 initramfs 在众所周知的路径中检查?
答案1
将内核映像获取到系统 RAM 是引导加载程序的工作;只有引导加载程序才能确定内核映像的来源。如果系统是从网络引导的,则内核映像可能根本不作为系统上的文件存在。
报告的版本号和编译时间戳uname -a
可能有助于识别内核映像文件。可以使用以下命令从内核映像文件中读取相同的信息file
:
$ uname -a
Linux hostname 4.9.80-atom #1 SMP Mon Feb 5 13:26:54 EET 2018 x86_64 GNU/Linux
$ file /boot/vmlinuz-4.9.80-atom
/boot/vmlinuz-4.9.80-atom: Linux kernel x86 boot executable bzImage, version 4.9.80-atom (user@hostname) #1 SMP Mon Feb 5 13:26:54 EET 2018, RO-rootFS, swap_dev 0x3, Normal VGA
在 UEFI 系统上,您可以查看 UEFI 引导变量BootCurrent
以了解选择了哪个 NVRAM 引导选项。但这并不是很有力的证据,因为启动选项可能在启动后被编辑过,如果它指向一个可以提供多个启动选项的启动加载程序,那么无论如何它都会含糊不清。
我所知道的唯一强有力的证据是使用具有 TPM 芯片和 TPM 感知引导加载程序的系统:它将存储最初加载到 TPM 的相应 PCR 寄存器中的内核的加密强哈希。然后,您将能够遵循相同的规则,重新计算哈希并查看它是否匹配;如果没有,则表明有人篡改了内核或 PCR 寄存器值。并且固件总是会用实际使用的引导代码的哈希值填充另一个 PCR 寄存器,因此您也可以看到引导加载程序的任何篡改。
(PCR 寄存器的实现方式使得您不能将它们设置为您选择的值:新值将始终是旧值 + 输入的任何新数据的加密强散列,因此将 PCR 寄存器设置为当它已经具有一些其他非零值时,特定的已知值将非常困难。)
TrustedGRUB 是 GRUB 引导加载程序的 TPM 感知版本。我曾经尝试过[它的旧版本,基于 GRUB Legacy](https://sourceforge.net/p/trustedgrub/wiki/Home/]。目前似乎有一个基于 GRUB 2 的新实现但到目前为止它似乎只支持传统风格的启动。我还没有测试过它,因为可供我测试的所有支持 TPM 的系统现在都是基于 UEFI 的。