FuzzOS –专为模糊测试而设计的操作系统

2020-12-08 04:13:09

我们将使用专门为模糊测试设计的操作系统!这将是12月大部分时间的流媒体系列,内容包括制作一个新的操作系统,重点是模糊测试。这意味着诸如内存管理器,确定性和可伸缩性之类的东西将是操作系统最重要的部分,并且要花很多精力才能使其变得超快!

直播将在12月10日(星期四)世界标准时间18:00左右的某个时间开始,但直播将在相对随机的日期相对随机的时间进行。我真的不能承诺特定的时间!

信息流一周大概有4-5天(可能是M-F),长度可能是8-12小时。我们将知道,这取决于我们能获得多少乐趣!

您可以在我的Twitch频道上找到直播,而如果不幸或错过了直播,则可以在我的YouTube频道上找到录音!当然,不要忘记喜欢,评论和订阅。

所以……最终,我真的不知道会发生什么。但是,我可以预测我们会做的一些事情。首先,必须注意这些流不是培训材料。没有准备好的脚本,材料,流程等。如果我们最终构建出完全不同的东西,那很好,我们就顺其自然。不需要完成此项目,也不必承诺完成该项目的某些方式。所以……除了那个。

我们将致力于开发专门针对x86-64的操作系统(一开始是Intel风味处理器,但AMD应该在非管理程序模式下工作)。该操作系统将专为模糊测试而设计,这意味着我们将专注于使虚拟内存管理非常快速。这是性能最高的模糊测试的基础,我们需要能够在模糊情况下修改页面时映射,取消映射和还原页面。

为了让您保持脚尖,我首先要从无聊的事情开始。

我们必须制作一个可以启动的操作系统。我们将要制作UEFI内核,并且可能会涉足在ARM64上运行它,因为我们的大多数代码都是平台无关的。但是,谁知道。这将是一个非常通用的内核,我主要是在裸机上开发它,但是当然,我们将确保它在KVM / Xen / Hyper-V上运行,以便可以在云环境中使用。

我们将需要编写ACPI表解析器,以便我们可以找到系统上内存和CPU的NUMA局部性。这对于获得可随内核扩展的高性能内存管理器至关重要。

当然,内核将支持多个内核,否则对于计算来说是没有用的。

由于我从不使用磁盘,因此我将遵循将网络作为通用用途的标准模型。为此,我们需要10gbit网络驱动程序和TCP堆栈,以便我们可以与网络的其余部分进行通信。这里没有什么太疯狂的,我们可能会从Chocolate Milk中借用一些代码

由于我们将要“快照”内存本身,因此我们需要确保指针等不是问题。最快,最简单,最好的解决方案只是确保内存始终加载到同一地址。对于单个核心来说,这没问题,但是对于多个核心来说,这很困难,因为它们需要在同一位置映射相同数据的副本。

有什么解决方案?当然,我们将使系统上的每个核心都运行自己的地址空间。这意味着内核之间没有共享内存(带有一些非常非常小的概念)。这不仅会带来极高的内存访问性能(由于缓存仅处于互斥或共享状态),而且这意味着共享(可变)内存将不再是问题!这意味着我们将通过消息传递来完成所有核心同步,在最佳情况下,此延迟比共享内存模型要高,但具有扩展性更好的优势。只要我们的消息可以序列化为TCP流,这意味着我们可以毫不费力地跨网络扩展。

这具有一些很棒的属性,因为我们不再需要对页表进行任何锁定来添加和删除条目,也不需要执行任何TLB击落操作,这会花费数万个周期。

我在Sushi Roll中使用了这个模型,我真的很想念它。它具有令人难以置信的良好性能,并迫使人们多考虑在内核之间共享信息。

与我所写的大多数东西一样,将需要线性缩放,并且暗示着在整个网络中进行缩放,因为对于任何实际的模糊应用来说都是必需的。

到目前为止,这些事情都没有超级有趣。很长时间以来,我有很多操作系统可以很好地完成这些任务。但是,我从未将这些内存管理技术变成真正的数据结构,而是根据需要手动使用它们。我计划使用Rust程序宏和虚拟内存管理技巧的组合来构成该操作系统的核心,以允许将任意数据结构存储在树形检查点结构中。

这将允许在快照快照时在结构的不同状态之间进行快速转换。这将通过利用页表中的脏位并创建一个分配器来实现,该分配器将在内存池中进行分配,该内存将在快照中保存和恢复。此内存在内部将被视为不透明的Blob,因此它可以保存您想要的任何信息,设备状态,来宾内存状态,寄存器状态,与绒毛完全无关的信息,都没有关系。为了处理嵌套结构(或更具体地说,是要跟踪的结构中的指针),我们将使用Rust过程宏来禁止在跟踪的结构中使用未跟踪的指针。

实际上,我们将充分利用硬件的MMU,以不同的方式快照,在它们之间传送和恢复内存块。对于模糊测试,这是保持访客内存状态和寄存器状态的一种方法。通过不透明地处理此问题,我们可以专注于真正很好地处理MMU方面,而不必担心特殊的大小写,这些所有变量在重置时都需要恢复。

好的,所有这些都为开发高性能模糊器腾出了空间。就我而言,我主要是希望对矢量化仿真进行新的重写,但是为了让其他用户感兴趣,我们将实现一个能够运行QEMU的Linux仿真器。

这意味着我们将能够(可能只是静态地)编译QEMU。然后,我们可以获取此二进制文件,并将其加载到我们的操作系统中,然后在我们的操作系统中运行QEMU。这意味着我们可以控制对QEMU发出的请求的系统调用响应。如果我们(将)确定性地执行此操作,则这意味着QEMU将是确定性的。因此,这意味着QEMU内部的来宾也将是确定性的。你看?这是我过去使用过的一种技术,效果非常好。我们绝对会胜过Linux对syscall的处理,并且我们会更好地扩展,并且在内存管理方面我们将Linux淘汰。

因此,我不知道这样做会有多困难,但是从浏览Internet大约5分钟之后,看来我可以很轻松地在我的OS中编写模拟KVM ioctl的虚拟机管理程序。意思是QEMU只会认为KVM在那,然后使用它!

这将使我们能够完全控制QEMU的确定性,系统调用,性能和重置速度……而无需实际修改QEMU代码。

这就是计划。一个OS +快速的MMU代码+虚拟机管理程序+ Linux模拟器,使我们能够确定性地运行QEMU可以运行的任何东西,这实际上就是一切。我们这样做的性能可能是每个内核每秒数百万个VM重置,并与内核线性地扩展,包括通过网络进行扩展,以实现世界上见过的最快的通用模糊测试:D

我在Twitch上的直播越来越频繁了!我已经开发了用于模糊测试的虚拟机管理程序,转换器,仿真器,并且在流中完成了很多有趣的模糊测试工作。来吧!

如果您想在新博客出现时收到通知,请在Twitter上@gamozolabs跟我来。我经常会根据输入的数据发布数据和图形,然后我就会学习!