
kasld v0.4.0
KASLD 从本地进程对 Linux 内核的虚拟和物理内存布局进行去随机化,利用其视角——权限、配置和隔离——所允许的一切手段。
KASLD 可从本地进程恢复 Linux 内核的虚拟与物理内存布局——主要是内核代码段基址。它能恢复的内容取决于该进程的观测视角:其权限与能力、系统配置,以及任何容器隔离。在存在泄漏或侧信道的情况下,它可直接恢复基址;否则,它会将基址缩小到现有证据所能支持的最小可能位置集合。
推理引擎将来自数十种独立技术的证据与架构已知的不变量融合,将内核位置缩小到一个残余窗口——以存活的 slots(KASLR 可能选择的位置)数量及其所代表的熵位数来报告:这是 KASLR 从该视角所保留保护的上界,而非基址超出攻击者触及范围的保证(参见 docs/limitations.md)。
在加固目标上——即不存在直接内核代码段泄漏、且其架构与 CPU 暴露的侧信道均被关闭的目标——完全恢复通常不可能,但约束集很少为空。在没有 KASLR 的架构上,引擎会定位引导加载程序所选择的加载地址。
支持:
- x86 (i386+, amd64)
- ARM (armv6, armv7, armv8, aarch64)
- MIPS (mipsbe, mipsel, mips64, 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,以及 %pK 指针哈希)会收窄文件系统预言机路径,但这只是观测视角的一个维度:侧信道、弱熵以及能力授予的技术均独立于这些 sysctl。用于测试时,extra/weaken-kernel-hardening 脚本可临时放宽这些设置(需要 root)。
示例输出
默认文本模式会打印以答案为先的概览:
KASLD 0.4.2-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 512 2 MiB
Virtual Image Base likely 0xffffffff93400000 slide +0x12400000 1 2 MiB
Physical Image Base guaranteed 0x1000000 - 0x3d400000 474 2 MiB
Physical Image Base likely 0x1000000 - 0x3c29d000 474 2 MiB
Direct Map Base guaranteed 0xffff800000000000 - 0xffffa4aa80000000 37,547 1 GiB
Vmalloc Base guaranteed 0xffff898000000000 - 0xffffd6d580000000 79,191 of 79,191 1 GiB
Vmemmap Base guaranteed 0xffffa98040000000 - 0xfffffd0000000000 85,504 1 GiB
Module Region Base guaranteed 0xffffffffa0000000 - 0xffffffffff000000 389,121 4 KiB
Module Region Base likely 0xffffffffc0000000 - 0xffffffffc0400000 1,025 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]
Certainty 列区分了对同一量的两种不同断言。guaranteed 行是经过证明的:真实值位于该窗口内。likely 行是证据所支持的最佳单一估计——始终是 guaranteed 窗口的子集,且可能出错,因为它依赖低于可靠性下限的信号,例如时序侧信道。值得直接采取行动的结果是收窄到单一候选的 guaranteed 行;likely 值是需要确认的线索,而非可依赖的事实。
-v 会添加完整的详细输出(横幅、系统配置块、逐组件日志、KASLR 分析、内存布局图)。-j 输出机器可读的 JSON——完整的结构化视图,始终包含逐组件记录与加固评估。-1 输出单行可管道传递的 shell 输出。-m 格式化为适用于问题跟踪器。-H 将加固评估附加到文本/markdown 报告中。
完整的 CLI、输出模式详情、解释模式与加固评估参见 docs/usage.md。
观测视角
KASLD 能恢复的内容取决于运行进程的 观测视角——不是单一权限级别,而是三个独立要素的组合:
- 权限、组与能力——非特权 uid、属于诸如
adm之类的组(该组授予/var/log/下的内核日志访问权)、持有额外能力的容器任务,或 root。这些并不构成单一阶梯,因为文件系统权限独立地控制每个来源:被授予CAP_SYS_RAWIO的容器在该检查中是 init 命名空间的 root,可以读取/proc/kcore——这是普通用户无法触及的泄漏——而各发行版对于诸如/boot/System.map之类的文件是否全局可读则各不相同。 - 系统配置——
kptr_restrict、dmesg_restrict、perf_event_paranoid、非特权 BPF、内核 lockdown。配置独立于权限:在kptr_restrict=2下 root 也无法读取/proc/kallsyms,而放宽的 sysctl 或非特权 BPF 则可能将加固系统会拒绝的泄漏交给普通用户。 - 隔离——命名空间或 seccomp 沙箱会屏蔽
/proc预言机或阻止系统调用,从而收窄任何权限级别所能观测到的内容。
这三个维度独立地控制每个泄漏来源——因此更高权限并非更低权限的超集:配置可以对 root 拒绝某个来源,而侧信道则完全绕过 sysctl。docs/usage.md 中有一张按门控划分的泄漏来源矩阵,展示每个来源由哪个维度控制。
KASLD 默认假设权限很少,并机会性地利用观测视角所授予的一切。所报告的 guaranteed 窗口从不依赖权限:提升的访问权限或弱配置可以扩大所尝试的范围,但绝不会扩大证据所证明的可靠布局。详细(-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(添加泄漏组件或推理规则)。下表按主题索引文档。