NX 位:不只是安全那么简单
The NX bit is not just about security
在开发 postmarketOS 的 ARM64 裸机 hypervisor 时,我遇到了一个诡异的故障:一旦启用 CTR_EL0 拦截,手机就会随机死机。排查过程排除了寄存器损坏和硬件越界,最终锁定在一个看似无害的数组排序操作上。由于 ARM 架构的 Icache 与 Dcache 不连贯,动态修改代码段导致了指令缓存失效。更深层的挖掘揭示了一个微架构层面的陷阱:动态跳转指令 blr 触发了分支预测,导致 CPU 推测性地访问了未映射的物理地址,进而引发系统崩溃。这个案例生动地展示了 NX 位(不可执行位)在防止推测执行攻击之外的深层意义,以及 ARM 硬件在实现细节上那些不为人知的微妙之处。
动态分发采用分支预测,而静态分支则预先知晓目标地址,因此不会发生误预测。