如果我在 systemd 中有一个坏的(静态的、低熵的)随机种子怎么办?

如果我在 systemd 中有一个坏的(静态的、低熵的)随机种子怎么办?

在嵌入式系统上,只读文件系统很常见。只读意味着/var/lib/systemd/random-seed 重启后无法更新, 并且是可能是克隆人另一个设备的随机种子。

这是否会产生重大的安全或其他影响?如果有,应如何缓解?

也许:

  • 为每个设备创建一个新的随机种子将是部分缓解措施?重启后仍然无法更新
  • 是否要在 tmpfs 启动初期竭尽全力设置随机种子文件?不知道该怎么做
  • 忽视问题?

答案1

坏熵是某些类别的嵌入式设备上的常见问题。这是一个严重的安全风险。不幸的是,没有一个解决方案适用于所有设备。

注意:我是一名专业的嵌入式设备安全架构师,但通常使用对于 systemd 甚至 Linux 来说太小的设备。我对systemd了解不多。

为什么我需要熵?

很多安全性都依赖于密码学。许多密码学依赖于了解其他人不知道的东西。如果您有一个状态完全已知的设备,例如运行确定性处理器的新安装的系统,那么每个人都知道您设备的状态,因此设备无法知道对手不知道的信息。该设备需要要么开始了解其他人不知道的东西,要么有办法生成一些其他人不知道的信息。这就是熵。

需要熵,例如确保你与网站交换的数据不被窥探、你与网站交换的数据不被伪造、你的WiFi密码不被窥探等。

一旦系统上有熵,确定性随机发生器(即软件算法)可以产生无限量的秘密数据,而其他人都不知道。但任何确定性过程都不能无中生有地产生熵。原则上,确定性随机生成是一个已解决的问题(尽管实现可能存在错误)。

A2012 年的研究表明,一小部分但不可忽视的联网设备由于随机生成器不良而不安全。请记住,他们只是测试了一些特定的方式,在这些方式中,不良随机生成器是可见的。该研究忽略了不良 RNG 可能导致问题的许多其他方式,但相反,一些 RNG 问题可能是由于软件错误而不是缺乏熵造成的。

我怎样才能得到熵?

最可靠的解决方案是拥有一个专用硬件组件:硬件随机数发生器(HRNG)1。大多数(如果不是全部)最新的 PC 和智能手机处理器都有一个,一些嵌入式板有一个(据我所知,所有 Raspberry Pi 型号都有一个),但它们在低端设备(例如家用路由器)上不太常见。即使设备有 HRNG,Linux 也不总是有它的驱动程序。

如果没有专用的硬件组件,就可以从不可预测的事件中生成熵。问题在于不可预测的事件很难量化,并且在嵌入式设备上往往很少见。例如,旋转硬盘驱动器的精确响应时间具有一些不可预测性,但嵌入式设备通常没有跨接硬盘驱动器。专为高速设计的复杂处理器往往具有不可预测的时钟抖动,但廉价或低功耗设备没有太多抖动。用户事件(例如击键)的时间安排会带来一些不可预测性,但嵌入式设备往往没有物理用户。一些设备(例如相机传感器和麦克风)擅长从噪声中产生熵,至少在环境条件合适的情况下是这样,但没有多少设备没有合适的传感器。

向无法生成熵的设备提供熵的另一种方法是在制造过程中注入熵。在装配线上运行 HRNG,并将包含随机数据的不同文件注入到每个设备上。然后,每次设备启动时,它都必须更新此随机数据。这个随机数据就是您要询问的随机种子。

所有 Linux 系统通常都有一个随机种子。对于没有其他熵源的设备来说这是绝对必要的,甚至在有另一个熵源的设备上也很好。

随机种子不得与任何其他设备共享,并且设备重新启动时不得重复。它的工作方式应该是,种子要么在制造过程中注入,要么在设备安装过程中从熵生成,然后每次设备启动时,它都会计算并保存一个新种子。

如果我的设备是在没有熵的情况下安装的,我该怎么办?

如果您可以通过命令行访问 Linux 系统,则可以通过写入/dev/urandom.例如,如果您有从 PC 到设备的 SSH 连接:

head -c 99 /dev/urandom | ssh mydevice 'cat >/dev/urandom'

请注意,存在一个引导问题:只要设备没有熵,它就无法安全地生成 SSH 主机密钥,并且还容易受到网络攻击者的重放攻击。因此,您应该在设备暴露于不受信任的连接之前执行此操作。如果您有任何以较差的熵生成的密钥,请在有足够的熵可用后重新生成它们。

生成额外熵后,请确保更新存储中的随机种子。我思考你可以通过重新启动systemd-random-seed服务来做到这一点,但我不确定这一点,而且我发现 systemd 的文档不清楚。

如果我的设备没有持久随机种子,我该怎么办?

如果您的设备有 HRNG,那就没问题。否则你就有麻烦了。

如果您的设备有足够的方法从非专用外围设备收集熵,那么您可能没问题。问题是它很难衡量。

/var/lib/systemd/random-seed必须持久存储,否则就达不到目的。在 tmpfs 上“保存”随机种子是没有意义的。

许多嵌入式设备都有少量的 NVRAM。如果最大写入计数允许,则在每次启动时保存随机种子是该 NVRAM 的一个很好的用途。我不知道如何为此配置 systemd。

如果设备连接到物理安全环境中的有线网络,则可以选择从同一物理位置的受信任机器检索熵。

如果您有一个设备独有的秘密,但无法在每次启动时重写,则可以将此秘密与启动时的时间结合起来。但请注意这是最后的手段

{ date +%s; cat /path/to/static/seed; } | sha256sum >/dev/urandom

这会产生可接受的种子只要日期不重复。但是,如果您的设备断电并且忘记了时间,即如果它重新启动“闪烁十二点”,认为现在是 2000 年 1 月 1 日的 00:00:00,这会一遍又一遍地产生相同的种子,从而将您的设备打开到基于网络的网络。根据设备的功能,攻击可能或多或少容易。

1免责声明:虽然我的雇主不生产此类设备,但如果更多嵌入式设备配备 HRNG,它就会间接受益。但如果我雇主的主要业务是一家通过帮助人们从攻击中恢复过来而获利的咨询公司,我个人仍然会推荐 HRNG。

答案2

忽略。

虽然随机种子可能在系统中很常见,但它们并不是生成“随机性”的唯一输入。

相同的种子意味着伪随机数生成器以相同的值开始其伪随机数序列。

随着时间的推移,数据从系统操作、时间等中提取出来,并被馈送到伪随机数生成器。伪随机数生成的这些输入在不同系统中有所不同,因此伪随机数序列很快就会发散。

伪随机数生成是数学/计算机科学中研究的一个子领域。

相关内容