Freescale BookE32 的 KASLR

KASLR 一词代表内核地址空间布局随机化(Kernel Address Space Layout Randomization)。

本文档旨在解释 Freescale BookE32 的 KASLR 实现。KASLR 是一项安全功能,可以阻止依赖于了解内核内部位置的漏洞利用尝试。

由于已经支持了 CONFIG_RELOCATABLE,我们需要做的是将内核映射或复制到一个合适的地方并进行重定位。Freescale Book-E 部件期望低端内存(lowmem)由固定的 TLB 条目(TLB1)映射。TLB1 条目不适合直接在随机化区域中映射内核,因此我们选择将内核复制到合适的地方并重启以进行重定位。

熵来源于 banner 和计时器基址,它们在每次构建和引导时都会改变。这不够安全,因此引导加载程序(bootloader)还可以通过设备树中的 /chosen/kaslr-seed 节点额外传递熵。

我们将使用低端内存的前 512M 来随机化内核镜像。内存将被划分为 64M 的区域(zones)。我们将使用熵的低 8 位来决定 64M 区域的索引。然后,我们在 64M 区域内选择一个 16K 对齐的偏移量来放置内核。

KERNELBASE

    |-->   64M   <--|
    |               |
    +---------------+    +----------------+---------------+
    |               |....|    |kernel|    |               |
    +---------------+    +----------------+---------------+
    |                         |
    |----->   offset    <-----|

                          kernstart_virt_addr

要启用 KASLR,请设置 CONFIG_RANDOMIZE_BASE = y。如果启用了 KASLR 并且您想在运行时禁用它,请在内核命令行中添加 “nokaslr”。