计算机程序员经常背诵“ x86指令完全不透明”的口号:Intel告诉我们他们在做某事,但是没有希望任何人都可以验证正在发生的事情,因此,如果NSA告诉他们对RNG进行后门操作,那么我们就无法真正做到这一点。做任何事情。
好吧,我相信计算机程序员不能对这个问题做任何事情。但是电气工程师将如何攻击它?电气工程师可以使用哪些技术来验证电路实际上执行了其规格中描述的操作,而没有其他操作?
计算机程序员经常背诵“ x86指令完全不透明”的口号:Intel告诉我们他们在做某事,但是没有希望任何人都可以验证正在发生的事情,因此,如果NSA告诉他们对RNG进行后门操作,那么我们就无法真正做到这一点。做任何事情。
好吧,我相信计算机程序员不能对这个问题做任何事情。但是电气工程师将如何攻击它?电气工程师可以使用哪些技术来验证电路实际上执行了其规格中描述的操作,而没有其他操作?
Answers:
关于该主题,我读过的最好的论文是2014年出版的“隐形掺杂剂级硬件木马”(Becker等人)。
由于修改后的电路在所有布线层(包括所有金属和多晶硅)上都是合法的,因此我们的木马家族可以抵抗大多数检测技术,包括细粒度光学检查和“金芯片”检查。我们证明了这种方法的有效性。通过将特洛伊木马程序插入两种设计中-一种数字后处理程序(源自Ivy Bridge处理器中使用的英特尔加密安全RNG设计的数字后处理)和一种抗侧通道的SBox实现-并探索它们的可检测性及其对安全性的影响。
该白皮书描述了如何进行更改,如何通过检查硅片来检测到它极其困难,如何将其从生产测试中隐藏起来的技术,以及如何进行更改以降低硬件加密RNG的安全性或泄露密钥信息。通过AES实现的电源侧边通道。
旁通道是新兴的关注领域。英特尔一直困扰着与推测执行从内存中泄漏信息有关的问题,这些信息甚至没有被程序使用。难道那是故意的设计缺陷?这几乎是不可能的。
电气工程师可以使用哪些技术来验证电路实际上执行了其规格中描述的操作,而没有其他操作?
从理论上讲,是的,我认为这是可能的。但是,对于复杂的CPU,将花费大量时间和金钱。另外,如果您不完全了解和理解设计,则将无法判断任何活动是否为“合法”。
CPU“只是”由许多逻辑单元组成的复杂数字电路。
可以通过观察金属连接来对芯片进行反向工程和重构设计。这些连接层可以有很多,例如最多8层或更多。
您将需要该领域的专家来识别逻辑单元,然后也许某些软件可以弄清楚它们是如何连接的,以便您可以重构网表。
一旦有了网表,就可以“知道”设计。这并不意味着您现在也知道它是如何工作的!
可能是某个功能激活了设计的2个部分,而您认为一个部分就足够了,因此您怀疑正在进行一些可疑活动。但是,该设计会执行一些您不知道的聪明技巧,以加快操作速度。
如果不了解和理解设计,您得出的任何结论可能仍然是错误的。只有设计CPU的工程师才拥有所有设计信息,并有最大的机会找出或猜测CPU中实际发生的情况或应该继续发生的情况。
好吧,我相信计算机程序员不能对这个问题做任何事情。但是电气工程师将如何攻击它?
没有找到后门的好方法,找到硬件后门的一种方法是测试组合或未记录的说明。这是一个真正做到这一点并在x86硬件上进行审核的人的好话。这可以在不使芯片破裂的情况下完成。英特尔(我不确定其他芯片)的一个问题是它实际上有运行Linux的处理器,因此某些处理器上也有软件运行,并且您无法访问该处理器。
电气工程师可以使用哪些技术来验证电路实际上执行了其规格中描述的操作,而没有其他操作?
有多种测试方法可以使用硬件本身来测试功能。由于x86的指令集有未记录的部分,因此在普通指令中引入后门是不寻常的,因为它会引入可能的错误(例如,如果在add或mult指令中有后门),那么首先要看一下将在未记录的说明中。
如果确实需要测试常规指令的功能,则可以观察执行指令所花费的时间,观察执行指令所花费的力量,以查看与预期之间是否存在差异。
唯一的方法是逐层剥离芯片,并用电子显微镜记录每个晶体管,然后将其输入某种模拟程序中,然后观察其运行情况。
从本质上讲,这是黑匣子问题,您可以在其中尝试通过测量输入和输出来重建内部。一旦内部结构的复杂性或I / O的数量变得微不足道,便会发生组合爆炸,其中可能的内部状态数量变成天文数字。像Googol这样的数字到处乱扔。
将任何数据传输到NSA都需要网络访问权限,因此通过运行禁用了网络服务的OS并检查网络接口的通信量,很容易发现此类后门。对于开源OS,甚至可以通过其目标IP来获得完全的网络支持和流氓连接,这将与OS合法访问的任何地址都不匹配。
没有数据传输的基于RNG的后门的用途非常有限。除非CPU RNG是唯一的熵源,否则这种后门将为攻击者提供任何优势而同时又不明显的机会几乎为零。除非您没有充分的理由就坚持说罗素的茶壶在那里,否则您应该能够对硬件RNG后门应用相同的论点。
rdrand
或rdseed
按照Intel的建议:作为PRNG种子的唯一熵源。Linux(内核)选择不这样做/dev/random
,但是glibc / libstdc ++的当前版本std::random_device
确实会使用,rdrand
只要它在运行时可用(而不是open)即可/dev/random
。 借助godbolt进入标准图书馆电话会议
std::random_device
不是加密功能强大的RNG。C ++标准允许您使用PRNG来实现它,每次都有效地返回相同的序列,因此很明显,没有人应该使用它进行加密。