如何编写针对Linux KVM的模糊测试?

4
当 Linux 内核作为主机内核时,应该不会受到虚拟机中客户机内核执行的影响。我想通过对从客户机内核到主机内核的接口进行模糊测试来测试这个属性。显然,测试需要在客户机内核内运行(比如在内核模块中),生成任意代码,然后执行该代码。如果主机内核崩溃(或做了一些“有趣”的事情),则测试失败。
所以,我的问题是:
- 你知道已经实现这一点的测试吗? - 是否有预期会使主机内核崩溃的指令需要避免? - 在 Linux 内核内部生成垃圾的最佳方法是什么? - 生成垃圾后,如何执行它?
目前,我只想专注于一般的模糊测试方法。之后,在让这个测试工作后,我将更改它以在内核中手术式地模糊不同的虚拟化指令和驱动程序。
更新:经过进一步思考,使用完全的垃圾进行模糊测试不会起作用,因为我会比预期更频繁地使客户机崩溃。因此,我认为我需要从一开始就进行手术式的模糊测试。有什么建议吗?

有些雄心壮志,也许你应该从攻击一个更容易的项目开始入手。 - rook
2个回答

3
在很大程度上,发现严重的0天漏洞是关于编写富有想象力的测试的。当您构建系统测试时,需要识别其攻击面。对于Web应用程序来说,这很容易,只需通过GET / POST请求即可。对于像VM这样的东西,它更加复杂。提供给您的实际硬件是由KVM创建的幻觉。在某个时候,与该设备的数据交互将由主机处理。
寻找已经在目标中发现的漏洞是另一个重要资源。通常情况下,程序员会犯非常类似的错误,并且相似的漏洞非常普遍。这些CVE(CVE-2010-0297 CVE-2010-0298 CVE-2010-0306 CVE-2010-0309)是Linux的KVM中漏洞的很好例子。两个突出的硬件设备是CPU和USB,它们都被攻破了。
一个非常强大的模糊平台是Peach。许多测试可以仅使用XML创建,但如果您了解Python,则可以扩展桃子以执行任何操作。

“imaginative”和“ambitious”相似吗? :) - Jeremy Powell
感谢您提供这些CVE的指针;我还不熟悉虚拟设备的工作原理,所以我会以此为起点。 - Jeremy Powell
我想知道如何将Peach(Python)与内核模块进行接口连接?或者你有其他的想法吗? - Jeremy Powell
@Jeremy Powell,在Linux中,一切皆为文件。设备可以在/dev/中找到。一种廉价的模糊测试方法是让Peach打开其中一个文件并开始向设备写入数据。不过,如果你学习如何编写设备驱动程序,你会更加成功。 - rook

0

虽然模糊测试设备驱动程序通常是有成效的,但大多数驱动程序并非由KVM模拟,而是由用户空间组件模拟。正如前面的答案所举的例子,USB驱动程序完全由QEMU模拟。尽管在模拟的EHCI驱动程序中发现漏洞将是很棒的事情,但它不会是KVM漏洞,并且也不会允许您开发内核利用程序。有一些驱动程序在KVM中被模拟,例如某些PIC定时器(例如i8254和i8259),但大多数驱动程序都保留在用户空间。

KVM模拟的另一件事是某些指令。您可以通过模糊这些特定指令来模糊测试KVM。阅读KVM源代码以查看哪些是最复杂的,并了解如何触发最复杂或最敏感的行为。在旧的CPU架构中,当CPU无法向客户机提供实模式执行(unrestricted_guest=1)时,甚至会模拟更多的指令。

特别是在利用指令模拟时,常常涉及竞争条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接