这是我在2020年4月Hack in the Box 2020 Lockdown Edition大会上展示的完整文件系统模糊测试框架。

该框架的目标是发现UNIX系统(重点关注BSD系统)上的内核安全漏洞。 它是在针对FreeBSD、OpenBSD和NetBSD进行开发和重度测试的,同时也已初步支持基于Linux的主机。 我们成功发现了超过100个针对UFS和EXT文件系统的独特内核漏洞,同时也在ZFS(最近添加的支持)上获得了大量洞见。
makeFS2.py 可作为一个独立工具,用于生成各种有效的文件系统。
详细用法在大会资料仓库中进行了说明。
该框架仅在Ubuntu 18.04上测试过。
它依赖于KVM、QEMU和libvirt。
Requirements.sh 会安装所有必要的依赖项。
该框架可能完全兼容最新的Ubuntu 20.04版本。
其他非基于apt的主机系统应该也能轻松支持,只需对Requirements.sh进行少量修改即可。
完成需求安装后,即可继续执行设置步骤!
请参考SETUP.md。如果某些步骤不清楚,请与我联系!
启动模糊测试器只需执行:python3 run.py。
根据你的设置,可能需要sudo权限。
当一切成功启动后,你可以通过以下命令连接到tmux模糊测试会话:
(sudo) tmux attach-session -t fsfuzzer
该框架可通过脚本src/config/fuzzing_config.py进行配置:
# [模糊测试任务规格]
# 字典列表,指定每个模糊测试实例
fuzzer = [
{
"name": "fuzz1", # 用于内部记账的名称
"fs_creator_vm": "genBox", # 在libvirt中指定处理文件系统生成的VM名称,可跨所有实例相同
"fuzzing_vm": "fuzzBox_0", # 在libvirt中指定处理文件系统生成的VM名称
"mutation_engine": "radamsa, 0", # 要使用的变异引擎,以及变异大小(radamsa不接受大小参数)
"target_fs": "ufs2", # 目标文件系统
"target_size": 15, # 最大文件系统大小(以MB为单位)
"populate_with_files": 10, # 将要生成的文件数量
"max_file_size": 1024, # 每个生成文件的最大大小(以字节为单位)
"enable_dyn_scaling": False, # 动态缩放将定期增加文件系统大小
},
]
# [凭据]
# VM的root用户凭据
# 预计所有实例的凭据相同,但不一定必须是root
user = "root"
pw = "root"
可用的变异引擎包括:
动态缩放最初是为了测试文件系统大小是否影响可能的崩溃而实现的。 我未能找到文件系统大小导致崩溃变化的触发值,因此此标志可以保持禁用。 这也可以防止长时间运行时性能下降,因为较大的文件系统需要更长的变异时间。
其余配置参数不言自明。
下面的视频快速演示了两个模糊测试实例,分别用radamsa变异的UFS2和随机字节翻转的EXT文件系统针对FreeBSD进行模糊测试。 变异的UFS文件系统直接导致崩溃,展示了你能多快让内核崩溃。

通过此设置,我在FreeBSD、NetBSD和OpenBSD上针对UFS和EXT文件系统发现了超过100个独特的内核漏洞。 在这些崩溃中,有一些非常有趣的情况:
大多数崩溃属于内核拒绝服务(DoS)。 此外,截至今天(2020年5月),遇到的大多数崩溃仍未修复。 所以,快来文件系统实现中寻找内核漏洞吧 :)。
整个项目是“信任驱动开发”的产物,意思是它从一个简单的PoC想法开始,增长得太大太快。 因此,没有测试,而且很可能存在一些漏洞。 如果您遇到(非内核恐慌相关的)崩溃,很抱歉,但欢迎您提交PR或联系我,我会尽快修复!
Twitter: @0xricksanchez