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