调教 漫画 进度适度流好意思满性保护本领综述
跟着诡计机本领的延续发展, 万般诡计机软件的出现给东谈主们带来极大的便利. 关联词由于诡计机体系和编程谈话存在的固有局限性, 诡计机软件不可避免地存在一些安全过失. C/C++因其较高的实行遵循, 成为好多底层库、大型软件已毕的首选谈话, 其内存照料机制需要开辟者自行肯求和开释内存调教 漫画, 这为想象和已毕高效步调提供了极大目田度, 但同期也为内存安全埋下隐患. 输入数据跨越缓冲区可容纳的最大数据量并溢出到支配存储区域便会激发缓冲区溢露马脚. 缓冲区溢露马脚是咫尺危害最为等闲的安全过失之一, 且难以绝对摈弃[1]. 适度流劫执抨击欺诈了缓冲区溢出等内存过失, 通过劫执步调进度的适度流, 使其实行特定的坏心代码, 从而达到抨击的目的.
重庆高校在线开放课程平台为了招架适度流劫执抨击, 一系列搪塞计谋接踵被提议, 字据退缩引入时辰不错分为运行前的静态退缩本领和运行时的动态退缩本领[2]. 其中运行前静态退缩方法包括数据实行保护(data execution protection, DEP)[3]、地址空间布局立地化(address space layout randomization, ASLR)[4]、Stack Canary[5]等. 天然此类本领已被等闲应用并不错灵验退缩代码注入抨击[6], 但是无法完全退缩代码重用抨击(code-reuse attacks, CRAs). Return-into-libc[7]和复返导向编程(return oriented programming, ROP)[8]是常见的代码重用抨击, 其中Return-into-libc欺诈主张步调的库函数完成对主张进度的抨击, ROP则不错从主张步调中登第已有的代码片断gadget, 勾通形成图灵完备的抨击逻辑进而完成抨击, 败浮现巨大的恐吓性. 由于ROP抨击需要获取内存布局信息来获取gadget的地址, 以ASLR为代表的运行前静态退缩方法旨在通过立地化内存布局, 来退却ROP抨击构造抨击逻辑. 关联词跳转导向编程(jump oriented programming, JOP)[9] 、JIT-ROP (just-in-time ROP)[10]等ROP的变种抨击方法接踵被提议, 延续冲破已有的退缩本领, 进一步增多了退缩适度流劫执抨击的难度.
2005年, Abadi等东谈主提议了适度流好意思满性(control flow integrity, CFI)[11] 的办法. CFI是一种运行时动态退缩方法, 其主张是确保进度运行时的适度流弥远处于要求的范围之内, 并严格实行步调要求的转动. ROP实行的坏心代码会被CFI视为违纪适度流转动, 并退却其进一步运行, 从而起到退缩适度流劫执抨击的作用. CFI自提议以来, 依然阅历了十多年的发展, 谈论东谈主员在原始方法的基础上提议了多种应用于不同场景的CFI检阅有想象, 包括用于生意软件的CFI或者径直集成在编译器、操作系统中的CFI等, 幽闲步调践诺运行环境的需求.
本文对CFI方法进行了全面的窥伺和论说, 第1节证明了CFI的基情愿趣, 从本领旨趣的角度将现存的CFI方法分类为高下文无关的CFI和高下文敏锐的CFI; 第2节先容了本文的文献调研方法和调研终结, 并对不同方法进行了归纳归来; 第3节将高下文无关的CFI分类为基于源码的CFI、基于二进制的CFI和硬件补助的CFI并分别证明了其旨趣机制; 第4节先容了高下文敏锐的CFI; 第5节证明了CFI的评价方法, 并字据评估角度对现存的CFI评估谈论进行对比、照看和分析; 临了, 第6节对全文进行了归来与瞻望.
1 CFI旨趣概述CFI对适度流的保护主要分为两个阶段, 滥觞是在运行前对步调进行源码分析或二进制分析, 赢得步调的适度流图(control flow graph, CFG), 然后在步调运行时监测步调适度流是否弥远处于CFG中, 来判断步调是否遭遇了抨击. CFG是一个由基本块和有向边构成的图, 其中每一个基本块代表一段在中间不包含适度流跳转提醒和其他适度流跳转提醒的主张的一语气代码, 每一条有向边则代表步调适度流的一次转动. CFI机制使用的CFG为经由间CFG, 包含了函数间的调用边(call edge)和复返边(return edge). 图1(b)所示的CFG由图1(a)的原始步调段分析得到, 它反应了原始步调段的适度流, 即步调通盘的适度流转动提醒以及步调实行经由中所可能跳转的主张地址鸠合.

适度流的转动以跳转提醒为基础. 步调通过跳转提醒参加不同分支实行, 而保证跳转提醒的主张分支地址弥远正当即贵重了进度适度流的好意思满性. 以x86平台为例, 跳转提醒包括jmp提醒、call提醒和ret提醒. 其中jmp提醒和call提醒将步调适度流转动到一个新的位置, 称为前向转动; ret提醒将步调的适度流复返到先前的位置, 称为后向转动. 跳转提醒字据寻址式样的相反, 不错分为径直和辗转两种面容. 其中径直跳转提醒字据给定的主张统共地址或相对偏移量完成跳转, 且地址在运行时无法修改. 因此在DEP本领灵验的前提下, 只消保证代码的好意思满性, 径直跳转不错被视为安全提醒; 辗转跳转提醒的主张地址由寄存器给出, 且在步调实行时动态决定, 因此辗转跳转提醒的主张地址有被抨击者坏心点窜的风险. 因此CFI的主张在于确保进度辗转跳转提醒的主张地址弥远正当, 对前向迂反转动的保护称为前向边沿保护(forward-edge protect), 对后向迂反转动的保护称为后向边沿保护(backward-edge protect).
图1(b)展示了基于ID匹配的CFI机制防护适度流劫执抨击的旨趣. 基于ID匹配的CFI机制为跳转主张函数分派独一的ID, 并在每条适度流转动提醒前插入搜检代码, 以在跳转前比拟预期跳转ID与主张函数的ID是否一致. 当出现不一致的情况时, 说明进度出现了不平CFG的违纪转动, 则隔绝步调的运行. 具体到图1(a)所示的代码段, 为了避免由于ROP抨击对函数指针fptr的主张地址进行坏心修改, ID1搜检用于考证从fptr的函数sort到主张函数less_than和greater_than的正当跳转, 任何到其他目的地的违纪跳转王人不可通过ID1搜检, 因为那些主张地址莫得插入ID1. 同期, ID2搜检用于考证调用函数对函数调用点的正当复返, 以避免抨击者对堆栈中的复返地址进行坏心的点窜.
谈论东谈主员在原始CFI想想的基础上, 提议了一系列应用于不同场景的CFI有想象. 现存工业界和学术界提议的CFI有想象囊括了基于源代码的已毕、基于二进制可实行文献的已毕、编译器层面、内核层面的已毕以及欺诈CPU硬件脾气的已毕等诸多层面, 其适用范围、防护安全性以及运行支出均有不同. 此外, 为了招架愈来愈强盛的适度流劫执抨击, 谈论东谈主员运行沟通将进度实处事态的高下文语义加入到CFI有想象中, 相对于此前无情景的CFI有想象, 进一步提高了其退缩智力. 尽管CFI有想象的面容多变, 其目的弥远是为了赢得更好的退缩性能和更低的性能支出.
如图2所示, 本文字据是否趋奉进度高下文语义, 将现存CFI分为高下文无关的CFI和高下文敏锐的CFI, 字据已毕层面的不同, 高下文无关的CFI又可分为基于源码的CFI有想象、基于二进制步调的CFI有想象和硬件补助的CFI有想象. 高下文敏锐的CFI有想象欺诈了进度实行时函数调用经由的高下文语义信息, 进一步保证进度跳转经由符合适度流图的实行逻辑, 需要借助处理器硬件机制已毕对进度适度流的高效监控, 以减少运行支出.

本节先容了本文的文献调研方法和调研终结. 咫尺Burow等东谈主[12]、de Clercq等东谈主[13]、武成岗等东谈主[14]、王丰峰等东谈主[2]对已有的适度流保护方面的谈论遵循从不同方面进行了系统的归来. Burow等东谈主[12]对连年来已有的CFI有想象整理和分析, 重心从CFI有想象的准确性、安全性和性能进行了考究的评估和归来. de Clercq等东谈主[13]归来了连年来的21个基于硬件补助的CFI有想象, 并对这些有想象的安全性、局限性、硬件资本、性能和实用性进行了评估与比拟. 武成岗等东谈主[14]以时辰礼貌先容了适度流好意思满性本领的发展历程, 同期先容了针对CFI的抨击技能. 王丰峰等东谈主[2]系统地归来了进度适度流劫执抨击过头退缩本领的干系谈论, 滥觞先容了进度适度流劫执抨击本领的谈论近况, 然后将适度流劫执退缩本领分为运行前静态退缩本领和运行时动态退缩本领分别进行先容. 现存综述性文献未对CFI有想象进行明确的分类, 且均未对CFI有想象的评价方法及目的进行融合的归纳. 针对这一问题, 本文对连年来已有的万般CFI有想象进行了充分的调研, 并从已毕旨趣角度对CFI本领进行了系统的分类汇总. 在评估万般CFI有想象上风与不及的同期, 进一步对CFI本领旨趣的发展经由与趋势进行了分析; 此外, 本文还眷注针对CFI有想象的评价方法, 对干系评测基准套件、现存评价目的以及评估方法类文献进行了归纳与归来.
为了对本文所谈论的问题进行系统的梳理和分析, 滥觞以“Control Flow Integrity”“Control-Flow Attacks”“Control Flow Hijacking”等设为主要搜索关节词, 在国表里弥留的学术搜索引擎(例如谷歌学术搜索、CNKI等)中检索干系论文; 然后, 筛选出与综述问题干系的论文; 接着, 通过已搜索到的论文获取更多的干系文献, 方法包括查阅论文的援用和被援用, 以及论文作家已发表论文的列表; 同期参考已有综述性文献的调研情况, 细目了最终的文献列表. 其中包括提议CFI有想象的论文60篇、干系评测基准套件或方法17个、其他与综述谈论问题径直干系的论文30篇.
图3刻画了不同CFI有想象的论文随时辰线的增长图. 从图中不错看出, 自CFI于2005年提议以来, 基于源码的CFI有想象最早被提议且逐年稳步增多; 跟着诡计机硬件的迭代更新, 欺诈硬件脾气补助的CFI本领逐步代替纯软件的已毕成为发展的趋势. 此类硬件具有分支转动的跟踪纪录功能, 粗略使得CFI解脱对二进制改写本领的依赖, 尽可能地保执被保护代码的好意思满性和透明性; 同期, 此类硬件也提供了丰富的进度高下文信息, 使得高下文敏锐的CFI的践诺应用成为了可能. 到咫尺为止, 各标的论文的分散情况为: 基于源码的CFI有想象有20个; 基于二进制步调的CFI有想象有13个; 硬件补助的CFI有想象有22个; 高下文敏锐的CFI有想象有5个. 天然高下文敏锐的CFI有想象咫尺较少, 但具有较大的发展后劲, 是改日的谈论趋势.

表1列举了连年来对于适度流好意思满性的谈论汇总, 综合地刻画了CFI有想象的类别过头本领特质. 类别分为高下文无关的CFI和高下文敏锐的CFI. 高下文无关的CFI又可进一步细分为基于源码的CFI、基于二进制步调的CFI和基于硬件的CFI; 本领特质综合了不同CFI有想象已毕适度流好意思满性保护所使用的本领旨趣. 后文表1同期列出了CFI有想象的称呼、发表年份和在本文中的援用编号.

高下文无关的CFI不将进度实行的历史信息手脚适度流转动正当性的参考依据, 只需保证适度流顺从事先细目的CFG的旅途. 字据CFG获取式样的不同, 高下文无关的CFI不错进一步细分为基于源码的CFI、基于二进制步调的CFI和硬件补助的CFI. 基于源码的CFI不错通过被保护步调的源码细目每个迂反转动提醒的正当主张地址, 从而细目CFG中每个基本块之间是否存在不错转动的有向边, 因此不错构建精确的CFG; 不依赖源代码的CFI只使用二进制文献进行分析, 所得到的迂反转动提醒的主张地址鸠合与践诺正当的主张地址鸠合存在相反, 这时常需要通过分析被保护步调所依赖的库、匹配函数调用时的参数数目[15]等式样来进一步筛选, 从而尽可能地优化CFG.
Abadi等东谈主提议了第一个高下文无关的CFI, 并给出了具体实施有想象[50]. 原始CFI基于独一ID匹配的旨趣已毕适度流好意思满性保护, 如图4所示为其基本框架. 原始CFI在每一条迂反转动提醒前插入搜检代码, 其中包括辗转call提醒、辗转jmp提醒和ret提醒在内的通盘迂反转动提醒王人需确保正当后才粗略络续实行, 正当性判断所依据的CFG由被保护步调的静态二进制分析得到. 当迂反转动提醒被检测为正当跳转时, 步调不错络续实行, 不然将被CFI机制视为违纪跳转并隔绝被保护进度. 为了确保函数调用粗略复返到最近的调用点, 原始CFI应用了影子堆栈[51]来保护存有复返地址的堆栈, 驻扎其在运行时的被点窜. 影子堆栈常用来保护函数的复返地址, 每当步调调用一个函数时, 王人会将复返地址复制在专用的影子堆栈上, 函数复返时, 将步调要使用的复返地址与存储在影子堆栈中的地址进行比拟, 仅当二者一致时, 才以为复返地址莫得遭到坏心的点窜. 原始CFI针对每一个适度流转动均进行搜检, 不错最大化系统的安全性. 但是由于ID的创建、查询、比拟和存储会导致性能大幅下跌, 致使于难以在践诺坐褥中部署. 为了减少搜检的支出, 后续出现了削弱搜检条目的粗粒度CFI, 通过裁汰退缩安全性的式样来换取性能的进步.

基于源码的CFI欺诈步调源代码获取步调迂反转动的详备信息, 从而构建精确的CFG. 此类有想象在践诺部署时, 或径直对源代码进行修改, 或将适度流保护逻辑集成在编译器或者操作系统内核中, 从而在步调运行前完成抨击检测与退缩代码的安插. 相较于基于二进制步调的CFI有想象, 不错实行更多的优化从而赢得更好的性能.
Wang等东谈主[16]提议了一种保护编造机照料步调的细粒度CFI保护机制HyperSafe, 该有想象主要针对Type-I编造机照料步调提供运行周期内的适度流保护. HyperSafe通过两种关节本领已毕其主张: 第1种本领可锁定受写保护的内存页面, 在页表更新之前将其设立为只读并检测更新是否安全, 驻扎内存页在运行时被坏心代码点窜, 从而灵验地保护了编造机监控步调的代码好意思满性. 第2种本领将迂反转动的通盘主张地址鸠合在一张主张表中, 并使用指针索引替换践诺的主张地址, 从而将适度流的跳转适度在主张表中存在的地址范围内. 第1种本领通过径直修改编造机照料步调的源码来已毕; 第2种本领欺诈编译器LLVM[52]中已毕的数据结构分析功能和手动分析相趋奉的方法来获取辗转跳转主张的地址. 该文献使用HyperSafe已毕了对两个编造机照料步调BitVisor和Xen的保护, 从而考证了该有想象的灵验性.
Niu等东谈主[18]提议一种模块化补助的CFI有想象MCFI, 该方法补助对模块进行孤独的适度流安全检测, 并将各个模块以静态或动态式样通顺起来, 组合生成新的CFG. MCFI使用ID表照料各个模块, 并使用锁机制已毕事务来贵重ID表的一致性, 进一步已毕模块的多线程同期拜谒. MCFI将类型信息附加在各个模块中, 并使用函数指针的类型与函数匹配来生成精确的CFG, 同期需要对源代码进行恰当地修改. 各个模块类型信息的生成则依赖于可拓展的编译器具LLVM.
Tice等东谈主[19]提议了第一个集成到编译器中的CFI前向边沿保护有想象, 并在GCC和LLVM两种编译器上进行了已毕. 作家针对GCC编译器提议了虚函数表考证(vtable verification, VTV), 驻扎抨击者通过伪造的虚函数表劫执编造调用进行抨击. VTV构造了灵验虚函数表指针鸠合, 在实行调用之前, 考证用于编造调用的虚函数表指针的灵验性, 对于不在鸠合中的虚函数表指针, VTV将隔绝步调的运行. 针对LLVM编译器, 作家提议辗转函数调用搜检(indirect function-call checks, IFCC), 不错确保辗转调用的主张地址均为正当地址. IFCC为辗转调用主张生成跳转表并强制通盘辗转调用通过跳转表实行, 大大减少了辗转跳转主张被抨击的可能性. 著作还想象了FSan, 这是一个可选的辗转调用搜检器具. FSan被集成在LLVM中, 具有对类型信息的完全拜谒权限, 用来识别可能导致安全问题的违背CFI的活动. 关联词, Conti等东谈主[53]指出IFCC只保护了CFG的前向边沿, 使得自后向边沿易受栈溢出抨击的劫执.
上述方法的关细心心以应用层的ROP抨击为主, 针对内核层级的抨击检测方法相对较少. Criswell等东谈主[20]提议了第一个内核级的CFI保护有想象KCoFI, 用于保护操作系统内核免受适度流劫执抨击. KCoFI基于安全编造体绑缚构(secure virtual architecture, SVA)[54, 55]已毕, SVA在硬件和操作系统之间插入了基于编译器的编造机, 通盘软件王人被编译为SVA提供的编造提醒集. KCoFI将基于标签的原始CFI部署在该编造机中, 并在代码从编造提醒集转念为处理器的原生提醒集时进行安全检测, 已毕对操作系统内核数据的保护. 实验终结标明, KCoFI不错退却内核中检测到的通盘gadgets的使用, 评释了该方法的灵验性. 关联词, 将CFI机制放手于内核中的风险在于, 一朝内核遭遇抨击, 则检测机制会被抨击者禁用从而失效. 为了措置这个问题, 陈志锋等东谈主[56]欺诈编造机架构已毕了内核级ROP抨击检测方法CFI-KCraD, 该方法基于标签考证的想想确保适度流转动的正当性, 并通过将检测步调放手在编造机监控器中, 提高了CFI机制的安全性.
Niu等东谈主[21]提议了一种保护即时编译器的CFI有想象RockJIT, 该有想象使用即时编译器的源代码构建细粒度的适度流图, 并在生成新代码时动态更新适度流计谋, 以退缩代码注入抨击和JIT spraying[57]等适度流劫执抨击. RockJIT基于MCFI构建, 将编译器更生成的代码看作新的模块, 并将其CFG与现存代码的CFG通顺在沿途. 基于即时编译器的CFI有想象还有基于NaCL[58]已毕的NaCL-JIT[59]以及JITScope[22]等, 也已毕了较好的退缩性能.
传统的CFI本领从步调中静态索取CFG, 并通过实行该CFG已毕进度适度流的监测. 静态生成的CFG包括通盘可能输入的通盘边沿, 但对于具体的输入, CFG可能保护许多不消要的边沿. 针对这一问题, Niu等东谈主[23]提议πCFI, 该有想象字据每个具体输入诡计CFG. πCFI滥觞通过静态分析得到的全局CFG, 并在运行时向一个空CFG中一一添加特定输入对应的CFG边沿, 且添加条目为特定输入对应的CFG边沿包含在全局CFG之中. 实验终结标明, πCFI不错灵验地减少不消要的辗转分支数目, 同期裁汰支出.
此外一些谈论提议针对IRM (inlined reference monitors)的适度流防护. IRM是一种底层安全机制, 该机制将监视器代码内联到汇编等初级代码, 以便在实行不安全操作之前对其进行搜检. IRM不错依靠CFI或者SFI (software fault isolation)[60]来已毕. 其中XFI[61]和MIP[17]等谈论提议了针对监控器步调的CFI有想象, 从长途毕了低层级的IRM.
基于源代码的CFI多用于偏底层的适度流保护, 此类方法在内核层面已毕相应接口的扩张并通过编译器为步调增多退缩功能, 避免了开辟东谈主员手动添加退缩代码, 为软件开辟提供了便利. 关联词此类方法在不提供源码或调试信息的应用步调中难以已毕. 践诺上, 生意软件时常以二进制可实行文献的面容发布, 用户在大多数情况下不可获取软件的源码, 这使得更多的CFI本领倾向于径直基于二进制文献或借助处理器硬件脾气已毕适度流保护.
3.2 基于二进制步调的CFI许多CFI措置有想象要求源码或调试信息才可平时使用, 在现实应用中时常难以得到幽闲, 这使得许多生意软件无法得到灵验的保护. 因此, 基于二进制步调的CFI有想象得到越来越多科研东谈主员的眷注. 基于二进制步调的CFI有想象不错部署在莫得源码的二进制步调中, 因此应用愈加等闲. 此类有想象频频会使用一些方法从二进制文献中生成适度流图, 想象CFI有想象, 并使用二进制重写等本领将有想象部署在原步调中. 由于无法使用源码来构建愈加精确的适度流图, 是以获取更准确地辗转跳转主张鸠合, 提高生成适度流图的精度成为谈论东谈主员的谈论重心之一.
Zhang等东谈主[27]提议了CCFIR, 该方法汇集了迂反转动提醒的通盘正当主张地址, 在进度内存中设立一个Springboard段, 并将通盘正当主张地址放手在该内存区域中. 进度实行经由中的通盘辗转跳转王人需经过Springboard段的转发, 而Springboard段会对辗转跳转提醒的主张地址进行考证, 如果存在违纪跳转地址, 则说明进度受到坏心的适度流抨击. CCFIR使用二进制重写本领已毕辗转跳转主张地址向Springboard段的重定向, 因此仅需要重定位表的信息即可应用. CCFIR将跳转主张函数进行了分组, 何况以组为单元分派ID, 用于区分辗转调用提醒和函数复返提醒的主张. 相较于原始CFI细粒度的搜检式样, 分组的想想通过裁汰退缩的粒度减小了运行支出. 此外, Springboard段的使用也加大了空间需求.
与CCFIR近似, BinCFI[28]亦然一种面向二进制步调的CFI措置有想象, 该方法使用反汇编改写辗转跳转提醒, 生成新的代码段, 在不改换原有代码的基础上, 已毕原步调的适度流好意思满性增强. BinCFI贵重了两个地址转念哈希表, 分别贵重ret提醒和辗转jmp/call提醒的正当主张鸠合, 用于原代码段到新代码段地址的转念. 实验标明, 该方法不错应用于大型二进制步调中, 具有较好的性能.
Wang等东谈主[29]指出了CCFIR和BinCFI存在的不及以及可能被抨击的旅途, 并提议了一种更细粒度的面向二进制步调的CFI保护有想象BinCC. 该方法滥觞对二进制代码进行静态分析, 并使用Super-CFG构造算法构造互斥的代码块, 进一步将迂反转动提醒分为代码块间转动或代码块内转动. 代码块的里面构造有向图, 从而保证代码块间的互斥, 已毕更细粒度的不休. 在CFI不休功令的实施方面, BinCC在BinCFI的基础上进行拓展, 实质上亦然使用了二进制重写的方法.
O-CFI[30]将细粒度的代码立地化和粗粒度的适度流保护相趋奉, 在使用查询表谨慎迂反转动主张地址正当性的同期, 对进度内存布局进活动态立地化处理, 裁汰内存过失导致的内存信息泄露风险. Lockdown[31]使用了影子堆栈来保护复返地址, 从长途毕细粒度的适度流保护; 与其他使用静态二进制重写的CFI措置有想象不同, 该方法使用动态二进制翻译对通盘迂反转动进行安全搜检, 在运行时动态调整适度流图的大小. TypeArmor[32]部署了面向主张和面向调用点的适度流不变式, 已毕了愈加严格的适度流劫执抨击的检测, 并得手招架了伪造面向对象编程(counterfeit object-oriented programming, COOP)[62]. Grossklags等东谈主[33]针对BinCFI和TypeArmor等方法只对前向边沿进行保护, 并假定已使用影子堆栈等本领保护后向边沿的不及, 提议了一种基于函数参数类型和参数数目匹配考证的CFI有想象τCFI, 对步调的前向边沿和后向边沿均进行了灵验的保护. Davi等东谈主[26]提议了第一个针对智妙手机平台的通用CFI框架MoCFI, 并在iOS上得手部署. 实验终结标明, MoCFI不错得手招架常见的适度流劫执抨击, 且不会引起彰着的性能支出.
跟着商用软件对版权保护及数据安全等需求的日益增多, 在二进制步调的基础上增多适度流防护措施变得尤为弥留. 通过静态分析和二进制重写的方法已毕CFI机制需要修改步调底本的二进制文献, 践诺应用时靠近较大的兼容性问题. 跟着历史分支纪录等机制的出现, 使用了近似硬件机制的CFI本领逐步解脱了对二进制重写本领的依赖, 提高了退缩的兼容性. 因此, 在仅有被保护软件二进制文献的情况下, 硬件补助的CFI逐步取代纯软件的已毕方法.
3.3 硬件补助的CFI为了进一步提高CFI的安全性和性能, 一些谈论着眼于从硬件机制中寻求可用的补助. 咫尺商用处理器中基本王人集成了性能监控单元(performance monitoring units, PMUs), 该功能当先用于监控应用步调的运行从而优化系统性能. 为了分析步调的适度流转动情况, 进一步提高PMUs的精确性, 大部分商用处理器还集成了分支跟踪功能, 例如英特尔处理器的分支跟踪存储(branch tracing store, BTS)和最近分支纪录(last branch recording, LBR)等. 基于底层硬件功能进行步调适度流的监控, 检测适度流劫执抨击, 不错灵验地裁汰CFI有想象的运行支出.
Xia等东谈主[35]提议了CFIMon, 该方法使用了处理器中的BTS机制即时地监控和分析适度流的运处事态. BTS不错汇集步调运行时通盘的跳转提醒信息并存入特定的缓冲区. 当历史提醒行将装满BTS的缓冲区, 或进度尝试进行敏锐的系统调用时, CFIMon将启动提醒正当性考证. 考证经由主如若判断缓冲区内通盘的历史迂反转动提醒是否均存在于正当跳转主张地址鸠合中, 若存在违纪跳转则判定面前进度受到抨击. 正当跳转主张鸠合由被保护步调在运行前通过静态分析得到. CFIMon欺诈BTS辅助获取进度在运行时的跳转主张地址, 是第一个不需要二进制重写本领已毕的CFI有想象, 同期也无需提供源码和编译信息.
图5展示了硬件补助的CFI的典型责任旨趣, BTS、LBR瓜分支跟踪寄存器汇集步调运行时通盘的跳转提醒信息并存入特定的缓冲区, 当进度进行系统调用时, 将触发CFI机制的迂反转动正当性检测功能. 跳转信息汇集模块获取缓冲区中的进度跳转提醒并传递给跳转正当性检测模块, 跳转正当性检测模块字据正当跳转主张鸠合对进度的历史跳转提醒进行正当性判断. 在此期间CFI获取进度适度流并实行检测经由, 如果辗转跳转提醒判断为正当提醒, 则将适度流返还给被保护进度, 不然将隔绝步调.

Pappas等东谈主[36]提议了kBouncer, 该有想象欺诈LBR获取进度最近16次的跳转提醒信息, 并使用近似CFIMon的式样, 在进度试图进行敏锐系统调用时进行跳转主张正当性搜检. 作家对IE9、Windows Media Player和Adobe Reader进行了考说明验, 评释了该方法不错灵验招架ROP抨击. Cheng等东谈主[37]指出 kBouncer完全依赖LBR纪录的局限性以及使用二进制重写本领存在松懈安全机制兼容性的风险, 并提议了一种不依赖源码和二进制重写本领的CFI有想象ROPecker, 该有想象也使用LBR监控步调的适度流, 进而检测并退缩ROP抨击. ROPecker对ROP抨击的检测触发条目进行了改进, 提议了一种滑动窗口机制. 该机制将受保护应用步调的最近拜谒代码包含在滑动窗口里面, 何况设立为可实行, 而将滑动窗口外部的应用步调代码设立为不可实行. 当进度试图实行敏锐系统调用或者适度流试图跳出滑动窗口范围时王人将会触发ROP抨击检测机制. 滑动窗口机制欺诈了应用步调代码的时辰和空间局部性, 具有高效性和较高的准确性. 实验终结评释, ROPecker不错灵验地招架ROP抨击. 上述3种方法均是在运行时检测实行流中的长gadgets-chain来已毕ROP抨击的检测, 关联词对短gadgets-chain抨击的检测与隐私效果有待提高. 李威威等东谈主[63]提议MIBChecker, 将敏锐系统调用手脚检测触发条目. 由于短gadgets-chain抨击的实施者时常通过构造系统调用参数, 进行敏锐系统调用从而达到抨击的目的, 包括mprotect、execve、mmap等, 因此MIBChecker检测系统将每次检测到抨击时的系统情景纪录下来, 在实行系统调用时判断面前系统情景是否和检测到抨击时的系统情景一致, 如果一致则判定为遭遇到了ROP抨击.
Gu等东谈主[39]提议了一种基于硬件已毕的后向边沿保护机制PT-CFI, 该有想象欺诈硬件功能Intel processor trace (PT)提供进度适度流信息.PT及时汇集适度流信息并以数据包的面容发送至内存缓冲区, 当迂反转动发生时将触发硬件功能生成Target IP (TIP)数据包, 其中包含了迂反转动的主张地址. PT-CFI使用及时给与到的TIP包构建TIP图结构, 其中图的极点暗示TIP包的独一索引, 而唯有两个礼貌实行的迂反转动的TIP包之间才有边连结. 当一系列的迂反转动发生时, PT-CFI将PT汇集到的TIP包序列化并与TIP图进行匹配, 如果匹配得手则判定为正当跳转; 如果匹配失败且TIP包中的提醒类型是ret时, 将构造影子堆栈来考证复返地址是否正当, 如果合律例手脚新节点添加入TIP图中, 不然判定为违纪跳转, 隔绝进度. PT-CFI已毕了动态实行时的后向边沿退缩, 无需使用静态二进制重写本领, 但是该方法未对call/jmp类型的TIP包进行相应的处理, 因此无法保护适度流的前向边沿. 针对现存基于纯软件已毕的内核层CFI有想象需要对内核源码进行分析和修改的问题, 王心然等东谈主[64]提议使用PT趋奉编造化本领已毕对内核的适度流保护, 通过硬件机制避免了修改内核源码以及再行编译内核, 提高了内核适度流保护的透明性.
一些有想象将密码学应用于适度流的保护, 通过对迂反转动的复返地址或函数指针进行加密, 退却抨击者对其进行点窜. Qiu等东谈主[65]提议了一种基于物理不可克隆函数(physical unclonable function, PUF)的线性加密体绑缚构(linear encryption architecture, LEA)以退缩适度流劫执抨击. LEA是一个附加硬件模块, 由加解密单元(encryption-decryption unit, EDU), 两个寄存器(KEY_CFI和LEN_CFI)和PUF模块构成. 受保护诡计机与EDU连结并进行通讯, 寄存器和PUF在里面与EDU沿途使用. PUF模块用于生成加密/解密密钥, 并存储在KEY_CFI中, 所用密钥的长度由迂反转动提醒加密的要求决定, 并存储在LEN_CFI中. LEA在运行时对复返地址和主张地址的第一条提醒的某些字节进行加密妥协密, 具体操作是将数据与PUF生成的密钥进行异或操作. 由于PUF产生立地的, 硬件独一且不可克隆的密钥, 大大提高了被保护步调的安全性, 提高了抨击的资本. 关联词, PUF硬件可能遭到遴荐明文抨击(chosen plaintext attack, CPA), 抨击者不错通过内存泄漏或调试来推断PUF密钥. CCFI[66]和LEA-AES[67]使用高等加密模范(advanced encryption standard, AES)代替PUF摈弃这一过失, HCIC[41]使用4个寄存器KEY_1, KEY_2, KEY_LEN_1, KEY_LEN_2存储两组密钥, 在将复返地址存储在内存结构中之前, 诡计调用函数的复返地址与PUF响应之间的加密的汉明距离(encrypted Hamming distance, EHD). 然后, 当实行ret提醒时, 将在运行时诡计EHD. 临了, 将事先诡计的EHD与运行时诡计出的EHD进行比拟, 以考证EHD是否匹配. 如果抨击者修改了堆栈中的复返地址, 则EHD将不匹配, 从而退却抨击者欺诈内存过失赢得PUF密钥.
此外, 还有其他CFI有想象也基于此类硬件机制得到较好的退缩效果[68-70]. CFIGuard[38]基于LBR和PMU的组合已毕了针对代码复用抨击的CFI有想象; TSX-based CFI[71]使用英特尔的事务同步扩张(transactional synchronization extensions, TSX)[72]机制, 将适度流转念映射到事务中; Ge等东谈主[73]基于PT想象了GRIFFIN, 补助多种类型的CFI有想象, 不错字据需务已毕安全性与性能之间的纯真接济; µCFI[40]提议了CFI的独一代码主张属性, 即功令对于任何迂反转动提醒的每次调用, 王人有且唯有一个允许的主张. µCFI欺诈PT机制对受保护步调严格实行这一属性, 得到较好的退缩效果.
基于LBR、PT等硬件已毕的CFI有想象不错极大抨击检测的遵循, 措置纯软件CFI有想象高支出的问题, 但是此类退缩需要相应硬件的补助, 莫得对底层处理器架构进行转换. 不外跟着ROP等适度流劫执抨击的流行, 包括Intel在内的处理器供应商运行逐步将安全原语集成到处理器想象中, 以灵验搪塞特定的抨击. 例如最近加入到ARMv8-A架构的新提醒指针考证(pointer authentication, PA)不错保护指针好意思满性, 这种径直将安全原语集成在底层处理器架构中的式样不错减小CFI有想象对特定硬件的依赖, 将是硬件辅助的CFI有想象的发展趋势.
4 高下文敏锐的CFI跟着适度流劫执抨击的迭代与发展, 粗粒度的CFI依然无法招架最新的ROP抨击[74, 75], 此外, 细粒度的CFI也已被评释存在被绕过的可能性[76]. 高下文敏锐的适度流好意思满性(context-sensitive CFI, CCFI)是有望措置这一问题的方法. CCFI欺诈进度实行的历史信息手脚跳转正当性的参考依据之一, 并趋奉CFG对进度的实处事态进行考证, 提高CFI的退缩智力.
4.1 适度流波折高下文无关的CFI时常只眷注辗转跳转主张地址的正当性, 而不眷注跳转礼貌的正当性, 粗粒度的CFI对迂反转动主张地址类别的别离则更为宽松, 对并吞主张鸠合中的主张地址的跳转礼貌不作念区分, 这便给了抨击者可乘之机. Göktas等东谈主[77]在Overcoming CFI抨击方法中构造了两种gadget, 绕过了粗粒度CFI的搜检机制. 这两种gadget天然幽闲CFI机制界说的正当适度流转动要求, 但并不符合进度确凿的运行情况, 其实质原因就在于粗粒度CFI无法对并吞主张鸠合中的跳转礼貌进行进一步区分. Burow等东谈主[12]将这种CFI有想象中最小可区分的一组迂反转动主张界说为等价类(equivalence class, EC). 并指出CFI有想象应该寻求粗略减小平均和最大EC领域的CFI有想象来提高安全性, 这是因为较大领域的EC包含更多的迂反转动主张, 因此更容易受到抨击.
Carlini等东谈主[78]将这类针平等价类的抨击式样归纳为适度流波折(control-flow bending, CFB), CFB界说为每次适度流传输王人在灵验CFG范围内的非适度数据抨击, 允许抨击者改换应用进度的适度流, 但不会导致适度流偏离CFG. 图6展示了适度流波折的典型示例, 函数A和函数C王人包含对函数B的调用, 在平时实行情况下, 函数A滥觞在边沿1上实行对函数B的调用, 函数B复返边沿2; 函数C在边沿3上实行对函数B的调用, 函数B复返边沿4. 适度流波折抨击不错使函数A调用B后沿边沿4复返, 或者使函数C调用B后沿边沿2复返. 这种抨击时常是恰当CFI功令的, 即使细粒度的CFI也难以发现这种抨击式样.

作家通过实验得手抨击了具有较高平均辗转主张减一丝(average indirect target reduction, AIR)[28]和较少gadget数目的CFI有想象, 评释了现存评估目的无法较好评估CFI安全性. 作家指出CFI有想象部署影子堆栈的必要性, 进一步通过对6个软件的抨击实验, 评估了细粒度CFI有想象的退缩效果. 实验终结标明, 部署了细粒度CFI的6个软件中有5个依然受到了非适度数据抨击, 这种抨击只进行不影响进度适度流的数据点窜, 使得修改后的辗转跳转主张仍在CFI有想象界说的EC中, 因此不会被检测到, 这进一步评释了减小EC最大领域对保护适度流安全的弥留性. CCFI欺诈历史实行旅途或调用点的特异性等高下文信息对辗转跳转主张地址进行进一步的细分, 不错灵验减小EC的领域, 这给退缩适度流波折提供了新的想路.
4.2 硬件补助的CCFICCFI在提议时被以为不切践诺而未引起东谈主们眷注, 因为其已毕需要监控进度的实行历史旅途或其他信息, 这会带来较大的运行支出. 跟着诡计机硬件的迭代发展, 商用处理器中集成了越来越多的进度实行信息获取机制, 例如Intel处理器的LBR和PT等, 这些硬件功能提供了关联径直和辗转分支的丰富高下文信息, 从而使CCFI的践诺应用成为了可能.
van de Veen等东谈主[15]指出践诺应用CCFI所靠近的3大挑战, 即高效的旅途监控、旅途分析和旅途考证, 并欺诈硬件LBR机制已毕了第一个不错践诺部署的二进制级别的CCFI措置有想象PathArmor. PathArmor由内核模块、旅途分析模块和动态检测模块构成, 其中内核模块通过LBR对多线程步调中的各个线程的辗转跳转进行缓存纪录, 已毕高效的旅途监控, 同期在安全性敏锐的系统调用之后将会触发旅途考证门径, 并使用旅途缓存存储先前考证过旅途的哈希值, 来提高考证遵循; 旅途分析模块从内核模块获取旅途信息何况实行静态分析, 重建主张步调的CFG, 通过一定范围内的高下文敏锐静态分析得到实行旅途, 确保可扩张的按需旅途分析, 灵验地裁汰了运行支出, 摈弃旅途爆炸问题, 旅途考证经由则通过对CFG实行深度优先搜索来寻找具有与LBR纪录疏浚礼貌的边的旅途; 动态检测模块的主邀功能是汇集库文献和主张步调的地址偏移量并传递给旅途分析模块, 重写主张进度的通盘库函数, 插入代码片断确保库函数在实行之前滥觞向内核模块的LBR接口发送禁用请求, 并在实行终局后再行启用. 此外, 动态检测模块设立了一个与内核模块的通讯通谈来启用旅途监控功能. PathArmor措置了CCFI通盘的基本挑战, 何况经实考评释具有比以往高下文无关的CFI有想象更好的性能.
PITTYPAT[46]通过贵重一个影子实行/分析经由来强制实行旅途敏锐的CFI. 该影子实行/分析经由仅搜检与适度干系的数据, 同期与受监视的进度同期运行. PITTYPAT由驱动模块和分析模块两部分构成, 基于英特尔的PT硬件机制已毕. 当步调实行时, 驱动模块从PT的数据包中获取适度流转动的主张地址, 分析模块字据这些主张地址重建实行旅途, 并实行旅途敏锐点分析. 一朝受监视进度试图将适度权转动到违纪分支, 将激发造作.
由于LBR、PT等硬件机制只可在内核气象下拜谒, 因此基于此类机制的CFI有想象需要对内核进行转换, 这不仅增多了想象的复杂性, 也增多了性能支出. 针对这一问题, Khandaker等东谈主[48]提议了调用点敏锐的CFI有想象CFI-LB, 该方法使用辗转调用点手脚高下文, 且每个调用点具有自恰当高下文敏锐性, 允许细目我方的敏锐度级别来均衡安全性和性能, 并通过静态和动态分析等方法生成多圭臬的CFG, 并将其应用于线上和离线适度转动考证, 相较于基于实行旅途的CFI有想象支出更小. 此外, 为了避免受到其他良性但易受抨击的线程的垄断, CFI-LB使用Intel处理器的TSX机制已毕了原子性.
由于一个迂反转动提醒对应的传入实行旅途数目有限, PathArmor、PITTYPAT等旅途敏锐的CFI有想象难以判辨大领域的EC. 针对这一问题, Khandaker等东谈主[47]提议了发祥敏锐的CFI (origin-sensitive CFI, OS-CFI), 将辗转适度转动提醒调用的代码指针的发祥手脚高下文, 并以此不休迂反转动的主张, 相较于旅途敏锐的已毕有想象, 不错将EC细分至更小的领域. 对于编造调用, OS-CFI存储了以对象指针和对象的创建位置手脚键值对的元数据, 因此不错很容易地检测到任何松懈对象指针的COOP抨击, 从长途毕对象类型好意思满性[79]. 此外, OS-CFI使用Intel处理器的MPX机制存储和检索指针源, 使用TSX机制来已毕原子性. 实验终结标明, OS-CFI不错将SPEC CPU2006基准测试中的最大EC的领域从168减小到2.
CCFI欺诈进度的高下文语义信息, 不错灵验减小EC的大小, 表面上增强了CFI的退缩智力, 而在践诺应用中仍然靠近一些问题. 安全性方面, 如安在有限的实行旅途中找到合适的高下文, 从而灵验地减小EC的尺寸, 是CCFI有想象需要措置的关节问题. 性能方面, 现存的CCFI有想象均使用了LBR、PT等硬件机制已毕高下文信息的获取, 关联词相较于高下文无关的CFI有想象, CCFI的运行支出依然较大, 实行遵循需要进一步提高. 从通盘这个词CFI本领发展的经由来看, 为了达到更好的安全性和性能, 改日CCFI本领的发展离不开底层处理器架构的补助.
5 CFI的评价方法为了对比和评价不同CFI机制的优劣, 谈论东谈主员也从不同角度提议了评价方法. 面前谈论界主要眷注CFI机制两个方面的目的: CFI机制的安全性目的和性能目的. 其中安全性目的估计了CFI有想象对适度流劫执抨击的退缩性能, 而性能目的估计了CFI有想象的运行支出. 除此除外, 还有一些针对CFI有想象的兼容性等其他方面的度量谈论. 本节对现存CFI有想象的评价谈论进行了详备的先容, 表2列举了现存的评价谈论过头评价角度.

CFI是一种运行时退缩技能, 对适度流的转动进行及时的监控, 其运行支出时常不可忽略. 性能较差的CFI有想象会影响被保护步调的平时运行, 无法部署在践诺应用中, 因此, CFI有想象的性能受到谈论东谈主员的等闲眷注. 面前科研东谈主员频频使用SPEC CPU benchmark评估CFI有想象的运行支出. SPEC CPU benchmark是模范性能评估机构SPEC推出的行业模范化的CPU测试基准套件, 特意用于评估CPU的性能, 被等闲应用于工业界和学术界. 为了保执基准数据真的凿性、自制性和干系性, SPEC CPU从践诺应用步调中索取基准, 而不是使用东谈主工合成的式样制作. SPEC先后推出了SPEC CPU2000[84]、SPEC CPU2006[85]以及SPEC CPU2017[86]版块, 延续增多测试基准步调数目、提高易用性. 最新的SPEC CPU2017分为4个套件, 包括43个基准测试, 并对CPU的整点运算性能和浮点运算性能分别进行测试.
本文统计的CFI有想象中, 跨越2/3的有想象使用SPEC CPU基准来评估性能支出. 其余有想象莫得使用SPEC CPU基准, 这是由于这些有想象主要针对特定的应用场景, 包括用于编造机的适度流保护[16, 87]、用于手机的适度流保护[26, 88]、用于镶嵌式系统的适度流保护[34, 89-94]以及操作系统的适度流保护[95], 这些有想象罗致了特定领域的专用测试套件[96-99]. 此外, 一些CFI有想象中也使用SPEC CPU与其他测试套件[100-102]趋奉来评估性能支出. 表3列举了现存CFI机制文献中所答复的性能支出过头所使用的测试套件, “-”暗示莫得对应的实验终结.

安全性是估计CFI退缩效果的最弥留目的之一, 学界也针对CFI的安全性评价提议了多种度量方法, 包括评价目的、评估框架及评估套件. 关联词, 由于各CFI有想象的已毕旨趣、应用场景相反较大, 到咫尺为止, 尚未形成融合的度量模范.
Zhang等东谈主[28]提议使用AIR评估CFI有想象的安全性. AIR量化了使用CFI有想象减少的辗转适度流(indirect control flow, ICF)主张的比例, 界说如下:
$ AIR = \frac{1}{n}\sum\limits_{j = 1}^n {\left( {1 - \frac{{\left| {{T_j}} \right|}}{S}} \right)} $ (1)其中, ${i_1}, \ldots, {i_n}$ 是步调中通盘的ICF传输, S是一个未被CFI保护的步调中通盘的ICF主张, Tj是使用CFI有想象之后剩余的ICF主张鸠合, 则AIR界说为n个ICF传输中迂反转动主张减少的百分比的平均值. 则AIR的值越大, 说明对应CFI有想象的安全性越好.
Ge等东谈主[80]指出AIR不可直不雅地刻画CFI有想象与CFG的近似程度, 并提议平均辗转主张允许量(average indirect target allowed, AIA), 界说如下:
$ AIA = \frac{1}{n}\sum\limits_{i = 1}^n {\left| {{T_i}} \right|} $ (2)其中, ${i_1}, \ldots, {i_n}$ 是步调中通盘的ICF传输, Ti分别是其允许传输的主张鸠合. AIA不错估计CFI有想象的严格程度, 关联词只可用于比拟并吞步调上的CFI有想象, 局限性较大.
AIR目的在CFI有想象的安全性评价方面得到了等闲的应用, 但是也遭到了一些谈论东谈主员的质疑[19, 77], 一方面, 由于AIR公式中的S稠密于Tj, 使得绝大部分CFI王人不错达到99%的AIR值, 这标明AIR不可较好地评估不同CFI有想象之间安全性的相反; 另一方面, 即使迂反转动主张多数减少, 进度依然可能遭到近似CFB的抨击式样, 体现了AIR目的的局限性.
Burow等东谈主[12]提议了一个等式用于量化CFI有想象的安全性, 等式的面容如下:
$ Q{S_{\rm CFI}} = EC \times \frac{1}{{LC}} $ (3)其中, EC是等价类的总和量, LC是等价类的最大领域, $Q{S_{\rm CFI}}$ 为安全性的量化数值. 等价类的数目增多以及最大等价类领域的减小会使得安全性数值增大. 这是由于等价类的数目增多, 意味着每个等价类的领域减小, 从而为抨击者提供更少的抨击面; 适度LC则是为了适度离群值, 使得等价类举座领域趋于袖珍化. 等价类领域被评释与CFI有想象的安全性密切干系, 也使得减少等价类最大领域成为科研东谈主员提高CFI退缩性能的主张之一.
Khandaker等东谈主[48]指出公式(3)不适用于对CCFI有想象进行评估, 这是由于不同CCFI有想象可能使用不同的高下文, 从而导致CFG中EC的数目不同. 此外, EC的数目不错成倍增多, 而LC的变化速率要慢得多. 为了措置这个问题, Khandaker等东谈主提议了一个检阅的等式, 并建议用该等式评估通盘CFI有想象的安全性, 等式的面容如下:
$ Q{S_{\rm CFI}}' = AV{G_{\rm EC}} \times LC $ (4)其中, $AV{G_{\rm EC}}$ 是通盘EC的平均领域, LC代表等价类的最大领域, $Q{S_{\rm CFI}}'$ 为安全性的量化数值, 且 $Q{S_{\rm CFI}}'$ 越大, 安全性越差.
不同CFI有想象已毕的底层硬件、操作系统以及基准遴荐的不同, 给融合评估CFI有想象的安全性带来了较大的难度, 使用单一的评价目的难以全面评估CFI的退缩性能. 针对这一问题, Muntean等东谈主[82]提议一个静态源代码分析框架LLVM-CFI, 在并吞环境对现存CFI计谋进行建模和模拟. 作家提议了4个基于LLVM-CFI的新目的, 进行针对CFI计谋的多方面分析, 从长途毕了CFI有想象在疏浚运行环境的融合评估.
RIPE套件[103]也被许多谈论东谈主员等闲用于评估CFI的安全性和精度. RIPE套件包含850个缓冲区溢出抨击面容, 包括针对堆栈、数据段的代码注入抨击、Return-into-libc抨击、ROP抨击等. 它旨在提供一种模范的方法来量化一般退缩机制的安全覆盖范围.
5.3 CFI的其他评价方法除了性能和安全性除外, 一些谈论东谈主员着眼于谈论奈何评价CFI有想象的践诺应用效果. Farkhani等东谈主[106]从安全性和实用性两个角度评估了基于运行时类型搜检(runtime type checking, RTC)的CFI机制的灵验性. 该有想象构建了一种罕见的ROP抨击Typed ROP (TROP), 这种ROP抨击需要保证点窜的函数指针与函数类型一致, 因此不错绕过RTC. 作家统计了多个应用步调中可能出现的无效主张函数和无效辗转调用的数目, 发现仅在Nginx中就有3512个指针指向319个无效主张函数, 这是由于这些主张函数分享疏浚的类型签名. 这标未来然径直幽闲TROP抨击条目的情况较少, 但是抨击者不错通过调用这些具有疏浚签名的无效主张函数来完成TROP抨击. 谈论终结标明, 天然RTC是一种实用的退缩技能, 但它自身不及以退缩适度流劫执抨击.
CFI机制部署到践诺应用步调时, 会出现一些兼容性问题, 由于不兼容而无法得到CFI保护的应用步调靠近极大的安全风险. Xu等东谈主[81]提议了一个测试套件CONFIRM, 主要用于评估CFI有想象的可用性和兼容性. CONFIRM提供了24种针对多样CFI干系代码功能和编码民俗的测试, 并对12种开源CFI有想象进行了评估. 实验终结标明, CFI表面的应用存在很大的兼容性问题, 现存CFI有想象对一部分代码或软件无法完全补助, 致使于性能弱化而无法退缩精深的适度流劫执抨击. 开端进的CFI措置有想象与用于保护大型生意软件系统所需的CFI干系代码功能的兼容性唯有约53%. 多线程、自界说内存照料以及与多样面容的运行时期码生成干系的兼容性和安全性适度是部署CFI本领的最大沉重.
Li等东谈主[83]提议了一种测量CFI践诺安全性与表面安全性差距的措置有想象, 该有想象使用一个轻量级的通用器具CScan来精确测量CFI的迂反转动提醒在运行时的灵验跳转主张, 并将其界说为CFI的践诺畛域, 其中包含了CFI声明的表面畛域和非预期的跳转主张; 为了进一步评估非预期的跳转主张是否确凿, 作家提议了由23个易受抨击的C/C++步调构成的测试套件CBench, CBench滥觞应用主张CFI机制保护这些易受抨击的步调, 并使用想象好的典型抨击来考证主张CFI机制的灵验性. 作家使用CScan和CBench评估了12种开源CFI机制, 并指出其中10种机制未达到其宣称的表面安全效果.
6 归来与瞻望为了招架适度流劫执抨击, 保护系统安全, 针对CFI的谈论受到越来越多科研东谈主员的眷注. 本文提供了针对CFI的综述. 具体来说, 本文将现存CFI方法分为高下文无关的CFI和高下文敏锐的CFI, 并从已毕有想象和评估方法两方面对该领域进行了详备全面的综述.
尽管咫尺依然有许多谈论围绕CFI进行张开, 但咫尺针对该领域的谈论还不够完善, 好多方面王人具有较大的检阅空间, 谈论东谈主员也正在积极地探索与检阅. 在这里, 本章对仍然存在的挑战进行列举, 以期为改日的谈论标的提供参考, 从而进一步提高对适度流劫执抨击的退缩智力.
(1) CFI有想象的安全性仍存在较大隐患. 粗粒度的CFI天然运行支出较小, 但是已被评释难以招架高等别的ROP抨击. CFB则提议了EC内可能存在的抨击活动, 说明了适度流不错在EC里面被抨击而不被检测到, 这使得具有较大EC领域的细粒度CFI亦无法避免. 因此, 通过趋奉进度实行高下文灵验减小最大EC领域的低支出CCFI, 是一个可能的探索标的.
(2) 尽管CFI已得手应用于一些大型应用步调, 关联词CFI表面与践诺应用之间仍然存在着较大的差距. 这频频是由许多基于源代码已毕的CFI算法需要通盘这个词软件生态系统的好意思满源代码, 以便正确地分析应用步调适度流所导致. 此外, 商用软件规范所共有的复杂适度流, 例如GUI交互, 事件驱动等也为CFI有想象的应用带来巨大的挑战[107]. 因此, 奈何提高CFI有想象与被保护二进制步调的兼容性是一项尚待措置的问题.
(3) 咫尺仍枯竭一种针对CFI有想象的系统评价方法. 一方面调教 漫画, 不同CFI有想象已毕的底层硬件竖立, 操作系统以及基准测试的遴荐方面均有相反, 这给不同有想象之间的评估酿成较大的侵扰; 另一方面, 学界对奈何评估CFI有想象的安全性尚未达成一致, 枯竭一个科学的评价体系来定量地评估CFI有想象的退缩智力. 因此, 亟需一套融合的、系统的评估方法来对CFI有想象进行全面而客不雅的评价.