从 initramfs 运行时使用命令 (dd if=/dev/mmcblk0p1 | sha1sum)

从 initramfs 运行时使用命令 (dd if=/dev/mmcblk0p1 | sha1sum)

我有一个开源的隔离树莓派项目,可以在以下链接中看到:www.privatekeyvault.com

我提供了一种安装 LUKS 全盘加密的方法,如下所示:https://github.com/johnshearing/PrivateKeyVault#setup-luks-full-disk-encryption

我正在尝试减轻中间女仆攻击,解释如下:https://github.com/johnshearing/PrivateKeyVault#preventing-the-evil-maid-or-maid-in-the-middle-attack

令人担忧的是,有人可能会在启动分区上安装恶意软件键盘记录器,并在登录加密分区时收集密码,同时仍在运行 initramfs

登录到加密分区后,我可以运行以下命令来查看启动分区的 sha1sum: dd if=/dev/mmcblk0p1 |沙1苏姆

我将其与之前记录的 sha1sum 进行比较,看看启动分区是否已更改。它永远不应该改变。

我想在登录加密分区之前获取启动分区的 sha1sum。换句话说,在提供我的密码之前。这是当我仍在 initramfs 下运行时。我知道这是愚蠢的,因为安装键盘记录器的任何人也可能安装错误的 sha1sum 程序,因此最好在登录到无法更改 sha1sum 程序的加密分区后运行 sha1sum 命令。不过,我很好奇是否可以做到。

挑战在于,运行命令 (df) 时,/dev/mmcblk0p1 不会显示,因此我的命令 (dd if=/dev/mmcblk0p1 | sha1sum) 将不起作用。

有什么想法如何在 initramfs 中引用启动分区吗?

另外,关于如何在登录加密分区之前检查是否有人篡改启动分区的任何其他想法?

答案1

我不会回答你名义上的问题,因为要回答的信息太少了。没有什么特殊原因需要以不同于 initramfs 的方式引用引导分区。如果正常名称不起作用,则意味着 initramfs 正在使用不同的路径,或者在运行此命令时尚未加载驱动程序。如果您想获得这方面的帮助,您必须详细解释如何构建 initramfs 以及在何处添加此命令。

我将其发布为答案,而不是作为评论来告诉您不要打扰。

你想要做的事情基本上是不可能的。如果攻击者可以更改您的启动分区,他们只需更改 initramfs 即可删除此检查。

从加密分区进行检查并没有好多少,但实际上攻击起来稍微困难一些。对手必须要么设置一个模拟环境(技术上可行,但很难以您不会注意到的方式做到),要么在加载主操作系统之前将启动分区恢复到预期状态(可能,但攻击者只能这样做)获得一枪)。

如果您不能完全信任您的引导加载程序,则无法防范邪恶女仆攻击。如果有一个不受信任的步骤,则该步骤之后的所有内容都是不受信任的。防止邪恶女仆攻击的唯一方法是拥有完整的安全启动链,其中每一步都会验证下一步。如果下一步不真实,则每个步骤必须停止启动(如果您担心降级攻击,则必须保持最新状态),或者必须记录下一步的状态,然后将其发送给第三方值得信赖的验证者。如果这条信任链存在缺口,那么您就无法知道后续步骤报告的数据是否真实。

这在 Raspberry Pi 上是不可能做到的,因为 ROM 不会验证它加载的内容。除非您愿意使用不同的硬件,否则您无法不信任您的启动分区。不幸的是,我没有建议:市场不适合 Arm 平台上的爱好者项目的可信启动。

顺便说一句,即使您的命令有效,它也有一些缺陷。

  • dd if=/dev/mmcblk0p1 | sha1sum是相同的sha1sum </dev/mmcblk0p1。除了 和 之外没有任何参数ifof只需dd将其输入复制到其输出。当心使用某些参数,dd实际上会损坏数据dd除非您确实需要并且确定您使用它的方式不会带来损坏的风险,否则请勿使用。
  • SHA-1 是破碎的。它并不适用于所有用例,并且在您的情况下很难利用(有人必须安排将一些精心设计的无害内容植入合法的启动分区),但在新的启动分区中使用 SHA-1 是不负责任的。设计。使用sha256sum

相关内容