trailofbits/mishegos

GitHub: trailofbits/mishegos

mishegos 是一款针对 x86/x86-64 指令解码器的差异模糊测试工具,旨在通过比较多种解码引擎输出来发现解析逻辑中的不一致性。

Stars: 268 | Forks: 30

# mishegos [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/d8e9ab6d7f012901.svg)](https://github.com/trailofbits/mishegos/actions/workflows/ci.yml) 一个 x86 解码器的差异模糊测试工具。 ![mishegos](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/cf87baa339012903.png) 在其配套的 [博客文章](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, 二进制分析, 云安全运维, 反汇编, 安全防御评估, 差异测试, 指令集, 测试工具, 解码器, 语法安全, 请求拦截