1. DEP/NX(No Execute)位阻止数据页执行代码?
DEP/NX(No Execute)位是如何阻止数据页执行代码的?它依赖什么硬件机制,与纯软件方案相比有何优势?
- NX 位属于页表项(PTE)中的硬件标志,由 MMU 在取指阶段强制检查
- 依赖分段与分页两级地址转换中页表项的权限位
- 与 W^X、JIT 写入执行(W+X)页的工程矛盾
DEP(Data Execution Prevention)依赖 CPU 页表项中的 NX(No eXecute)位。现代 x86 在页表项第 63 位定义 NX 位,ARM 则通过 PXN/UXN 位实现;MMU 在地址翻译并取指令时检查该位,若页被标记为不可执行而当前指令取指命中此页,将触发页错误并交由操作系统处理。由于该检查发生在硬件地址转换路径上,任何普通数据页(栈、堆、匿名映射)即使被攻击者填充了 shellcode,也无法作为代码被 CPU 取指执行,从而在无需软件干预的情况下阻断栈溢出类攻击的经典利用链。
NX 位与 W^X 策略配合时存在工程取舍:W^X 要求内存页不能同时可写可执行,但 JIT 编译器(如 V8、JVM)需要在运行期生成代码,通常采用先写可写页、再通过 mprotect 切换为可执行页(或建立双映射)的方式折中。相比早期纯软件的堆栈不可执行模拟(如 Windows 的 SafeSEH 与软件模拟),NX 位由硬件强制执行,无运行时性能开销且无法被软件绕过,是现代操作系统默认启用的基础缓解措施,与 ASLR、CFI 等叠加形成纵深防御。
答题核心是讲清"硬件页表位 + MMU 取指检查"这条完整链路,并点明 NX 属于页权限而非段权限;再补充 W^X 与 JIT 的矛盾来体现工程理解深度。