trailofbits/mishegos
GitHub: trailofbits/mishegos
mishegos 是一款针对 x86/x86-64 指令解码器的差异模糊测试工具,旨在通过比较多种解码引擎输出来发现解析逻辑中的不一致性。
Stars: 268 | Forks: 30
# mishegos
[](https://github.com/trailofbits/mishegos/actions/workflows/ci.yml)
一个 x86 解码器的差异模糊测试工具。

在其配套的 [博客文章](https://blog.trailofbits.com/2019/10/31/destroying-x86_64-instruction-decoders-with-differential-fuzzing/)
和学术出版物 ([论文](https://github.com/gangtan/LangSec-papers-and-slides/raw/main/langsec21/papers/Woodruff_LangSec21.pdf)
| [录音](https://www.youtube.com/watch?v=a2q86KTZt0g)
| [幻灯片](https://github.com/trailofbits/publications/blob/master/presentations/Differential%20analysis%20of%20x86-64%20decoders/langsec-2021-slides.pdf)) 中了解更多关于 `mishegos` 的信息。
```
@InProceedings{woodruff21differential,
author = "William Woodruff and Niki Carroll and Sebastiaan Peters",
title = "Differential analysis of x86-64 instruction decoders",
booktitle = "Proceedings of the Seventh Language-Theoretic Security Workshop~({LangSec}) at the {IEEE} Symposium on Security and Privacy",
year = "2021",
month = "May"
}
```
## 使用
首先克隆仓库,包括子模块:
```
git clone --recurse-submodules https://github.com/trailofbits/mishegos
```
### 构建
在 Docker 中构建 `mishegos` 最简单:
```
docker build -t mishegos .
```
或者,您可以尝试直接构建。
确保您已安装 `binutils-dev`(或您的系统提供 `libopcodes` 的任何方式):
```
make
# 或
make debug
```
通过以空格分隔的列表作为 `WORKERS` 变量来构建特定的 worker:
```
WORKERS="bfd capstone" make worker
```
使用 `JOBS` 变量控制构建并行度(默认为 `nproc`):
```
# Parallel workers,每个使用所有 cores(默认)
make all -j$(nproc)
# Conservative:同时限制 inter-worker 和 intra-worker 并行
make all -j4 JOBS=4
# Sequential workers,每个 worker 完全内部并行
make all -j1 JOBS=$(nproc)
```
### 运行
运行模糊测试工具一段时间:
```
./src/mishegos/mishegos ./workers.spec > /tmp/mishegos
```
`mishegos` 检查三个环境变量:
* `V=1` 在 `stderr` 上启用详细输出
* `D=1` 出于调试目的启用“dummy”变异模式
* `M=1` 启用“manual”变异模式(即从 `stdin` 读取)
* `MODE=mode` 可用于在缺少 `D` 和 `M` 时配置变异模式
* 有效的变异模式包括 `sliding`(默认)、`havoc` 和 `structured`
将 mishegos 的原始输出转换为适合分析的 JSONL:
```
./src/mish2jsonl/mish2jsonl /tmp/mishegos > /tmp/mishegos.jsonl
```
`mish2jsonl` 检查 `V=1` 以在 `stderr` 上启用详细输出。
对结果运行分析/过滤传递组:
```
./src/analysis/analysis -p same-size-different-decodings < /tmp/mishegos.jsonl > /tmp/mishegos.interesting
```
生成过滤后结果的 ~丑陋~ 漂亮可视化:
```
./src/mishmat/mishmat < /tmp/mishegos.interesting > /tmp/mishegos.html
open /tmp/mishegos.html
```
提示:`mishmat` 生成的 HTML 文件可能有数百兆字节大,这可能会导致糟糕的浏览器浏览体验。使用 [`split`](https://man7.org/linux/man-pages/man1/split.1.html) 工具,您可以创建多个较小的 HTML 文件,每个文件包含指定数量的条目(在以下示例中为 10,000 个),并分别加载它们:
```
mkdir /tmp/mishegos-html
split -d --lines=10000 - /tmp/mishegos-html/mishegos_ \
--additional-suffix='.html' --filter='./src/mishmat/mishmat > $FILE' \
< /tmp/mishegos.interesting
```
### 性能说明
以下所有数字对应于以下运行:
```
V=1 timeout 60s ./src/mishegos/mishegos ./workers.spec > /tmp/mishegos
```
在 Docker 外部:
* 在 Linux 桌面(Ubuntu 20.04, Ryzen 5 3600, 32GB DDR4)上:
* 提交 [`d80063a`](https://github.com/trailofbits/mishegos/commit/d80063a575c4b10d5f787ac88f45d44c8e7f9937)
* 8 个 worker(无 `udis86`)+ 1 个 `mishegos` 模糊测试进程
* 870 万次输出/分钟
* 9 个核心已绑定
## TODO
* 性能改进
* 将队列收集分离为一个单独的进程(需要重新添加信号量)
* 也许为输入/输出/队列槽位使用更好的数据结构
* 为 worker 添加一个扩展因子,例如为每个 worker 生成 `N` 个
* 预分析规范化(空格、立即数表示、前缀)
* 分析策略:
* 按长度、解码状态差异过滤
* 简单:词法比较
* 简单:重新组装 + 效果建模(也许使用 microx?)
* 评分思路:
* 低价值:标志/前缀差异
* 中等价值:解码成功/失败/崩溃差异
* 高价值:具有不同控制流、操作数、可能还有一些立即数的解码差异
* 可视化思路:
* 基本但并非真的基本:某种鼠标悬停差异可视化
## 许可证
`mishegos` 根据 [Apache v2.0](LICENSE) 许可证进行许可和分发。如果您正在寻求条款的例外,[联系我们](mailto:opensource@trailofbits.com)。
标签:Binutils, Capstone, Cutter, Docker, Trail of Bits, Wayback Machine, x86, x86-64, 二进制分析, 云安全运维, 反汇编, 安全防御评估, 差异测试, 指令集, 测试工具, 解码器, 语法安全, 请求拦截