googleprojectzero/bochspwn

GitHub: googleprojectzero/bochspwn

基于Bochs模拟器插桩的内核内存访问分析工具,通过监测内存访问模式检测双重获取等竞态条件漏洞。

Stars: 345 | Forks: 75

# Bochspwn Bochspwn 是一个系统级的插桩项目,旨在记录操作系统内核执行的内存访问,并对其进行检查以搜索表明存在特定漏洞(如“双重获取 (double fetches)”)的模式。内存引用的信息是通过在编译了自定义插桩组件的 [Bochs IA-32 emulator](http://bochs.sourceforge.net/) 中运行客户机操作系统获取的。它编写于 2013 年,曾被用于发现 Windows 内核中超过 50 个竞态条件,这些漏洞在众多安全公告中得到了修复([MS13-016](https://docs.microsoft.com/en-us/security-updates/SecurityBulletins/2013/ms13-016)、[MS13-017](https://docs.microsoft.com/en-us/security-updates/SecurityBulletins/2013/ms13-017)、[MS13-031](https://docs.microsoft.com/en-us/security-updates/SecurityBulletins/2013/ms13-031)、[MS13-036](https://docs.microsoft.com/en-us/security-updates/SecurityBulletins/2013/ms13-036))。欲了解更多信息,请参阅 [阅读更多](#read-more)。 ## 支持状态 该工具集目前并未处于积极维护状态,其源代码以“原样”发布,主要供参考。它最初在 Black Hat USA 演讲后于 2013 年作为 *kfetch-toolkit* 发布,并附带了一份详尽的文档,见 [DOCUMENTATION.old.md](DOCUMENTATION.old.md)(现已部分过时)。2017 年,我们修改了项目的源代码并实现了若干新功能: 1. 关于内核驱动程序地址空间布局的信息被存储在一个单独的文件中(默认为 `modules.bin`),每个驱动程序在主日志文件中通过其索引进行引用。这样做是为了节省磁盘空间,防止冗余信息(镜像名称和基地址)被不必要地保存到日志中的每个堆栈跟踪项中。 2. 关于每个堆栈帧中是否存在活动异常处理程序的信息已添加到访问日志 protocol buffer 中,使我们能够检测到许多本地 Windows 拒绝服务漏洞(参见示例 [1](https://j00ru.vexillium.org/2017/02/windows-kernel-local-denial-of-service-1/)、[2](https://j00ru.vexillium.org/2017/02/windows-kernel-local-denial-of-service-2/)、[3](https://j00ru.vexillium.org/2017/03/windows-kernel-local-denial-of-service-3/)、[4](https://j00ru.vexillium.org/2017/04/windows-kernel-local-denial-of-service-4/))。 3. 关于 Windows 下内存访问发生时 [`PreviousMode`](https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/previousmode) 值的信息已添加到 protocol buffer 中。 4. “在线”双重获取检测模式已从代码中移除,因为被认为太慢而缺乏实际用处。 5. 代码中修复了一些与符号化相关的小错误。 该插桩工具也被移植到了 Bochs 2.6.9 版本,即本文撰写时的最新版本。 ## 构建与使用 有关通用说明,请参阅 [DOCUMENTATION.old.md](DOCUMENTATION.old.md)。 您可能希望使用更新版本的引用软件(例如 Bochs 2.6.9、libprotobuf 3.4.1 等),并更新 Bochspwn 配置文件以适应 2017 年的更改。如有疑问,请参考源代码或 [联系我们](mailto:mjurczyk@google.com) 提问。 ## 示例报告 ``` ------------------------------ found double-read of address 0x00000000001ef766 Read no. 1: [pid/tid/ct: 000000fc/00000100/01d27c3a91e567e6] { smss.exe} 0000001e, 00000042: READ of 1ef764 (5 * 4 bytes), pc = 82a75263 [ rep movsd dword ptr es:[edi], dword ptr ds:[esi] ] [previous mode: 1] #0 0x82a75263 ((0026a263) ntoskrnl!SeCaptureSecurityDescriptor+00000067) <===== SEH enabled (#0) #1 0x82a36a23 ((0022ba23) ntoskrnl!ObpCaptureObjectCreateInformation+000000c2) <===== SEH enabled (#0) #2 0x82a45de2 ((0023ade2) ntoskrnl!ObOpenObjectByName+0000009b) #3 0x82a3c7db ((002317db) ntoskrnl!IopCreateFile+00000673) <===== SEH disabled #4 0x82a60402 ((00255402) ntoskrnl!NtCreateFile+00000034) #5 0x82848db6 ((0003ddb6) ntoskrnl!KiSystemServicePostCall+00000000) Read no. 2: [pid/tid/ct: 000000fc/00000100/01d27c3a91e567e6] { smss.exe} 0000001e, 00000042: READ of 1ef766 (1 * 2 bytes), pc = 82a752ad [ movzx edx, word ptr ds:[eax+2] ] [previous mode: 1] #0 0x82a752ad ((0026a2ad) ntoskrnl!SeCaptureSecurityDescriptor+000000b1) <===== SEH enabled (#1) #1 0x82a36a23 ((0022ba23) ntoskrnl!ObpCaptureObjectCreateInformation+000000c2) <===== SEH enabled (#0) #2 0x82a45de2 ((0023ade2) ntoskrnl!ObOpenObjectByName+0000009b) #3 0x82a3c7db ((002317db) ntoskrnl!IopCreateFile+00000673) <===== SEH disabled #4 0x82a60402 ((00255402) ntoskrnl!NtCreateFile+00000034) #5 0x82848db6 ((0003ddb6) ntoskrnl!KiSystemServicePostCall+00000000) ``` ## 阅读更多 * 白皮书 - [Identifying and Exploiting Windows Kernel Race Conditions via Memory Access Patterns](https://j00ru.vexillium.org/papers/2013/bochspwn.pdf) * SyScan 2013 幻灯片 - [Bochspwn: Exploiting Kernel Race COnditions Found via Memory Access Patterns](https://j00ru.vexillium.org/slides/2013/syscan.pdf) * Black Hat USA 2013 幻灯片 - [Bochspwn: Identifying 0-days via System-wide Memory Access Pattern Analysis](https://j00ru.vexillium.org/slides/2013/bhusa.pdf) * Black Hat USA 2013 视频 - [Bochspwn: Identifying 0-days via System-wide Memory Access Pattern Analysis on YouTube](https://www.youtube.com/watch?v=ypV0kpi4cd8) * 博客文章 - [Kernel double-fetch race condition exploitation on x86 - further thoughts](https://j00ru.vexillium.org/2013/06/kernel-double-fetch-race-condition-exploitation-on-x86-further-thoughts/) ## Bochspwn Reloaded 2017 年,我们在 Bochs 模拟器之上实现了一种新型的全系统插桩,名为 *Bochspwn Reloaded*。该插桩工具对客户机内核地址空间进行污点追踪 (taint tracking),并检测未初始化的内核堆栈/堆内存向用户模式的泄露。它帮助我们在 2017 年和 2018 年初识别出 Windows 内核中超过 [70](https://bugs.chromium.org/p/project-zero/issues/list?can=1&q=finder:mjurczyk%20product:kernel%20opened%3E2017-02-23%20opened%3C2018-1-23%20%22uninitialized%20%22memory%20disclosure%22&colspec=ID%20Status%20Restrict%20Reported%20Vendor%20Product%20Finder%20Summary&cells=ids) 个漏洞,以及 Linux 中超过 [10](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?qt=author&q=mjurczyk@google.com) 个次要漏洞。 该工具在 [REcon Montreal](https://j00ru.vexillium.org/talks/recon-bochspwn-reloaded-detecting-kernel-memory-disclosure/)、[Black Hat USA](https://j00ru.vexillium.org/talks/blackhat-usa-bochspwn-reloaded-detecting-kernel-memory-disclosure/) 和 [INFILTRATE](https://j00ru.vexillium.org/talks/infiltrate-bochspwn-revolutions-further-advancements-in-detecting-kernel-infoleaks/) 会议上进行了讨论,并在 [Detecting Kernel Memory Disclosure with x86 Emulation and Taint Tracking](http://j00ru.vexillium.org/papers/2018/bochspwn_reloaded.pdf) 白皮书中有所提及。它也是一个开源项目,其源代码可在 [bochspwn-reloaded](https://github.com/google/bochspwn-reloaded) 仓库中找到。 ## 免责声明 这不是一个官方的 Google 产品。
标签:0day挖掘, Bochs, C++, Double Fetch, Python, Web报告查看器, Windows内核, 云资产清单, 仿真器, 信息泄露, 内存访问监控, 内核安全, 内核态, 动态二进制分析, 双重获取, 开源, 插桩, 数据擦除, 无后门, 沙箱, 白帽子, 竞态条件, 缓冲区溢出, 逆向工程, 配置错误