SMEP / SMAP
SMEP / SMAP 是什么?
SMEP / SMAPSMEP 与 SMAP 是阻止内核执行或访问用户空间页面的 CPU 特性,可阻断常见的本地提权技术。
SMEP(Supervisor Mode Execution Prevention)与 SMAP(Supervisor Mode Access Prevention)是 x86_64 的硬件扩展,Intel 分别于 Ivy Bridge(2012)和 Broadwell(2014)引入;ARM 提供对应的 PXN 与 PAN。SMEP 使 CPU 在内核试图从用户态页取指执行时触发异常,阻断 ret2usr 攻击。SMAP 则在内核读取或写入用户页时触发异常,除非代码通过 stac/clac 临时置位 EFLAGS.AC(Linux 中表现为 copy_from_user 等包装函数)。两者共同消除了大量将载荷放在用户内存的内核漏洞,与 KASLR、kCFI、KPTI 和 CET 协同形成纵深防御。
● 示例
- 01
在 SMEP CPU 上,内核漏洞跳入用户态 shellcode 页时触发 #PF。
- 02
Linux 的 copy_from_user 在 SMAP 下用 stac/clac 访问用户缓冲区。
● 常见问题
SMEP / SMAP 是什么?
SMEP 与 SMAP 是阻止内核执行或访问用户空间页面的 CPU 特性,可阻断常见的本地提权技术。 它属于网络安全的 应用安全 分类。
SMEP / SMAP 是什么意思?
SMEP 与 SMAP 是阻止内核执行或访问用户空间页面的 CPU 特性,可阻断常见的本地提权技术。
SMEP / SMAP 是如何工作的?
SMEP(Supervisor Mode Execution Prevention)与 SMAP(Supervisor Mode Access Prevention)是 x86_64 的硬件扩展,Intel 分别于 Ivy Bridge(2012)和 Broadwell(2014)引入;ARM 提供对应的 PXN 与 PAN。SMEP 使 CPU 在内核试图从用户态页取指执行时触发异常,阻断 ret2usr 攻击。SMAP 则在内核读取或写入用户页时触发异常,除非代码通过 stac/clac 临时置位 EFLAGS.AC(Linux 中表现为 copy_from_user 等包装函数)。两者共同消除了大量将载荷放在用户内存的内核漏洞,与 KASLR、kCFI、KPTI 和 CET 协同形成纵深防御。
如何防御 SMEP / SMAP?
针对 SMEP / SMAP 的防御通常结合技术控制与运营实践,详见上方完整定义。
SMEP / SMAP 还有哪些其他名称?
常见的别称包括: SMEP, SMAP, PXN, PAN。
● 相关术语
- appsec№ 581
内核 ASLR(KASLR)
内核地址空间随机化(KASLR)在每次启动时随机化内核基址与模块加载地址,防止攻击者依赖固定内核符号进行本地提权。
- appsec№ 217
控制流完整性(CFI)
控制流完整性(CFI)将程序的间接调用和返回限制在预先计算的合法目标集合内,阻断 ROP 与 JOP 等控制流劫持利用。
- appsec№ 545
Intel CET
Intel CET(控制流强制技术)是一项 CPU 功能,结合硬件影子栈与间接分支跟踪(IBT)以阻断 ROP、JOP 和 COP 利用。
- appsec№ 670
内存安全
内存安全指程序绝不读取、写入或执行未合法分配的内存,从而消除整类漏洞的属性。
- appsec№ 303
数据执行保护(DEP)
DEP(又称 NX 位或 W^X)将内存页标记为不可执行,使攻击者无法运行注入到栈或堆中的 shellcode。
- appsec№ 925
面向返回的编程(ROP)
ROP 是一种代码复用利用技术,通过把以 RET 结尾的短指令序列(gadget)串成链来执行任意计算,而无需注入新代码。