返回更新列表
新发布Sep 12, 2026

kasld v0.4.0

KASLD 从本地进程对 Linux 内核的虚拟和物理内存布局进行去随机化,利用其视角——权限、配置和隔离——所允许的一切手段。

分享

KASLD logo generated with Copilot (cropped)

Build Status CodeQL Platform: Linux Architectures C99 Release License: MIT

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(添加泄漏组件或推理规则)。下表按主题索引文档。

分类