Hotdry.
ai-security

Google Project Zero KASLR被动绕过:线性映射静态特性深度分析

深入分析Google Project Zero关于KASLR被动绕过技术的研究,重点解析arm64架构下线性映射区域的静态特性以及如何通过系统行为观察无需主动攻击即可获取内核基址。

Google Project Zero KASLR 被动绕过:线性映射静态特性深度分析

引言

在内核安全防护体系中,内核地址空间布局随机化(KASLR)一直被视为防御内核级攻击的重要屏障。然而,Google Project Zero 团队的最新研究揭示了一个令人震惊的事实:在 arm64 架构上,KASLR 的防护效果远未达到预期。攻击者无需利用任何安全漏洞,仅通过观察系统架构特性就能被动获取精确的内核基址信息,从而绕过 KASLR 保护。

这项研究的独特价值在于,它不是通过传统的漏洞利用技术,而是深入分析系统设计层面的内在缺陷,为我们展示了被动信息泄露的强大威力。

arm64 线性映射的静态设计缺陷

线性映射的工作原理与问题

Linux 内核中的线性映射(Linear Mapping)是一个重要的内核虚拟地址空间区域,它提供物理内存的直接 1:1 映射。在理想情况下,这个区域应该在虚拟地址空间中被随机化放置,以防止攻击者预测物理地址到虚拟地址的转换。

然而,在 arm64 架构上,研究发现了关键的设计缺陷。内核使用以下宏计算线性映射虚拟地址:

#define phys_to_virt(x) ((unsigned long)((x) - PHYS_OFFSET) | PAGE_OFFSET)

问题出现在这里:PAGE_OFFSET在 Android 的 39 位虚拟地址空间中被硬编码为0xffffff8000000000,而PHYS_OFFSET通过memstart_addr变量确定。关键发现是,memstart_addr在现代 arm64 系统上不再是随机化的变量。

内存热插拔与随机化的技术冲突

Linux 内核开发者面临一个根本性的架构设计矛盾:内存热插拔功能(CONFIG_MEMORY_HOTPLUG=y)的需求与线性映射随机化之间的冲突。

Android 在 arm64 平台上使用 4KiB 页面大小和 3 级分页,虚拟地址空间被限制在 39 位。这与 x86-64 桌面系统使用 4 级分页和 48 位虚拟地址空间形成鲜明对比。Linux 内核团队选择将线性映射放置在虚拟地址空间的最低可能位置,以支持未来可能的大容量内存热插拔需求。

这种设计决策的直接后果是:线性映射在虚拟地址空间中的位置变得完全可预测。研究表明,自 commit 1db780bafa4c后,Linux 内核团队正式放弃了 arm64 架构中线性映射的虚拟地址随机化支持。

静态内核地址计算的实战方法

Pixel 设备:物理地址的静态化

问题进一步恶化。在 Google Pixel 设备上,内核引导程序每次都以完全相同的物理地址0x80010000解压缩内核。这与许多其他设备(如 Samsung S25)形成对比,后者会随机化内核的物理加载位置。

结合线性映射的静态特性,Pixel 设备的这种设计意味着:

  1. 物理地址完全可预测
  2. 内核符号的虚拟地址可通过简单数学计算获得
  3. KASLR 滑动值变得无关紧要

实际攻击演示:modprobe_path 案例

研究中的实际演示清晰展示了这种攻击方法的有效性。研究人员通过以下步骤成功获取modprobe_path字符串的内核虚拟地址:

  1. 符号偏移计算:从/proc/kallsyms获取相关内核符号的地址
  2. 物理地址推导:通过固定的内核基址0x80010000加上符号偏移
  3. 虚拟地址计算:应用phys_to_virt()公式
  4. 验证访问:使用 BPF 辅助函数直接读取计算地址

关键发现是,在 Pixel 设备上,modprobe_path将始终在虚拟地址0xffffff8001ff2398处可访问,无论 KASLR 是否启用。

技术实现细节

这种攻击方法的技术优势在于其惊人的简单性:

  • 计算公式:攻击者只需使用硬编码的静态内核基址0xffffff8000010000
  • 无需 KASLR 泄露:传统需要泄露的 KASLR 滑动值变得不必要
  • 任意读写原语:线性映射内存对.data 段提供读写权限

虽然.text 段在此情况下不可执行,限制了 ROP 攻击,但任意读写能力对大多数内核攻击场景已足够。

跨设备影响:超越 Pixel 的普遍问题

物理地址随机化设备的脆弱性

尽管 Pixel 设备的问题最为严重,但研究揭示了更广泛的安全影响:即使在实现了物理地址随机化的设备上,线性映射的不随机化仍显著降低系统整体安全性。

物理页面分配的可预测性实验

研究进行了开创性的实验分析:在 Samsung S23 设备上分配约 5GB 物理内存,然后分析物理页面帧号(PFN)的分配模式。这项研究进行了 100 次独立测试(每次重启设备),揭示了令人担忧的一致性模式。

实验结果的关键发现:

  • 高可靠性范围:存在 PFN 范围,攻击者控制的页面在这些范围内被持续分配
  • 可利用的一致性:某些物理页面的分配模式高度可预测
  • 攻击向量扩展:攻击者可以将数据放置在已知的内核虚拟地址

内存喷射攻击的改进

这种发现为攻击者提供了强大的攻击向量:

  1. 预测性内存布局:可预测的物理页面分配模式
  2. 精确的虚拟地址映射:通过线性映射将物理地址映射到已知虚拟地址
  3. 增强的利用技术:改进的 UAF 攻击和堆喷射技术

防护挑战与改进方向

立即可行的技术改进

研究指出了三个关键的改进方向:

  1. 线性映射位置随机化:在内核虚拟地址空间中随机化线性映射位置
  2. 物理页面分配熵增强:提高物理页面分配的随机性
  3. 内核物理地址随机化:确保内核在物理地址空间中的随机化加载

技术实现的挑战

虽然这些改进从安全角度具有明显优势,但面临实际的工程挑战:

  • 内存热插拔兼容性:必须保持对现有内存热插拔功能的支持
  • 性能影响评估:随机化可能带来的性能开销需要权衡
  • 系统稳定性:不能破坏现有的硬件抽象和软件兼容性

架构设计的重新思考

这项研究提醒我们,系统安全设计需要在功能性和安全性之间找到更好的平衡。内存热插拔等高级功能不应以牺牲基础安全机制为代价。

结论:安全架构设计的重要教训

Google Project Zero 的这项研究揭示了 KASLR 在 arm64 架构上的根本性局限。线性映射的静态特性和设备特定的物理地址固定化共同创造了一个环境,使得传统的 "安全通过模糊性" 理念失效。

这种被动信息泄露方法的重要意义在于:

  1. 无需漏洞利用:攻击者不需要发现或利用安全漏洞
  2. 系统架构依赖:攻击基于系统设计的内在特性
  3. 跨设备影响:问题不仅限于特定设备型号
  4. 长期安全风险:这种攻击面在可预见的未来仍然存在

从防护角度而言,这项研究强调了深度安全设计的重要性。KASLR 等缓解措施虽然对远程攻击仍有价值,但对于本地攻击者来说已不足以提供有效保护。

最终,这项研究不仅为我们提供了对当前安全态势的深刻洞察,更重要的是为未来内核安全设计提供了宝贵的指导。随着移动设备安全威胁的不断演变,我们必须在系统设计初期就将安全考虑融入架构决策中。


参考资料

  • Google Project Zero 博客原始研究
  • Linux 内核 arm64 架构源码分析
  • 内核提交 1db780bafa4c - 线性映射随机化设计决策
查看归档