此请愿书已发布,要求Linus Torvalds忽略RDRAND,并且不将其作为
/dev/random/
中的熵源。您可以在此处查看Linus的回复。 我的主要问题是,使用RDRAND作为熵的来源(在许多其他因素中)是否会通过增加一些可预测性而损害
/dev/random
的“随机性”?还是他说的对,只要它不是唯一的熵产生源,它真的没有任何区别吗?#1 楼
首先,写入/dev/random
和/或/dev/urandom
与增加内核中维护的熵计数之间是有区别的。这就是为什么默认情况下
/dev/random
是世界可写的-任何原因输入只会增加而不是取代RNG的内部状态;如果您编写完全可预测的数据,则对您没有好处,但也没有害处。如果另一方面,您使用特殊的ioctl写入/ dev / random(这确实需要超级用户特权),则实际上可以增加熵估计。关于
/dev/random
的行为:通常,应该将对/dev/notsorandom
的读取阻塞,直到至少已将熵比特写入内部池之前,而不是将其重新装入熵,而/dev/random
返回所需的“随机性”。)如果您设法将可预测的位写入池中,但告诉内核将其记为不可预测的数据,则/ dev / random的下一个读取器将接收仅确定性地取决于当前内部状态的随机数的熵池,而不是“真正随机”事件,例如磁盘搜索时间和键盘d输入。
但是,除非您能够从操作系统的安装中进行这种攻击,否则您实际上并不知道这种内部状态!从
/dev/urandom
输出进行预测至少与反转SHA-1一样困难(这被认为非常困难)。这也是为什么可以推理的原因,除了在全新安装操作系统之后直接进行检查外,random
对于所有目的(无论是否加密)都可以被视为“足够随机”。现在让我们来在drivers / char / random.c中查看RdRand的实际实现:
曾经使用过可能有害的RdRand指令的唯一位置是在随机设备的输出功能中。它与“经典” Linux RNG的“实际”输出在返回给调用者之前进行异或。
由于信息论告诉我们,当我们对选定字符串与未知字符串进行异或时,我们无法预测转换后结果字符串的外观,颠覆RdRand指令(至少在Linux当前使用它的方式)没有任何好处。
更新:
有人建议,一个非常聪明的CPU可能会将对RdRand的调用解释为后台的触发,例如,将后继的XOR替换为MOV。
从理论上讲,可能,但是比直接偏斜RdRand的输出更难实现,例如通过在仅被对手称为“随机数”的密钥下返回AES-CTR的密钥流。
必须检查内核中使用的特定代码序列;如果这种情况发生了变化(例如,通过使用一些虚拟的XOR操作包围RdRand调用),则必须广泛部署用于适应启发式的微代码更新,否则人们很快就会开始怀疑。
处理RdRand指令(或在不同体系结构上的等效指令)作为另一个熵输入(为了安全起见,不增加估计的熵),可能会使RNG更加难以颠覆。
第二次更新:
该问题已在内核邮件列表中进行了两次讨论:一次是在2011年,首先是由英特尔工程师提交的补丁,然后是关于安全性的大量讨论,最后一次是在2012年,最终导致了实施当前补丁的补丁方法。甚至已经提到过有关触发后门改变某些指令(例如XOR或MOV)行为的担忧。就XOR构造而言:Linux专家声称,XOR方法应该比将RdRand输出散列到熵池中更安全,尽管我们当中有些人对此并没有真正的说服力。
评论
$ \ begingroup $
Dale Emmons在这里提出的观点change.org/en-GB/petitions/…是,在已经收集并处理了其他熵之后,获取了硬件随机位。这意味着人们可能会质疑这样一种说法,即所选择的字符串确实与未知字符串进行了XOR运算。
$ \ endgroup $
–亨里克·赫尔斯特伦
2013年9月10日下午16:55
$ \ begingroup $
@MichaelAquilina它不会增加熵,而只会增加熵池的“估计熵”。因此,估计的熵变得高于实际的熵。
$ \ endgroup $
–PaŭloEbermann
2013年9月10日18:02
$ \ begingroup $
我在更新后的答案中没有得到的一件事是:(在代码更改的情况下)“为了适应启发式技术的微代码更新必须被广泛部署,否则人们很快就会变得可疑”。如果为random.c编译的代码发生变化,并且不再触发XOR,则RNG输出将从操纵状态变为正常状态(除非进行某些假设的微代码更新,否则XOR发生在微代码中;否则,将永远存在),我看不到除了那些试图利用索具的人以外,其他人怎么会注意到。注意:在我容易受到威胁的优先排序列表中,RdRand(和XOR)操纵非常低。
$ \ endgroup $
–fgrieu♦
2013年9月11日下午6:54
$ \ begingroup $
考虑一个(高度假设的)硬件/微代码后门,该后门具有一种启发式方法来检测与此类似的代码。当它猜测正在运行的代码需要(X xor RdRand)时,它将RdRand修改为输出(X xor Rigged);否则将使RdRand输出已触发。固定后,其种子将是在物理加电时选择的64位随机数,否则将是确定性CSPRNG。当试探法工作时,这是可以利用的,但是即使当试探法因代码更改而失败时,也需要$ 2 ^ {32} $的加电周期来检测。
$ \ endgroup $
–fgrieu♦
2013年9月11日18:36
$ \ begingroup $
至于最后一段,他们或多或少说XOR更安全,因为它易于实现(以前的实现有bug)。我认为这不是一个非常有力的论据。
$ \ endgroup $
–马腾·博德威斯♦
2013年9月17日上午10:34
#2 楼
是的,它可以:请参见http://people.umass.edu/gbecker/BeckerChes13.pdf [已存档],以了解如何在没有裸露金属的情况下通过光学显微镜对其进行后门检测。通常,将Intel RDRAND输出添加到不是唯一熵源的池中通常是安全的(如果不能控制输出,则始终是安全的)。目前,这就是针对Linux的讨论。
作为用户空间应用程序,您永远不要直接使用RDRAND,至少不要混用,例如来自
/dev/urandom
或类似内容的流密码的输出。评论
$ \ begingroup $
非常有用的参考!
$ \ endgroup $
–fgrieu♦
2014年4月11日在12:14
$ \ begingroup $
提供的链接已死,您是否有更新的链接?
$ \ endgroup $
– Squareskittles
20年5月20日15:09
$ \ begingroup $
我想我找到了一个有效的链接:emsec.ruhr-uni-bochum.de/media/crypto/veroeffentlichungen/2014/…
$ \ endgroup $
– Squareskittles
20年5月20日15:25
$ \ begingroup $
@squareskittles谢谢,已修复
$ \ endgroup $
– mirabilos
20年5月20日在16:51
#3 楼
我认为操纵xor指令和其他指令可能不会像lxgr所建议的那样困难。如果我是硬件设计师,该怎么办: />在RDRAND的输出寄存器中添加一个额外的位。该位表示类似“不可观察”。在用户“打开盒子”之前,寄存器中可能没有任何东西。 (想想薛定'的猫:-))
更新XOR,ADD,可能还有其他指令来检查是否观察到该值。如果不是,请根据需要进行更改。
该解决方案的成本将是在十亿个晶体管芯片中增加30个左右的晶体管。
如果使用RDRAND输出,可能会一个好的想法是将输出稍微移动一点并进行一些计算,以便“它的波动函数会崩溃”,然后使用它
#4 楼
将RDRAND的输出混合到/ dev / random输出缓冲区的方式 linux drivers/char/random.c, extract_buf()
/* ... compute a hash.l[i] PRNG ... */
/*
* If we have a architectural hardware random number
* generator, mix that in, too.
*/
for (i = 0; i < LONGS(EXTRACT_SIZE); i++) {
unsigned long v;
if (!arch_get_random_long(&v))
break;
hash.l[i] ^= v;
}
/* ... pass hash.l to userspace ... */
似乎容易受到基于微代码的欺骗的影响,从而抑制了XOR混合,而替代了易受攻击的数据。我们永远不会知道它的存在,因为微代码是开源的,并且只要英特尔愿意就可以更新。
更新:另请参见http://www.metzdowd.com/pipermail/cryptography/2013年12月/ 019065.html
评论
$ \ begingroup $
(此更新删除了XOR)
$ \ endgroup $
– David天宇黄
19年9月2日,9:10
$ \ begingroup $
...通过将其替换为作业。这似乎也容易受到相同类型的攻击,只是更明显地如此。
$ \ endgroup $
– fche
19年9月3日在12:07
#5 楼
XOR B可以以((NOT A)AND B)或(A和(NOT B))的多个指令来复制。这可以用来验证XOR的结果,并且可以放心地确定,有目标的后门程序将越来越难以在多条指令上实现。评论
$ \ begingroup $
仅当您继续访问B时(在这种情况下您没有)吗?
$ \ endgroup $
–密码学家
14年4月10日在16:58
$ \ begingroup $
“……以一定的信心验证XOR的结果……” –基于什么?我真的不清楚您如何实际“验证”随机性(不引入其他安全性问题)。另外,您还必须假定可以修改后门以适应此类验证尝试,这实际上会使您获得的置信度无效。事实是,您无法通过在主动依赖该CPU的系统上运行某些验证功能来验证CPU中的任何后门隐藏功能……这可能只会影响验证功能的返回结果并影响您的工作。
$ \ endgroup $
– e-sushi
2014年4月10日在20:03
评论
如果PRNG不起作用,则不会在攻击者控制的输入中混入任何安全问题。但我同意Dale Emmon的评论,即应通过散列将其混入,而不应异化为输出。
如果CPU完全被破坏(以某种方式RdRand会“知道”对其进行异或操作的值),为什么要假设只有RdRand指令是恶意的? CPU不能简单地试探性地检测get_random_bytes函数并将其返回值静默更改为所需的值吗?
真正令人烦恼的是,我们有一个高性能的真实随机数源,Linux读取它的方式对熵消耗模块完全没有帮助。当然,不应该使用它,但遗憾的是,它也没有在较小的剂量下与熵核算相混合。毕竟,当您在intel上运行操作系统时,无论如何都必须信任intel。
我一直想知道为什么人们不信任英特尔在没有后门的情况下实施RDRAND,但是非常高兴能够以其他方式信任英特尔。毕竟,如果英特尔愿意妥协其芯片,他们可以设计CPU以错误执行安全性的方式误执行指令(例如Linux PRNG中的指令)。