我正在使用带有 shim 和 grub2 的默认 ubuntu 方法,结合我自己的平台密钥(带有 sbsign 的自签名 shim)和加密的根分区,以安全启动我的 ubuntu 安装。但这仅验证 grubx64.efi 和内核,而不能保护未加密启动分区上的 initrd.img 和 grub.cfg 文件免受恶意修改。
那么如何在使用它们启动之前验证 initrd 和 grub 配置,可能使用 sha256 哈希?该验证可以在 shim、grub 或我可能使用的其他工具中进行,以补充或代替 shim 和/或 grub。
这个问题的目的是为了防止在修改后的环境(内核命令行和initrd)下执行内核,以防止将根分区加密密码泄露到任何地方。
尽管阅读了有关安全启动的网络教程/博客(包括 Ubuntu 和 Linux 基金会的 PreLoader.efi),但没有找到任何方法来验证启动配置,所有这些都解释了包括内核模块在内的可执行文件的验证如何工作,但没有其中提到了 grub.cfg 和(其中的 shell 脚本和配置文件)initrd,所以看起来我是第一个在启动过程中要求验证非二进制文件的人。我找到的最好的资源是Rod Smith 的资源。
我还没有尝试的是修改 shim 或 grub 的源代码,创建一个 fork,或者直接为它们做贡献。那会是唯一的出路吗?
似乎每个进程都有私有内存映射,既不可读也不可写也不可执行(其标志是“---p”):
grep -- --- /proc/self/maps
7f2bd9bf7000-7f2bd9df6000 ---p 001be000 fc:00 3733 /lib/x86_64-linux-gnu/libc-2.19.so
7f2bd9e04000-7f2bda003000 ---p 00003000 fc:00 3743 /lib/x86_64-linux-gnu/libdl-2.19.so
7f2bda042000-7f2bda241000 ---p 0003d000 fc:00 36067 /lib/x86_64-linux-gnu/libpcre.so.3.13.1
Run Code Online (Sandbox Code Playgroud)
在共享库中返回一些,并为 java (JVM) 进程执行此操作,甚至会返回数十个数百兆字节的匿名映射。
编辑:如果这些映射是占位符,谁将使用这些保留的位置,哪些事件和其他活动受到保护 - 换句话说:如果这些占位符不存在,可能会发生什么错误行为?
第二次编辑:鉴于共享库中的这些漏洞实际上有助于编译器和/或动态链接器的某些目的,因此在 JVM 进程中可见的匿名映射中的这些漏洞必须有其他目的。按大小对 tomcat JVM 进程的匿名映射进行排序:
20 MB 00007FA0AAB52000-00007FA0AC000000 ---p 00000000 00:00 0
41 MB 00007FA0B1603000-00007FA0B4000000 ---p 00000000 00:00 0
50 MB 00007FA090D04000-00007FA094000000 ---p 00000000 00:00 0
53 MB 00007FA0F8A40000-00007FA0FC000000 ---p 00000000 00:00 0
61 MB 00007FA0C42C5000-00007FA0C8000000 ---p 00000000 00:00 0
61 MB 00007FA0CC29A000-00007FA0D0000000 ---p 00000000 00:00 0
61 MB …
Run Code Online (Sandbox Code Playgroud) apt-get install chromium
在 Debian 12 上运行后,
ps alx | grep -e ^F -e ^5.*chromium
返回:
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
5 1000 3452315 3452313 20 0 33884428 16712 do_sys S ? 0:00 /usr/lib/chromium/chromium --type=zygote --crashpad-handler-pid=3452306 --enable-crash-reporter=,built on Debian 12.4, running on Debian 12.4 --change-stack-guard-on-fork=enable
Run Code Online (Sandbox Code Playgroud)
此命令在 LUbuntu 18 之后执行(在其 中apt-get install chromium-browser
执行):
snap install chromium
/var/lib/dpkg/info/chromium-browser.preinst
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
5 …
Run Code Online (Sandbox Code Playgroud)