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, 低权限到高权限, 侧信道攻击, 内存安全, 内存破坏, 内核安全, 协议分析, 双重释放, 堆溢出, 子域名枚举, 安全渗透, 客户端加密, 客户端加密, 应用安全, 提权, 时序侧信道, 权限提升, 漏洞复现, 物理内存读写, 系统安全, 虚拟机镜像, 跨缓存攻击, 身份验证强制, 逆向工具, 错误配置, 页表操纵