返回更新列表
新发布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 内核的虚拟和物理内存布局——主要是内核代码基址——并尽可能利用该进程视角所允许的一切:其权限与能力、系统配置以及任何容器限制。在存在泄漏或侧信道的情况下,它直接恢复内核代码基址;否则,它将范围缩小到现有证据所支持的最小放置集合。推理引擎将来自数十种独立技术的证据与架构已知的不变量融合,将内核的放置范围缩小到一个残余窗口——以存留槽位数和熵位数报告:这是 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=1kernel.kptr_restrict=1kernel.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_restrictdmesg_restrictperf_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
用法与 CLIdocs/usage.md — CLI、输出模式、解释模式、加固评估
解读结果docs/limitations.md — 负面或部分结果意味着什么:可靠但不完整,以及为什么失败不是安全保证
绕过技术docs/bypass-techniques.md — 文件系统泄漏、侧信道、系统调用 / ioctl 泄漏、弱熵、已修补的 CVE、任意读取
利用docs/exploitation.md — KASLR 破解在漏洞利用中的位置、控制流与纯数据、pwntools 模板、ksymoff
足迹与检测docs/footprint.md — 一次运行在被监控主机上的样子:用于检测它的行为特征,以及操作员的 OPSEC 成本;设计上就是高调的
实用工具extra/README.mdextra/ 辅助脚本(捕获/重放、可靠性验证、态势差异、ksymoff)以及它们如何组合
架构与内部docs/architecture.md — 推理引擎、数据流接缝、标记行协议、跨区域推导
贡献CONTRIBUTING.md — 编写组件或规则、发射器 API、退出码、元数据
测试与 CIdocs/testing.md — 主机测试、重放夹具、qemu-user 下的跨架构、覆盖率
可复现性docs/reproducibility.md — 独立验证:在本地内核上、跨架构实时,或在捕获语料库上

构建

由于使用了非可移植代码(MAP_ANONYMOUSgetline()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 报告所需的工具链、两个可选库(pthreadzlib)及其对当前编译器的自动检测结果,以及逐组件的编译/链接标志例外——足以填充发行版软件包的控制文件,而无需阅读 Makefile 的探测逻辑。

make installcheck 运行已安装的 bin/kasld 并确认它通过 FHS ../libexec/kasld 路径发现其组件——这是针对分离安装布局的安装后冒烟测试,使用与 make install 相同的 PREFIX/DESTDIR(因此它也能在包 CI 中针对 DESTDIR 暂存根工作)。

make install 还会将 kasldksymoffman1 手册页安装到 <prefix>/share/man/man1/,因此安装后 man kasldman 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 版本字符串并非单个提交所独有。

分类