英特尔具有片上RdRand功能,该功能可以绕过/ dev / urandom的常用熵池,并直接注入输出。现在有谣言说英特尔与美国国家安全局(NSA)一起合作...而且知道PRNG对密码学很重要就足以使这一消息传播。这完全是假设:我们假设RdRand确实做到了新闻所说的那样,并且确实将随机性输出到应用程序和库将寻找加密安全随机性的地方。


如果芯片制造商通过了在内核中使用此RdRand指令的人员的测试,它的制造商是否可以预测此PRNG的输出?
如果芯片的制造商可以在一定程度上预测PRNG的输出,该如何做?他们可以使用自己的芯片解密两个系统之间的任何https通信是否可行? (或其他要求随机性的内容,https只是一个例子。)

我问的原因:http://cryptome.org/2013/07/intel-bed-nsa.htm
如上所述,我不相信这里写的所有内容,但是我发现从技术上讨论这种可能性非常有趣。

评论

我删除了所有注释,因为它们与问题的主题或与密码学完全无关。请限制自己对问题的澄清和类似评论。

这个问题似乎离题,因为它与系统的硬件后门有关。可能属于其他地方。

史蒂夫·布兰克(Steve Blank)认为这是可行的,实际上,这听起来好像让他感到惊讶,如果没有后门:steveblank.com/2013/07/15/…

#1 楼


1-当芯片制造商通过了使用此RdRand指令在内核中使用的人员的测试时,芯片制造商可以预测此PRNG的输出有多可行?强流密码的输出是随机的,对于任何不知道密钥的人都是不可预测的。看到这前进的方向吗?仅仅因为看起来随机的东西并不意味着它是随机的。


2-如果芯片制造商可以在一定程度上预测PRNG的输出,那么他们可以解密任何内容都是可行的使用两个系统的芯片之间的https通信? (或其他要求随机性的内容,https只是一个示例。)


如果您可以预测PRNG,则可以基本上预测用于密钥交换的秘密,并由此推断出共享秘密。然后,您可以简单地解密通信。

评论


$ \ begingroup $
我认为,对于硬件专家来说,对RdRand算法进行反向工程以确定它是合法的TRNG还是进行奇怪的操作(例如生成某种密钥流来引入后门程序)并不困难。他们的研究,当然)。就像问题链接中所说的那样,熵池中毒相当难以利用。
$ \ endgroup $
–托马斯
13年7月14日在4:29



$ \ begingroup $
@Thomas我听说Linux在某些地方直接使用RdRand,而不仅仅是将其混入池中。在那种情况下,您不需要毒害熵池。
$ \ endgroup $
– CodesInChaos
13年7月14日在8:53



$ \ begingroup $
嗯,我想我明白了。我当时在想“您如何在知道输出的同时使其看起来随机”,而加密算法无疑是答案。但是,您如何知道PRNG在输出流中的距离呢?好吧,您实际上并不需要这样做,这比破解真正的随机性要快得多(只需重现输出流并测试所有内容)。首先使用芯片的序列号+静态盐作为输入,然后使PRNG的状态在两次重启之间保持不变。那可能完全可行。等待其他答案,但是如果没有添加,我会尽快接受。感谢您的回答!
$ \ endgroup $
–吕克
13年7月14日在13:16



$ \ begingroup $
可以测试吗?有没有办法知道这是真的吗?是否可以编写一些可以在我们的计算机上运行的测试套件,以测试RdRand函数是否有害?
$ \ endgroup $
–notthetup
13年7月14日在15:06

$ \ begingroup $
@notthetup是和否。硬件专家可能有能力打开芯片并研究电路并从中推断出RdRand的功能,但是由于规模小(更不用说昂贵),这很难做到。但是,如果我们假设英特尔确实对RdRand有恶意的目的,并且将其建立在他们知道密钥的密码周围,那么,如果使用的密码很强,我们就无法从测试套件中检测到它。明确设计了一种强密码,使其无法与随机噪声区分开来-实际上,如果将其破解,则被认为是无效的。
$ \ endgroup $
–orlp
13年7月14日在16:51



#2 楼

您是否听说过Dual_EC_DRBG的奇怪故事?政府建议并认可的具有某些非常可疑属性的随机数生成器。
http://www.schneier.com/blog/archives/2007/11/the_strange_sto.html
摘自该文章:

它是这样工作的:标准中有一堆常量-固定数字-用于定义算法的椭圆曲线。这些常数在NIST出版物的附录A中列出,但没有任何地方可以解释它们的来源。一种万能钥匙。如果您知道秘密数字,则可以在仅收集其输出的32个字节之后预测随机数生成器的输出。实际上,您只需要监视一个TLS Internet加密连接即可破解该协议的安全性。如果您知道秘密数字,则可以完全破坏Dual_EC_DRBG的任何实例。

因此简短的答案是肯定的,可以创建一个具有可利用弱点的随机数生成算法,特别是只有算法的创建者才可以利用。

评论


$ \ begingroup $
此攻击使我想起了1990年代对Netscape浏览器的PRNG的攻击:cs.berkeley.edu/~daw/papers/ddj-netscape.html今天,人们更好地了解了安全PRNG的必要性,因此应该更好地测试。但是,所要做的只是间谍和欺骗手段,经过测试后,很弱的算法可能会落入芯片中。除非对生产芯片进行重新测试,否则不会引起注意。这就像一个老笑话:您如何真正知道随机数生成器何时损坏?
$ \ endgroup $
–约翰·迪特斯
13年7月15日在22:03

$ \ begingroup $
同样值得注意的是,类似的方法具有附加的特性,即使是芯片制造商也不一定会知道在哪里引入后门。在他们看来,他们只是使用政府认可的算法,自然会认为它是安全的。
$ \ endgroup $
–约书亚·科登(Joshua Kolden)
13年7月16日在2:10

$ \ begingroup $
Dual_EC_DRBG由于某些弱点而无法利用,只有作者才知道如何利用。事实上,一经发布,人们就得出结论,其设计恰到好处地使窃贼法成为可能。
$ \ endgroup $
–森林
19年1月9日在11:21

#3 楼


1-当芯片制造商通过了使用此RdRand指令在内核中使用的人员的测试时,芯片制造商可以预测此PRNG的输出有多可行?正如夜莺正确指出的那样,任何强大的加密PRNG都会产生通过统计测试的数字流。

但是,制造商有一些约束条件:将在以相同方式设置的多个处理器上执行,因此每个处理器必须产生不同的输出。
任何给定的处理器在每次加电时必须产生不同的输出流。

A一种简单的方案是使用处理器序列号作为PRNG的输入,以确保不同的处理器具有不同的输出,并具有未公开的非易失性寄存器(例如,通电计数器),以确保每次引导均不同。 >
这样的方案可能会抵制仅使用其输出进行任何分析的尝试:具有全局秘密(在所有处理器中通用),处理器ID和加电计数器作为输入的标准加密PRNG。此时,用于观察新用户的大规模监视基础结构将只有几百万个可能的处理器ID以及数百或数千个可能的启动计数的空间。这一切都可以很容易地进行预先计算,因此插入具有当今计算能力的监视基础架构将非常实用。 (一旦确定了用户的处理器ID和启动计数,与每次都进行完整搜索相比,跟踪此信息当然要容易得多。)

但是,很有可能英特尔不会将自己的国际销售押注在另一家不愿意开放其芯片并进行检查的工厂中(例如,ARM将有强烈的动力来识别这种不法行为)。最新消息:但是政府可能会迫使他们在是否符合其商业利益方面放下这样的后门。更新2:他们或他们的晶圆厂也可以使用隐匿的掺杂剂级修饰,以使得即使具有类似Intel功能的人员也很难检测到这些修饰(请参阅第一个案例研究,第3章)。

我不是微处理器硬件方面的专家,所以不能评论那些可能会导致偏差或其他可预测特征而未被发现的技术。一个可能的后门可能是仅在执行诸如验证一组长期根CA之一签名的证书的真实性所需的计算之后,严格限制RdRand的下一个请求输出(也许中国的CNNIC是2)-如果芯片制造商可以在一定程度上预测PRNG的输出,那么他们可以使用自己的系统解密两个系统之间的任何https流量是多么可行。筹码? (或其他要求随机性的内容,https只是一个例子。)可能会破坏系统-这取决于如何使用该输出。例如,如果使用方的应用程序只是将其用作其熵池的另一个可选输入,则能够预测该输入意味着该用户并不比没有RdRand更好,但同样也不会更糟。

CodesInChaos指出,Linux有时直接使用RdRand。英特尔也鼓励直接使用该指令。因此,可以想象将浏览器或其他TLS客户端使用RdRand的输出作为其唯一的熵源是没有道理的。如果是这种情况,那么可以预测RdRand的输出的观察者确实可以损害您的安全性。

如果可以预测到熵输入,包括SSL / TLS,大多数密码系统都会失败。 br />从许多可能的TLS密钥交换选项中选择流行网站使用的几个示例:


我与gmail的TLS连接目前使用临时椭圆曲线Diffie-Hellman(ECDHE ;如果您的浏览器支持,我认为这是Google的默认设置)。如果观察者可以枚举我的浏览器使用的可能的随机数,那么观察者就知道我的秘密密钥$ d $,因此可以通过计算$ x_k = dQ $来计算共享秘密$ x_k $,其中Q是Google服务器的临时公共密钥密钥(如果观察者可以预测Google的密钥,反之亦然)。 $ x_k $用作premaster secret-衍生出所有其他机密的机密,因此获得它会破坏TLS旨在提供的所有保证。
您到Wikipedia的TLS连接使用基于RSA的密钥交换,因为这就是它们所支持的全部(例如,我的当前是TLS_RSA_WITH_RC4_128_SHA)。使用这些密码套件,客户端将使用其随机数生成器生成premaster secret,并将其发送到服务器。能够预测随机数直接为攻击者提供了他们所需的秘密。


评论


$ \ begingroup $
有用的信息,谢谢您的回答!您提到一个非常合理的问题:除了成为与NSA的好伴侣之外,对英特尔有什么影响?仅仅成为好伴侣并不能给他们带来很多利润。但是他们仍然可以说它是安全的加密货币,只要没有人知道初始状态就可以。他们可能只是在企业界摆脱了困境。但是我只是在猜测。
$ \ endgroup $
–吕克
13年7月14日在22:54

$ \ begingroup $
@Luc,您能说“政府合同”吗?当然,我知道您可以。
$ \ endgroup $
–约翰·迪特斯
13年7月15日在22:37

#4 楼

我是Intel RdRand指令后面的随机数生成器的设计者。通过了在内核中使用此RdRand指令的人员的测试?我们不可以。它通过了测试,因为它是由2.5Gbps TRNG源提供的密码安全随机数生成器。如果芯片制造商可以预测PRNG的输出,在某种程度上,他们可以使用自己的芯片解密两个系统之间的任何https通信是否可行? (或其他要求随机性的内容,https只是一个例子。)明文存在于系统中。攻击者将攻击纯文本在系统中所在的位置。例如。在进行链接密码加密/解密的网络堆栈中,或者在密钥建立代码中。这更是传统软件漏洞攻击的领域。无需完成将已知的非随机数注入RNG并尝试确保通过软件的正确位中的正确指令以正确的周期使用它的艰巨任务,从而可以对工程进行反向工程。键。

评论


$ \ begingroup $
只是玩恶魔的提倡者:密码安全的RNG如果没有输入(或当前时间戳+设备序列号等),也会通过相同的测试,不是吗?
$ \ endgroup $
–PaŭloEbermann
2013年9月10日19:19



$ \ begingroup $
@PaŭloEbermann是的。后门RNG就像将非常弱的(例如32位)随机值与主密钥组合在一起一样简单。如果不知道主密钥,则输出似乎完全是随机的,并且是牢不可破的。在掌握了主密钥的情况下,输出的密钥空间仅为$ 2 ^ {32} $。仅在这种情况下,无法基于输出来判断。
$ \ endgroup $
–森林
18/12/4在11:21



#5 楼

我可以通过两种方式查看RNG的煮熟情况。 (根据记录,我完全没有理由怀疑英特尔的这种情况,但我也认为,谨慎的密码设计要求我们考虑一下如果RNG存在缺陷或后门的情况会怎样。)

首先,您的RNG熵不足。这就是多年前使用Netscape RNG的原因,而且显然是Lenstra等人和Henninger等人几年前发现的所有共享主因子的RSA密钥的背后。这就是最近出现在新闻中的台湾智能卡的原因。如果没有足够的熵,那么您将不会获得任何安全性。您可以想像英特尔RNG具有某种缺陷或故意的弱点,在这种情况下,它永远不会获得超过40位的熵,然后使用带有AES的CTR-DRBG(来自SP 900-90)生成输出。

其次,您的RNG可能有实际的陷阱门或无意的弱点。这就是SP 800-90中的Dual EC DRBG所声称的。如果攻击者知道P和Q之间的关系,并且看到一个完整的DRBG输出,则他可以恢复DRBG的将来状态并预测每个将来的输出。您可以想象这样的事情-英特尔RNG使用CTR-DRBG,但是如果将密钥的除了40位以外的所有位都连接到一些已知值,则输出将通过统计测试,但对于知道这些的攻击者将是微弱的位。

在任何一种情况下,如果直接使用RNG输出,将很容易受到攻击。在第一种情况下,您对RNG输出所做的任何未添加其他熵的操作都将很容易受到攻击,因为攻击者只能猜测熵,然后自己生成一切。在第二种情况下,您需要给攻击者一点点输出来进行攻击,但是(取决于后门的细节)用于加密算法的几个IV可能足以泄露秘密。

避免这两种潜在攻击的最佳方法是将Intel RNG输出与OS收集的熵结合起来。有几种方法可以做到这一点,但我认为最好的方法是在SP 800-90中找到的一种-您可以播种RNG,然后继续生成具有预测阻力的输出。

a 。使用/ dev / random至少获取128位的熵,并将其与RDRAND的一些输出连接起来,然后使用该结果使用AES播种CTR-DRBG软件实例。

b。每次您收到生成一些输出的请求时,请执行以下操作:

(i)从RDRAND获取输出。

(ii)重新设置CTR-使用该输出作为新种子材料的DRBG实例。 (通过重新播种可以保留先前状态的熵,因此这不会削弱您已经拥有的熵。)

(iii)生成输出。

如果/ dev / random为您提供128位熵,并且CTR-DRBG是安全的,那么您可以让攻击者选择从RDRAND获得的每个值,而他则无法将随机数设为不太安全。

如果RDRAND很好,那么攻击者可以选择从/ dev / random中获取的位,并且您的随机数仍然是安全的。

或者,您可以简单地将XOR RDRAND输出与/ dev / urandom输出进行比较。很容易看出,只要一个人都无法预测另一个人的价值观,这绝不会比两个人的弱者弱。 SP 800-90C草案对此进行了讨论。

免责声明:我是800-90标准的作者之一,还是CTR-DRBG的设计师。

评论


$ \ begingroup $
“您可以让攻击者选择从RDRAND获得的每个值,而他不能使您的随机数的安全性降低”,这是不正确的,因为CPU可以看到您的/ dev / random池。参见DJB的blog.cr.yp.to/20140205-entropy.html
$ \ endgroup $
– Navin
17 Mar 14 '18:24