: 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 传递给注入器。
示例:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Sifter 标志:
--len
搜索所有指令的长度差异(指令执行结果与反汇编器预期不同,或者反汇编器预期存在但实际上不存在)
--dis
搜索有效指令的长度差异(指令执行结果与反汇编器预期不同)
--unk
搜索未知指令(反汇编器不知道但能够成功执行的指令)
--ill
与 --unk 相反,搜索无效的反汇编(指令无法成功执行但反汇编器承认其存在)
--tick
定期将当前指令写入磁盘
--save
退出时保存搜索进度
--resume
从上次保存的状态继续搜索
--sync
在发现搜索结果时立即写入磁盘
--low-mem
不在内存中存储结果
注入器标志:
-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
界面假定终端至少具有特定大小;如果界面未正确渲染,请尝试增大终端大小;通常可以通过减小终端字体大小来实现。
在某些情况下,可能希望或需要在没有图形前端的情况下运行该工具。这可以通过直接运行注入器来实现:
sudo ./injector -P1 -t -0
要过滤直接运行注入器的结果,可以使用 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 标志,向注入器传递 -N 标志:
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
如果您发现扫描完成得太快(例如,几秒钟内完成),通常是因为需要为您正在扫描的处理器提供这些标志。
32 位与 64 位
默认情况下,sandsifter 的构建针对主操作系统的位数。但是,某些指令在 32 位进程和 64 位进程中运行时具有不同的行为。为了探索这些场景,有时在 64 位系统上运行 32 位 sandsifter 是有价值的。
要在 64 位系统上构建 32 位 sandsifter,必须安装 32 位版本的 Capstone;相关说明可在 http://www.capstone-engine.org/ 找到。
然后必须为 32 位架构构建 sandsifter:
make CFLAGS=-m32
通过这种方式,可以在 64 位系统上探索 32 位指令空间。
sandsifter 是 Christopher Domas (@xoreaxeaxeax) 的一项研究成果。