bcoles/kasld

GitHub: bcoles/kasld

KASLD 是一款多架构 Linux 内核 KASLR 去随机化工具,通过推理引擎融合多种信息泄露与侧信道技术,评估内核地址布局在当前权限与配置下的暴露程度。

Stars: 500 | Forks: 51

KASLD logo generated with Copilot (cropped)

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

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内核, 内存布局探测, 安全渗透, 客户端加密, 漏洞利用辅助