: x86 处理器模糊测试器
Sandsifter 通过系统生成机器码来搜索处理器的指令集,并监控执行过程中的异常,从而审计 x86 处理器的隐藏指令和硬件漏洞。Sandsifter 已经发现了来自所有主要厂商的秘密处理器指令;反汇编器、汇编器和模拟器中普遍存在的软件漏洞;企业级虚拟机监控器的缺陷;以及 x86 芯片中的良性及安全关键型硬件漏洞。
鉴于 x86 处理器的多样性,该工具的目标是使用户能够自行检查系统中存在的隐藏指令和漏洞。
要对你的处理器进行基本审计,请运行:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t

计算机会被系统扫描以发现异常指令。在上半部分,你可以看到 sandsifter 当前正在处理器上测试的指令。在下半部分,sandsifter 报告它发现的异常。
搜索过程可能需要几个小时到几天,具体取决于处理器的速度和复杂度。完成后,汇总结果:
./summarize.py data/log

通常,你的处理器上会发现数百万条未记录的指令,但这些指令通常只属于少数几个不同的类别。在对异常进行分箱后,汇总工具会尝试将每条指令归入以下问题类别:
按 'Q' 键退出并获取系统扫描的文本摘要:
扫描结果有时难以被工具自动分类,可能需要手动分析。如需帮助分析你的结果,可以随时将 ./data/log 文件发送至 [email protected]。该日志中不包含除处理器品牌、型号和修订版本(来自 /proc/cpuinfo)之外的任何个人信息。
使用 sandsifter 进行扫描,已经发现了跨越数十个操作码类别的未记录处理器特性、企业级虚拟机监控器的缺陷、几乎所有主流反汇编和模拟工具中的漏洞,以及打开处理器安全漏洞通道的关键硬件缺陷。
结果的详细信息可在项目白皮书中找到。
(待办事项:此处应列出详细结果枚举)
Sandsifter 需要先安装 Capstone 反汇编引擎:http://www.capstone-engine.org/。通常可以通过以下方式安装 Capstone:
sudo apt-get install libcapstone3 libcapstone-dev
sudo pip install capstone
然后使用以下命令构建 Sandsifter:
make
接着运行:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
标志通过 --flag 传递给 sifter,通过 ---f 传递给 injector。
示例:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Sifter 标志:
--len
搜索所有指令的长度差异(执行方式与反汇编器预期不同的指令,或者反汇编器预期存在但实际上不存在的指令)
--dis
搜索有效指令的长度差异(执行方式与反汇编器预期不同的指令)
--unk
搜索未知指令(反汇编器不知道但能成功执行的指令)
--ill
与 --unk 相反,搜索无效的反汇编(不能成功执行但反汇编器承认的指令)
--tick
定期将当前指令写入磁盘
--save
退出时保存搜索进度
--resume
从上次保存的状态恢复搜索
--sync
发现搜索结果时立即写入磁盘
--low-mem
不将结果存储在内存中
Injector 标志:
-b
模式:暴力破解
-r
模式:随机模糊测试
-t
模式:隧道模糊测试
-d
模式:外部导向模糊测试
-R
原始输出模式
-T
文本输出模式
-x
定期将进度写入 stderr
-0
允许空指针解引用(需要 sudo)
-D
允许重复前缀
-N
无 NX 位支持
-s seed
随机搜索中的种子值
-B brute_depth
暴力搜索中的最大搜索深度
-P max_prefix
要搜索的最大前缀数量
-i instruction
开始搜索的指令(包含)
-e instruction
结束搜索的指令(不包含)
-c core
执行搜索的核心
-X blacklist
将指定指令加入黑名单
-j jobs
同时运行的作业数
-l range_bytes
每个子范围内基本指令的字节数
m: 模式 - 更改 sifter 的搜索模式(暴力、随机或隧道)
q: 退出 - 退出 sifter
p: 暂停 - 暂停或恢复搜索
扫描支持四种不同的搜索算法,可以在命令行设置,也可以通过热键循环切换。
sudo
为获得最佳效果,应以 root 用户运行该工具。这样做是必要的,以便进程可以将页面映射到地址 0 的内存中,这需要 root 权限。该页面可以防止许多指令在内存访问时发生段错误,从而实现更准确的故障分析。
前缀
指令搜索深度的主要限制是要探索的前缀字节数量,每增加一个前缀字节,搜索空间就会增加大约 10 倍。使用 -P 标志限制前缀字节。
颜色
sifter 的界面是为 256 色终端设计的。虽然具体细节因终端而异,但大致可以通过以下方式实现:
export TERM='xterm-256color'
GUI
界面假定终端至少具有特定大小;如果界面不能正确渲染,尝试增大终端尺寸;这通常可以通过减小终端字体大小来实现。
在某些情况下,可能希望或有必要在没有图形前端的情况下运行该工具。可以通过直接运行 injector 来实现:
sudo ./injector -P1 -t -0
要过滤直接调用 injector 的结果,可以使用 grep。例如,
sudo ./injector -P1 -r -0 | grep '\.r' | grep -v sigill
搜索处理器和反汇编器对指令长度不一致(grep '.r')但指令成功执行(grep -v sigill)的指令。
定向模糊测试
在很多情况下,将模糊测试器定向到特定目标是很重要的。例如,如果你怀疑模拟器在重复的 lock 前缀(0xf0)周围存在缺陷,可以使用 -i 和 -e 标志将模糊测试器定向到指令空间的这个区域:
sudo ./sifter.py --unk --dis --len --sync --tick -- -t -i f0f0 -e f0f1 -D -P15
遗留系统
对于扫描非常老的系统(i586 级别处理器、低内存系统),向 sifter 传递 --low-mem 标志,向 injector 传递 -N 标志:
sandsifter 是 Christopher Domas (@xoreaxeaxeax) 的研究成果。
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
如果你观察到扫描完成得太快(例如,几秒钟就完成),通常是因为你的处理器需要这些标志。
32 位 vs 64 位
默认情况下,sandsifter 构建为目标主操作系统的位宽。但是,某些指令在 32 位进程和 64 位进程中的行为不同。为了探索这些情况,有时在 64 位系统上运行 32 位的 sandsifter 是有价值的。
要在 64 位系统上构建 32 位的 sandsifter,必须安装 32 位的 Capstone;相关说明可以在 http://www.capstone-engine.org/ 找到。
然后必须为 32 位架构构建 sandsifter:
make CFLAGS=-m32
这样,就可以在 64 位系统上探索 32 位的指令空间了。