如果您从 RAM 中提取证书/私钥,您将如何知道它?或者你会吗?

信息安全 密码学 证书 心血来潮
2021-08-11 17:11:59

当然,与心脏出血漏洞有关,我一直在阅读有关此攻击的最坏情况是提取 SSL 私钥的新闻,因为当然,这将允许攻击者解密所有流量到和来自受感染的服务器,包括[可能,取决于前向保密]任何被捕获并存储在某处的流量。

这让我想到,假设最坏的情况,您的 Heartbleed 易受攻击的服务器回显了包含您的私钥的内存......攻击者如何能够将它与其他内存内容或未初始化的内存区分开来,或者你有什么?关键数据本身是否有页眉/页脚或说明模式?我知道一些 RSA 密钥形式 (PEM/base64) 在文件 (-----BEGIN FOO BAR KEY----------END FOO BAR KEY-----) 中有页眉/页脚,尽管我无法想象将这些字符串加载到内存中。是否可以通过使用指向它的指针来识别某些东西而放弃它?

这似乎不是你可以蛮力的东西(尝试每个 X 位的内存内容组合与 64 KB 的内存似乎会产生天文数字般的大量排列)。

那么,它是怎么做的呢?内存中的加密密钥如何被识别为加密密钥?在一个相关问题中,对称加密密钥的答案是不同还是相同?(例如,您可能会通过对使用全盘加密的系统进行冷启动攻击来提取数据。)

3个回答

是的。大多数私钥具有易于识别的格式。

如果说使用 openssl 生成的 RSA 私钥,它们具有特定的格式,例如,将始终以相同的三个字节开头,具体取决于密钥大小:

30 82 01 (for 768 bit key or MIIB in base64)
30 82 02 (for 1024 bit key or MIIC in base64),
30 82 04 (for 2048 bit key or MIIE in base64),  
30 82 09 (for 4096 bit key or MIIJ in base64).

还有一些其他类型的格式也可以存储私钥。

您可以使用 openssl 使用以下命令自行测试:openssl genrsa 1024(1024 表示 1024 位密钥,以查看其 base64 表示形式的密钥。)

有关格式的更多文档,请参阅此 StackOverflow 答案:我在哪里可以找到有关 RSA 公钥格式的一些文档?

作为 jimbob 博士回答的附录:
有一些实用程序可以寻找这些模式并尝试以这种方式提取密钥。

免责声明:我没有尝试过任何这些实用程序。这篇文章只是用户“void-star”在 HN 上发布的链接的一个更好的版本。(见下文。)

进一步阅读

作为 StackzOfZtuff 和 jimbob 博士的答案的(另一个)附录

阿迪沙米尔等人。论文 使用存储的密钥玩捉迷藏与寻找标题采用了非常不同的方法

Shamir 方法依赖于比较完整内存字符串中的数据块(即,将内存/磁盘的全部内容转储为字符串)并查看它们在数学上是否与先前已知的公钥相关。

为了找到不存在先前已知公钥的密钥,进行了检查以检查数据的熵。

由于我们知道关键数据比非关键数据的熵更大,因此定位关键数据的一种方法是将数据分成小部分,测量每个部分的熵并显示熵特别高的位置

因为密钥是有意随机的,所以这些数据在非随机数据的背景下显得尤为突出。这种攻击的优点是可以定位任何加密密钥。

除了 RSA 方案之外,我们的技术似乎适用于各种其他公钥方案。

正如 jimbob 博士指出的那样,Tobias Klein 采取了寻找头球的方法

下面显示了此 ASN.1 语法的十六进制表示:
30 82 ?? ?? - 序列 (30 82),序列的长度 (?? ??)
30 82 ?? ?? - 序列 (30 82), 序列的长度 (?? ??)

由于所有证书都应以这种语法表示,因此我们有一个要搜索的模式。

使用全盘加密,您将不再能够在磁盘上搜索随机数据,因为一切都是随机的。您也将无法再搜索标头,因为它们将被加密。

但是,一旦机器启动,就可以通过这些技术中的任何一种直接从内存中读取密钥。这对于虚拟机来说更容易(请参阅我的答案