我目前正在使用 XINU 学习操作系统课程,我可以控制操作系统上运行的每个进程,因此,我可以完全预测其随机数生成器的输出。这是代码。
我很清楚,即使是这种简单的方法,在桌面操作系统上使用时,也能够创建真正的随机数,因为有很多进程根据用户、位置或时间的不同而表现不同。但是,在启动时,在有任何用户输入之前呢?
Linux 的加密随机数生成器要复杂得多,但它似乎仍然依赖于用户输入。OpenSSH 在许多 Linux 系统中在启动时运行。我敢肯定有很多公司运行的配置非常接近库存,如果您可以模拟相同的硬件、软件,并设置与您正在攻击的服务器相同的时间和位置,您就不能利用它吗?
在许多托管服务上也有预制部署,开发人员可以在其中上传他们的代码(dockerfile、ruby on rails 项目等),服务器会设置它。这些服务器具有预制软件、已知硬件、位置和时间。我假设他们在现实世界中具有硬件随机性,但如果他们没有呢?
缺乏熵一直是个问题,尤其是对于没有随机设备或其他此类 API 可用的旧操作系统,或者对于可能都具有或多或少完全相同种子的云或克隆操作系统而言。此外,尽管有熵源,人们仍然在做一些愚蠢的事情(例如 CVE-2020-27020)。
一种解决方案是在启动时从各种随机数源中读取,例如某些芯片的 RDRAND 功能,并希望在任何一个源被破坏或受损时从多个此类源中读取。这可能会延迟启动,直到获得“足够”的熵。通过挖掘它们的源代码,您可能会发现各种开源操作系统在启动时是如何做到这一点的。
另一种解决方案是使用一些预先生成的随机数据为系统或虚拟主机播种,这些数据可能由安装程序或主机操作系统生成。然后,后续系统在首次启动时会使用此数据。这允许任何数量的其他相同的虚拟系统具有不同的熵集,前提是主机操作系统为每个主机生成合适的熵。