bcoles/kasld
GitHub: bcoles/kasld
KASLD 是一款多架构 Linux 内核 KASLR 去随机化工具,通过推理引擎融合多种信息泄露与侧信道技术,评估内核地址布局在当前权限与配置下的暴露程度。
Stars: 500 | Forks: 51
KASLD 从本地进程恢复 Linux 内核的虚拟和物理内存布局——
主要是内核代码段基址——并尽可能利用该进程的视界所允许的条件:
包括其权限与 capabilities、系统配置以及任何容器隔离。在存在
信息泄露或侧信道的情况下,它会直接恢复出内核代码段基址;
否则,它会根据现有证据将其缩小到最小的可能放置集合。
推理引擎将数十种独立技术的证据与架构已知的不变量相融合,
将内核的放置位置缩小至一个残余窗口——报告为
存活的插槽数量和熵位数:这代表 KASLR 在当前视界下保留的
保护上限,而非保证攻击者无法触及该基址
(参见 [docs/limitations.md](docs/limitations.md))。在
完全修补的现代内核上——x86-64 侧信道已被缓解,
且不存在直接的内核代码段信息泄露——通常无法完全恢复,
但约束条件集极少为空。在没有 KASLR 的架构上,
引擎会定位由 bootloader 选择的加载地址。
支持:
* x86 (i386+, amd64)
* ARM (armv6, armv7, armv8, aarch64)
* MIPS (mipsbe, mipsel, mips64el)
* PowerPC (ppc, ppc64)
* RISC-V (riscv32, riscv64)
* LoongArch (loongarch64)
* s390
## 快速开始
```
sudo apt install libc-dev make gcc binutils git
git clone https://github.com/bcoles/kasld
cd kasld
make
./build/
/kasld
```
`build//` 目录是自包含的,可以直接部署到
目标系统:
```
build//
kasld <- run this
components/ <- leak components
```
硬化配置(`kernel.dmesg_restrict=1`、
`kernel.kptr_restrict=1`、`kernel.perf_event_paranoid=2` 或更高版本、
`kernel.unprivileged_bpf_disabled=1`)会收窄文件系统预测路径,
但这仅仅是视界的一个维度:
侧信道、弱熵和基于 capability 授予的技术独立于这些
sysctls。为了进行测试,
[extra/weaken-kernel-hardening](extra/weaken-kernel-hardening) 脚本
可以暂时放宽这些设置(需要 root 权限)。
## 示例输出
默认文本模式会打印出以结果优先的概述:
```
KASLD 0.3.1-dev -- Kernel ASLR derandomization
Target: x86_64 / 6.15.6
Running 94 components (3 experimental skipped; use -x to enable)...
[####################] 100% 94/94 13.9s
Virtual image base 0xffffffff8fe00000 slide +0xee00000
Physical image base 0x0000000034600000 slide +0x33600000
Direct map base >= 0xffff800000000000
Phys/Virt coupling physical and virtual text randomize independently
Leaks (6):
virt kernel text 0xffffffff8ff04104 [interior] (perf_event_open, proc_kallsyms)
virt kernel image 0xffffffff8fe00000 [base] (perf_event_open, prefetch, proc_kallsyms)
virt directmap 0xffff9eeb80000000 [base] (prefetch_directmap)
phys kernel image 0x0000000034600000 [base] (proc_iomem_kernel)
phys kernel data 0x0000000036000000 [base] (proc_iomem_kernel)
phys kernel BSS 0x0000000036b34000 [base] (proc_iomem_kernel)
[-v: detailed results, memory map, system info] [-H: hardening assessment]
```
`-v` 添加完整的详细输出(横幅、系统配置块、
各组件日志、KASLR 分析、内存布局映射)。`-j` 输出
机器可读的 JSON——完整的结构化视图,始终包含
各组件记录和硬化评估。`-1` 输出
单行可通过 shell 管道传输的内容。`-m` 格式化为适合 issue 追踪器。`-H`
在文本/markdown 报告中附加硬化评估。
有关完整的 CLI、输出模式
详细信息、解释模式以及硬化评估,请参阅 [docs/usage.md](docs/usage.md)。
## 视界
KASLD 能恢复什么取决于运行进程的*视界*——它不是
单一的特权级别,而是三个独立事物的组合:
* **特权、组和 capabilities** —— 非特权 uid,属于
某个组(例如 `adm`,该组拥有 `/var/log/` 下的内核日志权限),
持有额外 capability 的容器任务,或者 root。这些不构成
单一的阶梯,因为文件系统权限独立地控制每个来源:
被授予 `CAP_SYS_RAWIO` 的容器在该检查中是 init 命名空间的 root,
可以读取 `/proc/kcore` —— 这是普通用户无法触及的
信息泄露——然而对于 `/boot/System.map` 等文件是否
对全局可读,不同的发行版规定不一。
* **系统配置** —— `kptr_restrict`、`dmesg_restrict`、
`perf_event_paranoid`、非特权 BPF、内核锁定。配置
独立于特权:在 `kptr_restrict=2` 下 root 无法
读取 `/proc/kallsyms`,而宽松的 sysctl 或非特权 BPF 可以
向普通用户提供硬化系统本会拒绝的泄露。
* **隔离** —— 屏蔽 `/proc`
预言机或阻塞系统调用的 namespace 或 seccomp 沙箱,从而收窄任何特权级别所能观察到的内容。
这三个维度独立地控制每个泄露源——因此更高的特权并不是
更低特权的超集:配置可以向 root 拒绝某个来源,而侧信道
则完全绕过 sysctls。[docs/usage.md](docs/usage.md#vantage) 包含一个
泄露源与控制门维度的矩阵,展示了哪个维度控制着每个来源。
KASLD 默认假定权限极低,并会利用视界
所授予的一切进行机会性探测。报告的*保证*窗口从不
依赖于特权:提升的访问权限或宽松的配置可以扩大
尝试的范围,但绝不会改变证据所证明的可靠布局。详细(`-v`)、
JSON(`-j`)和 Markdown(`-m`)输出报告检测到的视界——
容器、隔离、可读的预言机,以及从
当前 capabilities 可达的 capability 受控泄露。
## 文档
刚接触 KASLD?请按顺序阅读:[docs/kaslr.md](docs/kaslr.md)(什么是 KASLR 以及
它随机化了什么)→ [docs/architecture.md → A leak from end to
end](docs/architecture.md#a-leak-from-end-to-end)(KASLD 如何将一次泄露转化为
答案)→ [docs/limitations.md](docs/limitations.md)(结果证明了什么以及
不能证明什么)→ [CONTRIBUTING.md](CONTRIBUTING.md)(添加泄露组件或
推理规则)。下表是针对不同受众的参考文档。
| 受众 | 文档 |
|---|---|
| 最终用户 / 运维人员 | [docs/usage.md](docs/usage.md) — CLI、输出模式、解释模式、硬化评估 |
| 解读结果 | [docs/limitations.md](docs/limitations.md) — 负面或部分结果意味着什么:可靠但不完整,以及为什么失败不是安全保证 |
| 漏洞利用开发者 | [docs/exploitation.md](docs/exploitation.md) — KASLR 破解在漏洞利用中的位置、控制流对比纯数据、pwntools 模板、`ksymoff` |
| 检测 / 蓝队 | [docs/footprint.md](docs/footprint.md) — 在受监控主机上运行时的表现:用于检测的行为签名,以及运维人员的 OPSEC 成本;设计上引人注目 |
| 组件 / 规则开发者 | [CONTRIBUTING.md](CONTRIBUTING.md) — 编写组件或规则、emitter API、退出代码、元数据 |
| 架构 / 内部机制 | [docs/architecture.md](docs/architecture.md) — 推理引擎、数据流接缝、带标签的行协议、跨区域推导 |
| 测试运行器 / CI | [docs/testing.md](docs/testing.md) — 主机测试、回放测试夹具、qemu-user 下的跨架构测试、覆盖率 |
| 可重复性 | [docs/reproducibility.md](docs/reproducibility.md) — 独立验证:在本地内核上、跨架构实时运行或对捕获的语料库进行验证 |
| KASLR 入门 | [docs/kaslr.md](docs/kaslr.md) — 各架构 KASLR 历史、默认文本基址、vmsplit、FG-KASLR |
| 绕过技术 | [docs/bypass-techniques.md](docs/bypass-techniques.md) — 文件系统泄露、侧信道、syscall / ioctl 泄露、弱熵、已修补的 CVE、任意读取 |
## 构建
由于使用了不可移植的代码(`MAP_ANONYMOUS`、
`getline()`、`popen()` 等),因此需要一个支持 `_GNU_SOURCE` 宏的编译器。
```
make # build kasld + components
make run # build and run
make test # build and run unit tests
make cross # cross-compile for all supported architectures
make install # install to /usr/local (PREFIX=/usr/local)
make installcheck # smoke-test the installed bin/kasld + libexec/kasld/
make uninstall # remove installed files
make clean # remove build directory
make print-deps # list build dependencies (libs + per-component flags)
make help # show all targets and options
```
`make print-deps` 报告所需的工具链、两个可选库
(`pthread`、`zlib`)及其在当前编译器下的自动检测结果,
以及各组件的编译/链接标志例外情况——这足以
填充发行版软件包的控制文件,而无需阅读 Makefile 的探测逻辑。
`make installcheck` 运行已安装的 `bin/kasld` 并确认它
通过 FHS `../libexec/kasld` 路径发现其组件——这是一项用于
分离式安装布局的安装后冒烟测试,使用与 `make install` 相同的
`PREFIX`/`DESTDIR`(因此它也适用于包 CI 中的 `DESTDIR` 过渡根目录)。
`make install` 还会将 `kasld` 和 `ksymoff` 的 `man1` 手册页安装到
`/share/man/man1/`,因此在安装后 `man kasld` 和 `man ksymoff` 即可使用。
KASLD 可以通过 `make` 指定适当的
编译器(`CC`)进行交叉编译。交叉编译时会自动应用静态链接:
```
make CC=aarch64-linux-musl-gcc
```
构建所有受支持的交叉编译目标(工具链必须位于 `PATH` 中):
```
make cross
```
## 许可证
KASLD 采用 MIT 许可证。它包含了修改过的第三方代码
片段和概念验证代码;这些片段可能带有不同的
许可条款。有关署名和许可的详细信息,请参阅每个文件注释头中的参考 URL。标签:Bing搜索, Hakrawler, KASLR绕过, Linux内核, 内存布局探测, 安全渗透, 客户端加密, 漏洞利用辅助