一种在启动时自动解密系统驱动器的简单方法:
clevis luks bind -d /dev/yourdrive tpm2 '{"pcr_ids":"4,5"}'
systemctl enable clevis-luks-askpass.path
当我在同一台机器上启动另一个操作系统时,tpm2_pcrread列出了除4和5以外的大多数相同的聚合酶链反应值。我知道PCR4是MBR和分区数据的散列,PCR5是由MBR中的代码生成的。此外,这是一个EFI系统。如果攻击者复制整个磁盘,他能通过散列窃取的MBR和分区数据来生成PCR4值吗?
更新:如果在Linux中使用google实现加密系统卷的自动解锁,您可能会发现上面的简单命令,但它们并不十分安全。基于CBHacking的回答,攻击者可以读出或计算作为磁盘加密密钥的PCR值。一些其他的,更长的指南解释如何上传您的密钥到TPM和使用TPM密封保护它。
Update2:我为Arch-ish发行版制作了一个用户友好的脚本,使用TPM2密封设置自动解锁,这样更安全。https://github.com/archee565/Bytelocker
发布于 2021-03-24 05:16:51
虽然我不知道LUKS的具体细节,但TPM通常用于磁盘加密的方式是,密钥(通常用于解密或“解开”主加密密钥)存储在TPM中,并“密封”到特定PCRs中的特定值。TPMs允许您指定何时解封密钥的策略;在这种情况下,策略将是“除非PCR0-5(或更多)<它们当前的values>”,否则策略不会打开密钥。
这意味着攻击者不能简单地找出预期的散列,然后使用它们解密驱动器,因为这些值本身是无用的。他们实际上需要在PCRs中才能满足解封政策的要求。您也不能直接写入PCR或重置它们(除非系统启动)。您必须找出正确的输入,才能将PCR从它所期望的值取到它所期望的值。假设PCRs使用的哈希算法对碰撞和预图像具有很强的抵抗能力,这是不可行的。
当然,如果您可以控制从引导到PCRs的散列(“扩展”),那么您可以让它们得到您想要的任何值。防止这种情况是CRTM (信任度量的核心根)的职责,CRTM是由硬件执行的代码(由芯片组供应商提供)生成的,它运行在其他任何东西之前。此代码在执行系统之前测量系统的固件(BIOS),将所有要执行的代码扩展到PCR0中,将固件配置数据扩展到PCR1中。固件本身测量后续要执行的代码,并将其扩展到合适的PCRs中.
因为CRTM使用的代码是芯片组的一部分--甚至可能是CPU的一部分--攻击者无法用固件的测量来替换它。因为固件是被测量的,所以攻击者不能用关于引导元数据等的度量来替换它,这意味着引导元数据不能被关于引导加载程序的度量的东西替换,等等。CRTM是信任链的根(顾名思义);只要CRTM是您所期望的(或者TPM的解封功能,根据策略),您就可以确保后续的每一组PCRs都被合法地扩展,并且它们的值反映了运行的代码的真正哈希。因此,如果它们也是预期值,则可以确保引导代码没有被修改,例如启动另一个操作系统,该操作系统将打开磁盘加密密钥,然后让您在没有有效登录密码的情况下读取磁盘。
因此,攻击者不仅不能使用计算出来的PCR4值正确地解密磁盘,而且他们甚至不能将其放入PCR4中--除非在较低的PCRs中有错误的值--因为将所需的值序列扩展到PCR4的代码本身将被扩展到一些较低的PCR4中,而该代码通常不在那里,因此较低的PCR会有一个意外的值,而TPM不会打开密钥。
请注意,您可能需要使用两个以上的PCRs来封存密钥。如果您不使用PCR0,那么修改后的固件就不会被捕获,如果您的主板允许安装任意(或错误)固件,那么整个信任链就会被打破。如果您使用PCR0而不是PCR2,那么将不会检查固件的扩展,而这些扩展可能会覆盖扩展到PCR4和PCR5中的数据。
关于要使用哪些BitLocker的默认策略的示例,请考虑在具有本机UEFI的计算机上使用TPM (搜索“本地UEFI的验证配置文件”)时使用的BitLocker :它检查PCRs 0 (CRTM、固件代码)、2(固件扩展代码)、4(UEFI系统分区的引导管理器代码)和11 (Microsoft的引导代码用于存储BitLocker访问控制)。此列表是可自定义的;例如,如果用户更改任何UEFI/BIOS设置,则要防止打开密钥,还可以检查PCRs 1和3。
https://security.stackexchange.com/questions/246520
复制相似问题