
kasld v0.4.0
KASLD 从本地进程对 Linux 内核的虚拟和物理内存布局进行去随机化,利用其视角——权限、配置和隔离——所允许的一切手段。
KASLD 从本地进程恢复 Linux 内核的虚拟和物理内存布局——主要是内核代码基址——并尽可能利用该进程视角所允许的一切:其权限与能力、系统配置以及任何容器限制。在存在泄漏或侧信道的情况下,它直接恢复内核代码基址;否则,它将范围缩小到现有证据所支持的最小放置集合。推理引擎将来自数十种独立技术的证据与架构已知的不变量融合,将内核的放置范围缩小到一个残余窗口——以存留槽位数和熵位数报告:这是 KASLR 从此视角保留的保护的上界,而非保证基址在攻击者触及范围之外(参见 docs/limitations.md)。在完全修补的现代内核上——x86-64 侧信道已被缓解且没有直接的内核代码泄漏存留——完全恢复通常不可能,但约束集很少为空。在没有 KASLR 的架构上,引擎定位引导加载程序选择的加载地址。
支持:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64el)
- PowerPC (ppc, ppcle, ppc64, ppc64le)
- 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/<arch>/kasld
build/<arch>/ 目录是自包含的,可以部署到目标系统:
build/<arch>/
kasld <- run this
components/ <- leak components
加固配置(kernel.dmesg_restrict=1、kernel.kptr_restrict=1、kernel.perf_event_paranoid=2 或更高、kernel.unprivileged_bpf_disabled=1)会收窄文件系统预言机路径,但这只是视角的一个维度:侧信道、弱熵和授予能力的技术独立于这些 sysctl。用于测试时,extra/weaken-kernel-hardening 脚本可以临时放宽这些设置(需要 root)。
示例输出
默认文本模式打印以答案为先的概览:
KASLD 0.3.1-dev -- Kernel Address Space Layout Derandomization
Target: x86_64 / 7.0.0
Running 117 of 120 components (3 experimental skipped; use -x to enable)...
[####################] 100% 117/117 40.9s
1 component timed out after 30s and was killed (prefetch_directmap)
Quantity Certainty Window Candidates Grain
------------------- ---------- --------------------------------------- -------------- -----
Virtual Image Base guaranteed 0xffffffff81000000 - 0xffffffffbd400000 483 of 505 2 MiB
Virtual Image Base likely 0xffffffff93400000 slide +0x12400000 1 of 483 2 MiB
Physical Image Base guaranteed 0x1000000 - 0x3d400000 474 of 8185 2 MiB
Physical Image Base likely 0x1000000 - 0x3c29d000 474 of 474 2 MiB
Direct Map Base guaranteed 0xffff800000000000 - 0xffffa4aa80000000 37547 1 GiB
Vmalloc Base guaranteed 0xffff898000000000 - 0xffffd6d580000000 79191 of 79191 1 GiB
Vmemmap Base guaranteed 0xffffa98040000000 - 0xfffffd0000000000 85504 1 GiB
Module Region Base guaranteed 0xffffffffa0000000 - 0xffffffffff000000 389121 4 KiB
Module Region Base likely 0xffffffffc0000000 - 0xffffffffc0400000 1025 of 389121 4 KiB
Paging Level guaranteed 48 1 of 2 -
Note: physical and virtual text randomize independently
Note: 1 sub-range excluded from the windows above; the counts
already reflect them (-v lists the ranges).
Evidence (1 finding, 2 components)
Region Position Address Sources
----------------- -------- ------------------ -------
virt kernel image base 0xffffffff93400000 2
[-v: detailed results, memory map, system info] [-H: hardening assessment]
-v 添加完整的详细输出(横幅、系统配置块、逐组件日志、KASLR 分析、内存布局映射)。-j 输出机器可读的 JSON——完整的结构化视图,始终包含逐组件记录和加固评估。-1 输出单行可管道传输的 shell 输出。-m 为问题跟踪器格式化。-H 将加固评估附加到文本/markdown 报告中。
参见 docs/usage.md 了解完整 CLI、输出模式详情、解释模式和加固评估。
视角
KASLD 能恢复什么取决于运行进程的视角——不是单一权限级别,而是三个独立事物的组合:
- 权限、组和能力——非特权 uid、属于诸如
adm之类的组(授予/var/log/下的内核日志访问权)、持有额外能力的容器任务,或 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 可以向普通用户提供加固系统会拒绝的泄漏。 - 限制——命名空间或 seccomp 沙箱会屏蔽
/proc预言机或阻止系统调用,收窄任何权限级别所观察到的内容。
这三个轴独立地门控每个泄漏来源——因此更多权限并非更少权限的超集:配置可以拒绝 root 访问某个来源,而侧信道完全绕过 sysctl。docs/usage.md 有一个按门控划分的泄漏来源矩阵,显示每个来源由哪个轴控制。
KASLD 默认假设权限很少,并机会性地利用视角所授予的一切。报告的保证窗口从不依赖权限:提升的访问或弱配置可以扩大所尝试的范围,但绝不会扩大证据所证明的可靠布局。详细(-v)、JSON(-j)和 Markdown(-m)输出报告检测到的视角——容器、限制、可读预言机,以及从当前能力可触及的能力门控泄漏。
文档
KASLD 新手?按顺序阅读:docs/kaslr.md(KASLR 是什么以及它随机化什么)→ docs/architecture.md → A leak from end to end(KASLD 如何将一次泄漏转化为答案)→ docs/limitations.md(结果证明什么和不证明什么)→ CONTRIBUTING.md(添加泄漏组件或推理规则)。下表按主题索引文档。
| 主题 | 文档 |
|---|---|
| KASLR 入门 | docs/kaslr.md — 各架构 KASLR 历史、默认代码基址、vmsplit、FG-KASLR |
| 用法与 CLI | docs/usage.md — CLI、输出模式、解释模式、加固评估 |
| 解读结果 | docs/limitations.md — 负面或部分结果意味着什么:可靠但不完整,以及为什么失败不是安全保证 |
| 绕过技术 | docs/bypass-techniques.md — 文件系统泄漏、侧信道、系统调用 / ioctl 泄漏、弱熵、已修补的 CVE、任意读取 |
| 利用 | docs/exploitation.md — KASLR 破解在漏洞利用中的位置、控制流与纯数据、pwntools 模板、ksymoff |
| 足迹与检测 | docs/footprint.md — 一次运行在被监控主机上的样子:用于检测它的行为特征,以及操作员的 OPSEC 成本;设计上就是高调的 |
| 实用工具 | extra/README.md — extra/ 辅助脚本(捕获/重放、可靠性验证、态势差异、ksymoff)以及它们如何组合 |
| 架构与内部 | docs/architecture.md — 推理引擎、数据流接缝、标记行协议、跨区域推导 |
| 贡献 | CONTRIBUTING.md — 编写组件或规则、发射器 API、退出码、元数据 |
| 测试与 CI | docs/testing.md — 主机测试、重放夹具、qemu-user 下的跨架构、覆盖率 |
| 可复现性 | docs/reproducibility.md — 独立验证:在本地内核上、跨架构实时,或在捕获语料库上 |
构建
由于使用了非可移植代码(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 手册页安装到 <prefix>/share/man/man1/,因此安装后 man kasld 和 man ksymoff 可以工作。
KASLD 可以通过指定适当的编译器(CC)用 make 交叉编译。交叉编译时会自动应用静态链接:
make CC=aarch64-linux-musl-gcc
构建所有支持的交叉编译目标(工具链必须在 PATH 中):
make cross
许可证
KASLD 采用 MIT 许可证(参见 LICENSE)。一些泄漏组件改编了第三方概念验证代码或实现了他人首次发布的技术;每个此类文件在其头部注明原作者和来源,THIRD-PARTY-NOTICES.md 列出了每个文件及其许可证或复用依据(上游许可证、作者许可,或在此重新实现的技术/复现材料)。
引用 KASLD
KASLD 采用 MIT 许可证——使用不要求署名,但在研究、工具、漏洞利用或写作中引用时,若能提供引用或链接将不胜感激:
KASLD: Kernel Address Space Layout Derandomization, Brendan Coles, https://github.com/bcoles/kasld
BibTeX:
@software{kasld,
title = {KASLD: Kernel Address Space Layout Derandomization},
author = {Coles, Brendan},
url = {https://github.com/bcoles/kasld},
version = {0.3.0},
year = {2026}
}
GitHub 还会从 CITATION.cff 显示一个*"Cite this repository"*按钮。对于来自 master 的未发布构建,请引用具体提交和访问日期——例如 bcoles/kasld@<commit>(访问日期 YYYY-MM-DD)——因为 -dev 版本字符串并非单个提交所独有。