我目前使用的是联想 ThinkBook 14+ ARA。我发现 BIOS 提供了磁盘锁定方法(主/用户密钥)。设置两个密钥后,需要在 POST 时输入其中一个来解锁我的磁盘。
除了系统暂停之外,一切都运行良好。当操作系统暂停/睡眠(S3)时,它会崩溃并且不会恢复,Windows 11 和 Linux Mint 21.2 都是如此。我已关闭安全启动。
我认为这是因为磁盘断电后会自动锁定,这是操作系统暂停所必需的。但 bios 和操作系统都不会保存解锁磁盘的密钥。结果,操作系统崩溃了。
我想知道是否有任何可能的解决方案来解决这个问题,使硬件加密方法与操作系统暂停兼容
答案1
我没有为您提供解决方案,但(在 Linux 中)您可以采取一些措施来确认发生了什么。
首先,您可以使用 检查密码是否确实是指 ATA 密码hdparm -I /dev/sdX
。如果锁定的系统驱动器是 NVMe 驱动器,您可能需要尝试这而不是。(我既不是作者,也不是作者的附属品;我不能保证它在任何方面都是安全的;它只是我在 Google 上随机搜索“nvme ata security”的结果。)
您应该能够看到 ATA 安全功能集/用户密码是否已启用以及相应的提及程序。如果是,则它们指的是 ATA 密码。
(根据设计,驱动器始终设置有主密码,并且 ATA/ACS 规范(PDF)没有定义禁用它的方法。它还在 disable password 命令的描述中明确指出,它只能用于禁用用户密码。因此,主密码与安全设置是否启用无关。如果您的 BIOS/UEFI 显示主密码的“状态”,则它要么是指其自己的密码存储,要么是对其当前“功能”(某种“安全级别”)的解释。阅读规范以了解主密码的实际工作原理——它并不像许多人直观认为的那样“主”。)
然后,您可以通过启动 Linux Live USB 等进一步确认从 S3 唤醒时驱动器是否重新锁定。 提到的程序也应该允许您检查锁定状态(请注意,这与上面提到的启用状态不同)。
(我假设无论启动顺序如何,您都会被要求输入密码来解锁驱动器。如果不是这种情况,您也可以在暂停/恢复之前先尝试使用该程序解锁它,然后再次检查锁定状态。)
不过,我不太确定您是否可以自己实现“唤醒时解锁”,因为即使它hdparm
是相当“独立”的,您也可以简单地将可执行文件复制到 tmpfs 或 USB 驱动器上的文件系统。但是,由于 libc 和链接器等其他所有内容都不再可访问,除非您可以通过某种方式(可能是静态构建?)解决这个问题并让 systemd 在恢复时运行该程序,否则我不知道该怎么做。(此外,您可能需要先使用该程序更改主密码,因为 BIOS 可能已将密码设置为您输入的某个哈希值。)这可能意味着您需要将密码“作为数据”存储在驱动器上。
另一种方法显然是看看您是否可以配置 BIOS,以便它不会关闭 S3 的驱动器。虽然我不知道这在技术上是否可行,但显然您可以检查是否有可用的设置选项。仅供参考,您可能需要研究/考虑这种配置是否会导致安全漏洞(您关心的)。
附注:ATA 安全功能集/密码并不一定意味着加密。(即使没有密码,后台也可能有加密工作。)加密是指数据以密文形式存储在驱动器上,而驱动器密码/锁仅表示在解锁之前禁止通过驱动器固件进行访问。数据仍然可以以纯文本形式存储。(据我所知,在这种情况下,您只能通过阅读和相信驱动器的手册/白皮书来判断是否也存在加密,或者“直接”检查扇区/闪存,即不涉及固件/控制器。)
编辑:上面链接的 Rust 程序似乎有烂(Rust 代码中很常见?)。幸运的是,它不太难使用nvme-cli(可能可以从您的发行版的存储库(如 hdparm)获得)来查找相关信息。(但是,如果可能的话,使用它来解锁驱动器会更困难。)请注意,我对以下命令不提供任何形式的担保或保证。
$ sudo nvme security-recv /dev/nvme0 --secp=0 --spsp=0 --nssf=0 --size=16 --al=16
NVME Security Receive Command Success
0 1 2 3 4 5 6 7 8 9 a b c d e f
0000: 00 00 00 00 00 00 00 04 00 01 02 ef 00 00 00 00 "................"
$ sudo nvme security-recv /dev/nvme1 --secp=0 --spsp=0 --nssf=0 --size=16 --al=16
NVME Security Receive Command Success
0 1 2 3 4 5 6 7 8 9 a b c d e f
0000: 00 00 00 00 00 00 00 02 00 ef 00 00 00 00 00 00 "................"
上述命令可用于查找驱动器支持的“安全协议”。如果您看到ef
后字节7
(例如字节9
或b
如上所述),这意味着它实现了与 ATA 安全功能集类似/等效的功能。(它似乎比我想象的要常见得多。)
$ sudo nvme security-recv /dev/nvme0 --secp=0xef --spsp=0 --nssf=0 --size=16 --al=16
NVME Security Receive Command Success
0 1 2 3 4 5 6 7 8 9 a b c d e f
0000: 00 0e 00 01 00 01 ff fe 00 29 00 00 00 00 00 00 ".........)......"
$ sudo nvme security-recv /dev/nvme1 --secp=0xef --spsp=0 --nssf=0 --size=16 --al=16
NVME Security Receive Command Success
0 1 2 3 4 5 6 7 8 9 a b c d e f
0000: 00 0e 00 01 00 01 ff fe 00 29 00 00 00 00 00 00 ".........)......"
上述内容可用于查看是否设置了 ATA 用户密码以及驱动器是否处于锁定状态。如果字节9
(面具(使用0x2
进行掩码处理)为 1。(0x2
掩码后返回),如果同一字节的“位 2”(使用 进行掩码处理0x4
)为 1(0x4
掩码后返回),则驱动器被锁定。(如果“位 0”不是1
,即字节为0
,或者不太可能为偶数,则驱动器可能实际上未实现该功能集。)
$ echo $((0x29 & 0x2))
0
$ echo $((0x29 & 0x4))
0
如您所见,我的驱动器实现了功能集,但没有设置用户密码并且未被锁定。