isec-tugraz/SLUBStick

GitHub: isec-tugraz/SLUBStick

一种将 Linux 内核堆漏洞提升为任意物理内存读写的跨缓存利用技术,通过 SLUB 分配器侧信道和页表操纵实现权限提升。

Stars: 106 | Forks: 10

# SLUBStick 工件 此代码库包含在一个研究项目中开发的工件,以及执行 SLUBStick 的代码。 为了方便起见,我们提供了一个包含所有必要程序和脚本的虚拟机 (VM) [镜像](https://doi.org/10.5281/zenodo.11943102)。 ## 什么是 SLUBStick SLUBStick 是一种内核利用技术,它将堆漏洞提升为任意内存读/写原语,并分几个步骤工作: 最初,它利用分配器的计时侧信道来可靠地执行跨缓存攻击,在常用的通用缓存上成功率优于 99%。 SLUBStick 随后利用 Linux 内核中普遍存在的代码模式执行跨缓存攻击,并将堆漏洞转化为页表操纵,从而授予任意读写内存的能力。 这些工件展示了计时侧信道和端到端利用。 对于这两者,我们提供了一个运行 Linux 内核 x86_64 v6.2 的 VM 环境。 对于计时侧信道,评估展示了 slab 页面的成功率。 对于端到端利用,我们的攻击利用一个人造的双重释放 (DF) 漏洞来获取任意物理读写原语。 然后,该原语被用于操纵 `/etc/passwd` 文件,以在 VM 内获取 root 权限。 ## 依赖项 一个运行在 x86_64 架构上的 Linux 系统,并且允许启用 KVM 运行 qemu。 ## 安装 要安装 SLUBStick,请运行以下命令: ``` git clone https://github.com/IAIK/SLUBStick.git cd SLUBStick # 从 https://doi.org/10.5281/zenodo.11943102 下载 ubuntu22.04.qcow2 并存储在 images make run ``` VM 镜像是运行 Linux 内核 v6.2 的默认 Ubuntu 22.04 镜像。 登录的用户名是 `lmaar`,密码是 `asdf`。 该用户属于 `sudo` 组,因此可以通过 `sudo su` 获取 root 权限。 ### 设置 - 执行 `make run` 会启动 VM,提供一个终端登录提示符,以及在图形界面(即 Gnome)上已登录的用户。 - 要么在终端中登录(使用用户名 `lmaar` 和密码 `asdf`),要么在图形界面中打开一个终端。 - 执行 `uname -r` 应返回 `6.2.0-x-generic`。 - 目录 `/home/lmaar/exploits` 应包含 `helper.c`、`do\_eval*.sh` 和 `eval.py`。 - 目录 `/home/lmaar/exploits/userspace` 应包含 `*.c`。 - 切换到目录 `/home/lmaar/exploits` 并执行 `make init`。 ### 更改 如果您想调整 VM 内的文件: - 在宿主机上执行 `make server 2&> /dev/null&`。 - 执行 `make run`。 - 切换到目录 `/home/lmaar/exploits` 并执行 `make sync`,然后执行 `make init`。 ## 实验 在下文中,我们将演示使用 SLUBStick 进行计时侧信道和利用的实验: #### 基础泄露 1 利用 _操作方法:_ 执行 `./userspace/timed_ppdev_alloc.elf`。 _结果:_ 此实验输出一个垂直图表,格式如下:`: :###`,其中 `index` 是分配对象的索引,`tsc` 是分配所需的时间,而 `###` 提供了 `tsc` 的可视化表示。 分配新的 slab 将导致 `tsc` 显著大于来自 CPU 空闲列表的 `tsc`。 由于一个 slab(来自 `kmalloc-192`)可以包含 21 个对象(通过 `cat /sys/kernel/slab/kmalloc-192/objs_per_slab` 观察到),因此每 21 次分配就会分配一个新的 slab。 这可以通过每 21 个索引的 `tsc` 显著变大(即超过 2000,相比之下约为 1100)看出。 [basic_leakage_1.webm](https://github.com/IAIK/SLUBStick/assets/170955372/b692c4fc-57ab-42a8-82c6-b06d23975227) #### 基础泄露 2 利用 _操作方法:_ 执行 `./userspace/timed_anon_vma_name_alloc.elf `。 _Cache sizes:_ 16、32、64 或 96 字节。 _结果:_ 与上述实验类似,此实验表明当 SLUB 分配器分配新 slab 时,`tsc` 值会更大。 根据 `cache_size`(即 16 到 96 字节之间),新 slab 在 `kmalloc-[16,96]` 中分配。 对于较大的 `cache_size`,需要分配较少的对象即可促使分配器分配新 slab,因为一个 slab 上容纳的对象较少。 例如,`kmalloc-96` 通用缓存存储 42 个对象,这表现为每 42 次分配的 `tsc` 值显著变大。 [basic_leakage_2.webm](https://github.com/IAIK/SLUBStick/assets/170955372/d064975b-1a89-4aab-b91f-e2547d283bae) #### 单页 slab 回收利用 _操作方法:_ 执行 `./userspace/eval_pud.elf `。 _Cache sizes:_ 8、16、32、64、96、128、192 或 256 字节。 _结果:_ 此实验输出哪个 slab 页面被回收为页上级目录 (PUD),成功执行了从内核堆到 PUD 的跨缓存攻击。 如果正确的 slab 页面被回收为 PUD,此实验将输出 `[+] SUCCESS`,而 `[!] FAIL` 表示实验失败。 `[!] RETRY (start not found)` 表示侧信道未找到适合跨缓存重用的 slab。 此输出既不表示失败也不表示成功,但应重试实验。 [single_page_slab_reclaiming.webm](https://github.com/IAIK/SLUBStick/assets/170955372/30846d97-3883-4347-8b66-c63502da426c) #### 持久性代码模式 1 利用 _操作方法:_ 执行 `./userspace/exploit_signal.elf`。 _结果:_ 篡改 `/etc/passwd`,使得非特权用户可以通过调用 `su` 而无需认证来提升其权限级别。 [persistent_code_pattern_1_exploit.webm](https://github.com/IAIK/SLUBStick/assets/170955372/ce042658-c58d-42f5-93fc-829c145be4fa) #### 持久性代码模式 2 利用 _操作方法:_ 执行 `./userspace/exploit_snd.elf `。 _Cache sizes:_ 16、32、64、96、128、192 或 256 字节。 _结果:_ 结果同上。 [persistent_code_pattern_2_exploit.webm](https://github.com/IAIK/SLUBStick/assets/170955372/c6875139-e359-4076-b1e8-a475de90d793) #### 临时性代码模式利用 _操作方法:_ 执行 `./userspace/exploit_key.elf ` _Cache sizes:_ 16、64、96 或 128 字节。 _结果:_ 结果同上。 [temporal_code_pattern_exploit.webm](https://github.com/IAIK/SLUBStick/assets/170955372/5267548e-c50c-4203-a63b-5bc1ee739e4d) ## 出版物 ``` @inproceedings{Maar2024SLUBStick, author = {Lukas Maar and Stefan Gast and Martin Unterguggenberger and Mathias Oberhuber and Stefan Mangard}, booktitle = {{USENIX Security}}, title = {{SLUBStick: Arbitrary Memory Writes through Practical Software Cross-Cache Attacks within the Linux Kernel}}, year = {2024} } ```
标签:0day挖掘, Arbitrary Read/Write, Double Free, Exploit Development, Kernel Exploit, Linux内核, Page Table Manipulation, Root, SLUBStick, SLUB分配器, Web报告查看器, x86_64, 低权限到高权限, 侧信道攻击, 内存安全, 内存破坏, 内核安全, 协议分析, 双重释放, 堆溢出, 子域名枚举, 安全渗透, 客户端加密, 客户端加密, 应用安全, 提权, 时序侧信道, 权限提升, 漏洞复现, 物理内存读写, 系统安全, 虚拟机镜像, 跨缓存攻击, 身份验证强制, 逆向工具, 错误配置, 页表操纵