高级检索

  • ISSN 1006-3080
  • CN 31-1691/TQ
引用本文:
Citation:

基于返回地址签名的控制流攻击检测方法

    作者简介: 余云飞(1991-),男,安徽阜阳人,硕士生,主要研究方向为安全芯片理论与设计。E-mail:974492111@qq.com;
    通讯作者: 汪鹏君, wangpengjun@nbu.edu.cn
  • 中图分类号: TP79

Detection of Control Flow Attacks Based on Return Address Signature

    Corresponding author: WANG Pengjun, wangpengjun@nbu.edu.cn ;
  • CLC number: TP79

  • 摘要: 攻击者利用软件漏洞劫持程序的执行流向,将其导向恶意代码shellcode或组成恶意代码指令处并执行,最终达到控制整个系统行为的目的,这种恶意攻击方式称为控制流攻击。通过对控制流攻击原理的研究,提出了基于返回地址签名的控制流攻击检测方法。该方法首先在处理器执行程序调用指令call时,触发伪随机数发生器生成密钥K与压栈返回地址进行异或操作,利用MD5算法为异或后的压栈返回地址生成压栈签名值;然后在执行程序返回指令ret及返回地址弹出堆栈时,使用密钥K与出栈返回地址进行异或操作,异或后的出栈返回地址作为MD5算法的输入,生成出栈签名值;最后根据压栈签名值与出栈签名值是否匹配检测控制流攻击。实验结果显示:返回地址签名值具有良好的随机性且攻击者可用的控制流指令平均减少率达到81.27%,可以有效地检测因返回地址被恶意篡改而引起的控制流攻击。
  • 图 FIG. 488.  FIG. 488.

    Figure FIG. 488..  FIG. 488.

    图 1  堆栈溢出攻击

    Figure 1.  Stack overflow attack

    图 2  检测控制流攻击整体框图

    Figure 2.  Overall block diagram of detecting control flow attacks

    图 3  伪随机数发生器

    Figure 3.  Pseudo-random number generator

    图 4  MD5算法框图

    Figure 4.  MD5 algorithm block diagram

    图 5  检测控制流攻击的处理器硬件架构图

    Figure 5.  Hardware architecture diagram for detecting control flow attacks

    图 6  检测控制流攻击的处理器工作流程图

    Figure 6.  Flow chart of detecting control flow attacks

    图 7  仿真波形图

    Figure 7.  Simulation waveform

    图 8  数据自相关性

    Figure 8.  Data autocorrelation

    图 9  数据互相关性

    Figure 9.  Data cross-correlation

    图 10  正确与错误地址签名值之间的汉明距离

    Figure 10.  Hamming distance between correct and wrong signatures

    表 1  返回地址签名值数据输出

    Table 1.  Return address signature

    No.Return addressSignature
    10x043bE0DF7A89_C8337D3F_5BADAB88_AD94DE63
    20x041e6A5626C4_198A9FB2_EF3A7113_992E7B5F
    30x03faADEF12B3_A694ACC4_C1FB6954_79F81655
    40x042822A9D7C1_809C0411_94F4E236_BFEFBFC0
    50x034f55282EB7_6B91B63E_13B65DC3_B5D13522
    60x043d5D730D12_753F00DA_A7FE84FA_B5D14756
    70x065d1964EE3E_4A2DD5E4_6BECA038_709B7729
    下载: 导出CSV

    表 2  控制流指令消除率

    Table 2.  Control flow instructions elimination rate

    TestbenchNumbers of instructionsNumbers of control flow instructionsNumbers of call and ret instructionsControl flow instructions eliminate rate/ %
    Vul373514180.39
    Mines32 1482 1361 83185.72
    Orage90 4422 3131 71374.05
    Eog126 1126 4655 25381.25
    Gedit133 9128 4417 17084.94
    下载: 导出CSV
  • [1] ABADI M, BUDIU M, ERLINGSSON U, et al. A theory of secure control flow[C]//International Conference on Formal Engineering Methods. Berlin: Springer, 2005: 111-124.
    [2] DAVI L, SADEGHI A R, LEHMANN D. Stitching the gadgets: On the ineffectiveness of coarse-grained control-flow integrity protection[C]//SEC'14 Proceedings of the 23rd USENIX Conference on Security Symposium 2014. San Diego: ACM, 2014: 401-416.
    [3] DAS S, ZHANG W, LIU Y. A fine-grained control flow integrity approach against runtime memory attacks for embedded systems[J]. IEEE Transaction on Very Large Scale Integration (VLSI) Systems, 2016, 24(11): 3193-3207. doi: 10.1109/TVLSI.2016.2548561
    [4] LI J K, TONG X M, ZHANG F W, et al. FINE-CFI: Fine-grained control-flow integrity for operating system kernels[J]. IEEE Transaction on Information Forensics and Security, 2018, 13(6): 1535-1550. doi: 10.1109/TIFS.2018.2797932
    [5] DAVI L, KOEBERL P, SADEGHI A. Hardware-assisted fine-grained control flow integrity: Towards efficient protection of embedded systems against software exploitation[C]//51st Annual Design Conference on Design Automation Conference. San Francisco: IEEE, 2014: 1-6.
    [6] LU G R, CHEN L W, SHI G. SMP: A new mechanism to mitigate control-flow hijacking attacks[C]//2018 3rd International Conference on Information Systems Engineering. Shanghai: IEEE, 2018: 51-55.
    [7] LI Y, DAI Z, LI J W. A control flow integrity checking technique based on hardware support[C]//2018 IEEE 3rd Advanced Information Technology, Electronic and Automation Control Conference. Chongqing: IEEE, 2018: 2617-2621.
    [8] QIU P F, LYU Y Q, ZHANG J L, et al. Control flow integrity based on lightweight encryption architecture[J]. IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, 2018, 37(7): 1538-1369.
    [9] ZHANG J L, QI B H, QIN Z, et al. HCIC: Hardware-assisted control-flow integrity checking[J]. IEEE Internet of Things Journal, 2018, 6(1): 458-471.
    [10] HARRISON W L, ALLWEIN G. Language abstractions for hardware-based control-flow integrity monitoring[C]//2018 International Conference on Reconfigurable Computing and FPGAs. Cancun Mexico: [s.n.], 2018: 1-6.
    [11] 张裔智, 赵毅, 汤小斌. MD5算法研究[J]. 计算机科学, 2008, 35(7): 295-297. doi: 10.3969/j.issn.1002-137X.2008.07.083
    [12] 彭雅岚, 肖顺文. 基于FPGA的LFSR结构伪随机数发生器的实现[J]. 数字技术与应用, 2018, 36(3): 91-92.
  • 加载中
图(11)表(2)
计量
  • 文章访问数:  748
  • HTML全文浏览量:  412
  • PDF下载量:  24
  • 被引次数: 0
出版历程
  • 收稿日期:  2019-08-26
  • 网络出版日期:  2020-07-27
  • 刊出日期:  2020-12-30

基于返回地址签名的控制流攻击检测方法

    作者简介:余云飞(1991-),男,安徽阜阳人,硕士生,主要研究方向为安全芯片理论与设计。E-mail:974492111@qq.com
    通讯作者: 汪鹏君, wangpengjun@nbu.edu.cn
  • 1. 宁波大学电路与系统研究所,浙江 宁波 315211
  • 2. 温州大学电气与电子工程学院,浙江 温州 325035

摘要: 攻击者利用软件漏洞劫持程序的执行流向,将其导向恶意代码shellcode或组成恶意代码指令处并执行,最终达到控制整个系统行为的目的,这种恶意攻击方式称为控制流攻击。通过对控制流攻击原理的研究,提出了基于返回地址签名的控制流攻击检测方法。该方法首先在处理器执行程序调用指令call时,触发伪随机数发生器生成密钥K与压栈返回地址进行异或操作,利用MD5算法为异或后的压栈返回地址生成压栈签名值;然后在执行程序返回指令ret及返回地址弹出堆栈时,使用密钥K与出栈返回地址进行异或操作,异或后的出栈返回地址作为MD5算法的输入,生成出栈签名值;最后根据压栈签名值与出栈签名值是否匹配检测控制流攻击。实验结果显示:返回地址签名值具有良好的随机性且攻击者可用的控制流指令平均减少率达到81.27%,可以有效地检测因返回地址被恶意篡改而引起的控制流攻击。

English Abstract

  • 微电子技术、物联网技术和大数据技术的发展,使得嵌入式系统已经成为各个领域中不可或缺的角色,其在日常生活、工业生产、交通运输、移动支付等领域发挥越来越重要的作用,然而它们在通过网络进行数据交换、软件更新、对话的同时,也为攻击者提供了攻击通道。近年来控制流攻击事件不断发生,如2017年5月,WannaCry勒索病毒利用TCP445端口漏洞将系统控制流篡改到恶意代码处,进而实施了控制流攻击,造成至少150个国家和地区受到攻击,严重影响金融、能源、医疗等行业的正常运行。相比于木马攻击、旁道攻击、反向工程等硬件载体攻击,控制流攻击具有有效性高、可行性强以及与其他攻击模式兼容等特性,因此防御控制流攻击,保障嵌入式系统的安全性已经成为当前各领域的迫切需求。

    由于控制流攻击的危害性巨大,许多防御控制流攻击的方法相继被提出。文献[1]提出利用控制流完整性(Control Flow Integrity, CFI)检测异常控制流,通过在每一条分支指令中插入验证码,以检测不合法的控制流变化;文献[2]提出粗粒度CFI检查,使用较少的验证码检查CFI的合法性,降低了性能开销;文献[3]提出一种基本块级的细粒度CFI检查,解决了粗粒度CFI检查安全性不高的问题;文献[4]在分析增强内容敏感和字段敏感指针的基础上,提出细粒度的CFI检测方法,保证了操作系统内核的完整性;文献[5]提出了一种新的硬件辅助CFI框架,该框架使用功能标签方法和有效标签的状态模型实施细粒度CFI策略,提高了安全性;文献[6]采用影子内存保存机制备份控制流信息,确保控制流转移的合法性;文献[7]利用线性加解密方式验证控制流转移前后的一致性,从而保证控制流的正确性;文献[8-10]利用硬件电路的安全性实施控制流完整性检查,达到防御控制流攻击的目的。上述方法基本上是基于CFI,而CFI分为粗粒度CFI和细粒度CFI,粗粒度CFI是将一组类似或相近类型的目标归到一起进行检查,由于检查粒度不够细,攻击者依然可以利用指令配件绕过防御机制实施攻击,致使安全性降低。而细粒度则是严格控制每一个间接转移指令的跳转目标,虽然缓解了粗粒度的安全性局限,但是由于实施细粒度检查要求严格控制每一个间接指令的转移目标,因而引入了过大的性能开销,而且细粒度CFI的安全性依赖于所构建的控制流图(Control Flow Graph, CFG)的准确性,但是构建十分精确的CFG是非常困难的,所以依然会造成安全性问题。

    鉴于此,控制流攻击的重要一步就是通过内存漏洞修改堆栈中的返回地址进而实施返回动态库函数攻击(Return_Into_Libc, RIL)、面向返回编程攻击(Return Oriented Programming, ROP)等类型的控制流攻击。通过检测返回地址是否被篡改,以有效检测控制流攻击。由于该方法不需要通过线下分析获取CFG图,避免了因控制流图不完备的漏报问题,进而提高安全性。基于以上分析,本文通过对控制流攻击原理的研究,提出了一种基于返回地址签名检测控制流攻击的方法。该方法利用MD5算法[11]的不可逆性,为加密后的压栈返回地址与出栈返回地址分别生成唯一的签名值,通过比较压栈地址签名值与出栈地址签名值,达到检测返回地址有无被修改的目的,保证了控制流跳转目标的合法性。

    • 控制流劫持大部分是通过内存漏洞篡改返回地址来达到目的,它是实现RIL、ROP等类型控制流攻击的重要手段。攻击者通过劫持程序的控制流,使程序的运行逻辑违背程序原本的设计目标,进而控制整个系统行为,产生巨大安全危害。实施控制流攻击的重要一步就是劫持程序控制流,而劫持控制流主要利用两种攻击:堆栈溢出攻击与格式化字符串攻击。

    • 堆栈是一段连续分配的有限内存空间,每当一个函数调用发生时,堆栈将被依次压入参数、返回地址、基址指针等数据。当函数对已分配的内存写入超出其本身的容量时,就会造成数据的溢出,溢出的数据可以覆盖原有数据。攻击者可以利用此溢出篡改堆栈中原有的返回地址,进行控制流劫持,并将其导向恶意代码shellcode处,实施控制流攻击。如图1所示,攻击者用起始地址A覆盖堆栈中的返回地址,而起始地址A指向恶意代码或指令片段,当系统执行地址A处的代码或指令片段时,控制流攻击即被实施。

      图  1  堆栈溢出攻击

      Figure 1.  Stack overflow attack

    • 格式化字符串漏洞产生的根本原因是未过滤用户输入。当输入数据传递给某些执行格式化操作的函数时,攻击者即可利用“%s”和“%x”篡改堆栈的数据,还可通过“%n”来读取和写入任意地址,从而导致任意代码读写。当printf在输出格式化字符串时,随即维护一个内部指针,遇到“%”时,printf期望其后跟随格式字符串,因此内部字符串会递增以获取格式控制符的输入值。然而printf不确定堆栈上是否放置了正确数量的变量使其运行,如果没有正确变量供其操作,而指针继续按正常情况下递增,就会引起越界访问,甚至可以利用“%n”任意对返回地址读取和写入。

    • 通过对控制流攻击原理的研究与分析,并且针对现有防御手段的不足,本文提出了基于返回地址签名法检测控制流攻击,整体框架如图2所示。在返回地址被压入堆栈后,攻击者通过堆栈溢出或格式化字符串攻击篡改堆栈中的返回地址,进行控制流的劫持。为检测返回地址的合法性,在系统执行程序调用指令call时,首先利用伪随机数发生器电路产生密钥K与压栈返回地址进行异或操作,将异或后的返回地址作为MD5算法的输入值,以此避免签名算法的输入值与返回地址直接关联。利用MD5算法的不可逆性为异或后的压栈返回地址生成唯一的签名值并存储在压栈签名寄存器中,然后在系统执行程序返回指令ret时,使用相同方法,为出栈返回地址生成唯一的签名值,最后将压栈地址签名值与出栈地址签名值送入到地址比较器中,根据签名值的比较结果判断返回地址有无受到篡改,进而达到检测控制流攻击的目的。

      图  2  检测控制流攻击整体框图

      Figure 2.  Overall block diagram of detecting control flow attacks

    • 为避免攻击者使用暴力攻击或查表法破译MD5签名算法而直接获取正确返回地址,利用线性反馈移位寄存器(Linear Feedback Shift Register, LFSR)电路实现伪随机数发生器[12],产生128位密钥K,经过Design compiler综合,在TSMC 65 nm工艺下平均功耗为0.527 mW,产生的随机数可通过NIST测试。该随机数存储在专门的密钥寄存器中且仅限于调用指令call与返回指令ret访问,其他指令禁止访问。此密钥用于返回地址进行异或操作,即使攻击者通过暴力攻击获取正确的MD5算法输入值,也不能直接得到正确的返回地址。伪随机数发生器如图3所示,由n个D触发器和若干个异或门组成。其中gn为反馈系数,取值为0或1,取0时表明不存在该反馈回路,取1时表明存在该反馈回路,n个D触发器最多可以提供2n−1个状态。

      图  3  伪随机数发生器

      Figure 3.  Pseudo-random number generator

    • 为确保生成返回地址签名值的随机性和不可逆性,利用MD5算法的不可逆性为压栈、出栈的加密返回地址生成唯一的随机签名值。MD5算法是一种典型的消息认证算法,经过一系列运算,它可将任意长度的消息压缩为128位的摘要。MD5算法的运算框图如图4所示,具体运算过程如下:

      图  4  MD5算法框图

      Figure 4.  MD5 algorithm block diagram

      (1)补位。若初始数据的长度没有达到512的整数倍,系统将会在消息的低位处用一个1和若干个0进行补齐。

      (2)初始化缓冲器。MD5有4个32位的被称作链接变量的整数参数ABCD, 对其设置初始数据。

      (3)非线性轮运算。MD5算法规定了4个非线性操作函数:

      其中:&为与;|为或;~为非;$ \wedge$为异或。利用以上4种操作,生成4个重要的计算函数。4个中间变量abcd,赋值:a=A, b=B, c=C, d=D。接着执行4轮主循环,每一轮完成16次运算,每轮用到一个非线性函数,每次操作需要对abcd中的3个变量完成一次非线性运算,并更新对应的变量数据。

      (4)数据输出。处理完所有512位的分组后,得到一组新的ABCD的值,将这些值按ABCD的顺序级联,得到MD5签名值。

    • 根据上述方案,利用MD5算法为返回地址生成签名值,经分析得到压栈返回地址、出栈返回地址签名值计算公式如下:

      其中:PRNG_K、push_addr、encry_push_addr、sig_push_addr、pop_addr、encry_pop_addr、sig_pop_addr分别为伪随机数电路产生的密钥、压栈返回地址、加密后的压栈返回地址、压栈地址签名值、出栈返回地址、加密后的出栈返回地址、出栈地址签名值。当执行程序调用指令call时,密钥K与压栈返回地址进行异或操作,然后将异或后的返回地址作为MD5算法的输入值,得到压栈地址的签名值。同理,当执行程序返回指令ret时,生成出栈签名值。

    • 为了验证方案的有效性,以oc_8051处理器为验证平台,通过修改oc_8051处理器的源代码,在处理器架构中加入返回地址签名模块,实现处理器具有检测控制流攻击功能的目的,并进行波形仿真、签名值随机性测试、正确签名值与错误签名值汉明距离测试以及可用的控制流攻击指令消除率测试等实验。实验环境包括:Intel Xeon(R) Dual-Core CPU 2.0 GHz、6 GB RAM服务器,涉及的工具软件包括:NClaunch、Matlab、以及ROPGadget-master5.4。

    • 图5为将返回地址签名电路应用于oc_8051处理器的硬件架构图。oc_8051处理器工作流程分为5个阶段:取指、译指、执行、访存、写回。由于返回地址签名电路的引入,当处理器处于译指阶段且译指结果为程序调用指令call时,将产生call_en使能信号,触发签名电路生成压栈地址签名值。同理,当译指结果为程序返回指令ret时,处理器产生ret_en使能信号,触发签名电路生成出栈地址签名值,最后通过匹配压栈地址签名值与出栈地址签名值达到检测控制流攻击的目的。若二者签名值相匹配,处理器继续执行程序,反之,则立即停止程序。

      图  5  检测控制流攻击的处理器硬件架构图

      Figure 5.  Hardware architecture diagram for detecting control flow attacks

    • 图6示出了具有检测控制流攻击功能处理器的工作流程,具体步骤如下:

      图  6  检测控制流攻击的处理器工作流程图

      Figure 6.  Flow chart of detecting control flow attacks

      (1)处理器处于译指阶段且指令译码结果为程序调用指令call时,触发伪随机数发生器生成密钥K,并将压栈返回地址送入XOR加密单元进行加密处理;

      (2)将加密后的压栈返回地址作为MD5签名生成单元的输入值,生成压栈签名值;

      (3)指令译码结果为程序返回指令ret时,将出栈返回地址送入XOR加密单元进行加密处理;

      (4)将加密后的出栈返回地址送入MD5签名生成单元,生成出栈签名值;

      (5)比较压栈返回地址的签名值与出栈返回地址的签名值,若签名值相同,则继续执行,反之立即停止执行。

    • 通过编写测试激励testbench,使压栈地址与出栈地址不同,并使用NClanch获得仿真波形,如图7所示。其中ADDR_PUSH_R、ADDR_POP_R、PRNG_K、XOR_ADDR_PUSH、XOR_ADDR_POP、SIG_PUSH_R、SIG_POP_R、COMPARE_SIG分别为压栈地址寄存器、出栈地址寄存器、随机数K寄存器、加密压栈返回地址寄存器、加密出栈返回地址寄存器、压栈返回地址签名值寄存器、出栈返回地址签名值寄存器、签名值比较信号。当出栈地址为0x043b,压栈地址为0x0438时,从仿真波形图中虚线处可发现,二者生成的签名值不同,签名值比较信号翻转,指示当前返回地址遭到恶意篡改,达到检测控制流攻击的目的。

      图  7  仿真波形图

      Figure 7.  Simulation waveform

    • 表1所示为7组输入不同返回地址得到的签名值,经过对签名值的自相关性和互相关性分析,并使用Matlab获取签名值的相关性分布图。图8为同一组输出数据的自相关性分布图,图9为7组不同输出数据的互相关性分布图,从图中可知生成的地址签名值具有良好的随机性。

      No.Return addressSignature
      10x043bE0DF7A89_C8337D3F_5BADAB88_AD94DE63
      20x041e6A5626C4_198A9FB2_EF3A7113_992E7B5F
      30x03faADEF12B3_A694ACC4_C1FB6954_79F81655
      40x042822A9D7C1_809C0411_94F4E236_BFEFBFC0
      50x034f55282EB7_6B91B63E_13B65DC3_B5D13522
      60x043d5D730D12_753F00DA_A7FE84FA_B5D14756
      70x065d1964EE3E_4A2DD5E4_6BECA038_709B7729

      表 1  返回地址签名值数据输出

      Table 1.  Return address signature

      图  8  数据自相关性

      Figure 8.  Data autocorrelation

      图  9  数据互相关性

      Figure 9.  Data cross-correlation

    • 图10所示为本方案假设表1中的第一个返回地址为正确的出栈返回地址,其余为错误的出栈返回地址,经过对其汉明距离的分析,得到正确返回地址与错误返回地址的汉明距离。汉明距离是用于表示两个二进制字符串之间的差异的数字。设xy是两个相同长度的二进制序列,xy之间的汉明距离dx, y)是相应符号不同的位数,计算公式如下:

      图  10  正确与错误地址签名值之间的汉明距离

      Figure 10.  Hamming distance between correct and wrong signatures

      其中,i=0,1,…,n−1。由图10可得,128位正确返回地址签名值与错误返回地址签名值之间的汉明距离均达到50%以上,错误签名值与正确签名值具有较大差异性,攻击者很难通过对错误返回地址签名值的分析得到返回地址的正确签名值。

    • 攻击者利用处理器在执行call或ret指令时,对堆栈中的返回地址进行篡改,进而实施控制流攻击。而由于处理器中引入了返回地址签名电路,返回地址若受到恶意篡改会被立刻检测出,因此攻击者不能利用call指令或ret指令进行控制流劫持。使用ROPgadget获取控制流指令总数目并统计call指令与ret指令数目,计算call指令与ret指令数目在控制流指令总数目中的占比,即可得到控制流指令消除率。表2示出了5个不同测试程序下的控制流指令消除率,5个测试程序中均含有缓冲区溢出漏洞和格式化字符串攻击漏洞,攻击者可利用漏洞进行控制流劫持。结果显示攻击者可利用的控制流指令平均消除率达到81.27%,有效消除了攻击者可利用的控制流指令。

      TestbenchNumbers of instructionsNumbers of control flow instructionsNumbers of call and ret instructionsControl flow instructions eliminate rate/ %
      Vul373514180.39
      Mines32 1482 1361 83185.72
      Orage90 4422 3131 71374.05
      Eog126 1126 4655 25381.25
      Gedit133 9128 4417 17084.94

      表 2  控制流指令消除率

      Table 2.  Control flow instructions elimination rate

    • 本文提出了一种基于返回地址签名的控制流攻击检测方法。该检测方法首先利用伪随机数发生器产生密钥K与返回地址进行异或加密,然后将加密后的返回地址作为MD5算法的输入,利用MD5算法的不可逆性分别为加密后的压栈返回地址和出栈返回地址生成唯一的签名值,最后根据出栈签名值和压栈签名值是否匹配进行控制流合法性的检测。通过实验验证了此方案的有效性,结果显示当压栈地址与出栈地址相异时,处理器可立即检测出此时控制流不合法。虽然MD5算法是已有算法且复杂度不高,然而得到返回地址的签名值依然具有良好的随机性,攻击者可以利用的控制流指令平均消除率达到81.27%,可有效地检测出因返回地址篡改而引起的控制流攻击。

(11)  表(2) 参考文献 (12)

目录

    /

    返回文章