Intel 和 ARM 对ROP/COP/JOP的缓解措施

文章目录

前言

前向转移(forward):将控制权定向到程序中一个新位置的转移方式, 就叫做前向转移, 比如jmp和call指令。这里我们主要保护的间接跳转,间接跳转是运行时才知道函数地址,而直接跳转在编译阶段就已经确定(攻击者很难利用)。

后向转移(backward):而将控制权返回到先前位置的就叫做后向转移, 最常见的就是ret指令。

现代CPU的增强功能,如非可执行堆栈和非可写代码页,有助于防止传统形式的代码注入。然而,比如在x86架构中,指令解码可以从任意字节开始,这为攻击者提供了一组不同于程序员意图的指令。

攻击者可以扫描代码以寻找有意义的代码片段(称为gadgets),并通过以下技术将它们链接在一起构建恶意载荷:

(1)ROP(Return Oriented Programming):攻击者利用现有的代码序列,通常以返回指令结束,构建一系列指令链来实现恶意目标。通过将这些代码片段链接在一起,攻击者可以操纵控制流程,执行任意操作,而无需注入新代码。

(2)JOP(Jump Oriented Programming):攻击者利用跳转指令(如条件跳转或无条件跳转)构建一系列指令,以改变程序的执行流程来实现其目标。通过控制这些跳转指令的目标地址,攻击者可以将程序的执行流程重定向到特定的代码片段。

(3)COP(Call Oriented Programming):与ROP类似,攻击者利用涉及函数调用的现有代码序列构建一系列指令,用于恶意目的。通过调用这些现有的代码片段,攻击者可以在它们之间交错和操纵执行流程。

这里以ROP为例,ROP(Return Oriented Programming)是攻击者依赖于RET(返回)指令来拼接一个不符合程序员意图的恶意代码流的技术。根据设计,返回指令从堆栈中获取下一条指令的地址(该地址是由之前的CALL指令将其推入堆栈),然后执行该地址处的指令。在基于ROP的攻击中,攻击者会预先或在运行时扫描现有程序代码中的字节序列,通过扫描磁盘或内存中的程序来寻找。图1显示了现有指令流的示例:

这个例子展示了一个按顺序执行的三条指令(请注意,在这个程序员意图的序列中没有RET指令),下方的蓝色方框显示了程序对应的字节。当以无效的偏移开始解释相同的代码字节时,它也可以表示导致序列以RET结束的另一组指令,如下图所示,红色方框中的字节对应于不同的指令序列,在这个例子中,每条指令后面都是C3,对应于返回指令。这些指令序列被称为"gadgets"(小工具):

这个例子中的指令序列展示了如何通过重新解释现有的代码字节,构造出具有不同功能的指令序列。攻击者可以扫描程序中的代码,找到这些"gadgets",并将它们链接在一起,以形成一个恶意的ROP链。这种技术利用了现有代码的片段来绕过执行非预期指令的限制,从而实现攻击者的目的。

通过仔细放置这些备用指令集或"gadgets"的起始地址(这些指令集都以ret指令结束),攻击者可以使用原始程序的可执行字节执行原始程序中未预期的任意攻击代码流。因此,使用ROP攻击,攻击者可以使用现有程序的字节组合执行任意代码,继承程序的所有权限。这使得这些攻击具有高效且难以检测的特点,并有可能允许攻击者升级权限或突破进程沙盒。这类恶意软件针对操作系统(OS)、浏览器、阅读器和许多其他应用程序,为了以最小的性能影响提供更有效的保护,需要与硬件基础深度整合。

接下来描述 Intel 和 ARM 预防前向( call/jmp )和后向( ret )控制流指令劫持的一些技术。

一、ROP

1.1 Intel

(1)软件方面:无(ShadowCallStack在LLVM 9.0中已被移除)

(2)硬件方面:Intel CET (SHADOW-STACK) -- Linux 6.6 这个内核版本终于增加了对英特尔影子堆栈硬件功能的支持。

c 复制代码
SHADOW STACK: Enhanced protection against ROP attacks

1.2 ARM

(1)软件方面:Clang的Shadow Call Stack -- Linux 5.8 这个内核版本在ARM64架构上增加了对Clang的Shadow Call Stack的通用支持(使用平台寄存器x18)。

(2)硬件方面:ARM pointer authentication。ARMv8.3-A新增内容包括指针认证指令。

二、COP/JOP

2.1 Intel

(1)软件方面:Clang Control Flow Integrity,这种检查通常被称为 "forward-edge CFI",因为它保护了对函数的间接调用。Linux 5.13 这个版本增加了 LLVM control-flow integrity(CFI)机制的支持。

CFI(Control-Flow Integrity)关注的就是间接jmp、间接call、ret这几种指令控制流的完整性。

(2)硬件方面:Intel CET(ENDBRANCH -- IBT(indirect branch tracking)) -- Linux 5.18 这个内核版本终于增加了对英特尔IBT硬件功能的支持。

c 复制代码
ENDBRANCH: Enhanced protection against JOP/COP attacks

2.2 ARM

(1)软件方面:Clang Control Flow Integrity,这种检查通常被称为 "forward-edge CFI",因为它保护了对函数的间接调用。Linux 5.13 这个版本增加了 LLVM control-flow integrity(CFI)机制的支持。

(2)硬件方面:Branch-Target Identification(BTI)-- Linux 5.8 这个内核版本对用户空间和内核空间提供了ARMv8.5-BTI的支持。

相关推荐
jimmyleeee8 小时前
大模型安全之五十一:OWASP LLM Top 10 全景解读
人工智能·安全
wuyk5558 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
2035去旅行12 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
陈希12313 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡13 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
武天旭14 小时前
AI安全--AI大模型的对抗样本攻击与防御解析
人工智能·深度学习·安全·机器学习
Navigator_Z16 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
且从容.17 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道17 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
冻柠檬飞冰走茶18 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划