虚拟机软件保护技术综述

2022-07-06 01:41李成扬陈夏润文伟平
信息安全研究 2022年7期
关键词:提取

李成扬 陈夏润 张 汉 文伟平

1(北京大学软件与微电子学院 北京 102600)

2(武汉十月科技有限责任公司战略规划部 武汉 430073)

自20世纪40年代至今,计算机(冯·诺依曼体系架构)的发展和应用已取得巨大成功[1],对其进行分析,应包含如下几点:1)足够的抽象性.可以被应用于各种实际场景,并进一步解放生产力.2)信息载体的便捷性.更低的存储成本,以及更快的传播速度.3)不可替代性.目前没有一个更好的可替代实体可以行使目前计算机的功能.而作为计算机的“核心”——软件,在发展的过程中始终处于攻与防的军事备赛中.一方面软件面临着盗版(software piracy)、逆向工程(reverse engineer)、代码篡改(code tamper)的威胁;另一方面是代码混淆(code obfuscation)、软件水印(software watermarking)、软件防篡改(software tamper-proofing)等保护措施[2].而虚拟机软件保护(virtual machine protection,VMP)[3-4]较大程度上阻止了针对软件的静态和动态分析,可将其表述为:针对程序中待保护的代码(源码或者二进制段),将其抽离转变为自定义指令,并同对应的解释器一起嵌入程序中,在程序运行时,通过解释器对自定义指令解释执行,在不暴露原有指令的前提下实现程序原有的语义.

在进一步讨论VMP的细节前,需要对进程级虚拟机和所处的攻击语境作一个铺垫说明.

1) 为了屏蔽硬件层的设计差异,进一步复用计算机资源,软件层级的虚拟化技术为使用者提供了更多的可能性.根据虚拟化对象的层级,可以进一步将虚拟机分为系统级虚拟机和进程级虚拟机[5],前者实现操作系统的虚拟化,后者实现单个应用的虚拟化,仅针对当前进程生效,如图1所示.虚拟机在实现虚拟化的过程中,实现的是将虚拟的客户系统映射到真实主机,本身并不涉及对细节的隐藏[5].但在代码保护领域提及的虚拟机软件保护(virtual machine protection)或者虚拟混淆(virtualization-based obfuscation),实现的是虚拟指令到真实指令的映射,同样的未隐藏、也未缺失某些指令功能,但对基于模式或者经验开展分析工作的自动化工具或分析人员而言,因其对虚拟指令集的不熟悉,可以实现代码逻辑或实现细节上的保护.本文语境下的VMP是进程级别的虚拟机,致力于提高软件安全性.

2) Collberg等人[6]指出恶意的终端用户在软件安全保护中应当受到足够的重视,因为合法的用户也可以对软件程序进行次数或者时间上无限制的调试,甚至是修改.MATE攻击(man-at-the-end attack)[7]和具体化的白盒攻击(white box attack)[8],对软件拥有完全访问权和控制权的用户,可以执行任意类型和次数的静态或动态分析,从而获得软件运行的内部信息或结果,所以如何在诸如此类的攻击场景中保证软件的安全,便是VMP试图解决的问题.

其次,对于VMP保护思路最早被提出的时间节点并没有统一的定论.文献[9-10]认为VMP保护最早可以追溯到Maude等人[11]提出抽离核心的代码放在硬件单元中保护执行;文献[12]认为Collberg在首次对代码混淆进行分类的文章中提出的“table interpretation”便是今日虚拟机软件保护的雏形,因为在相关的章节中已经明确提出“将代码转变为不同的虚拟机代码,并通过解释器进行解释执行”[13].虽然对于起源的时间节点没有明确的定论,但商业软件的成功推广,如VMProtect[14],Themida[15],Code Virtualizer[16]等,让工业界和学术界更多地关注于该领域的发展.同时开源的VMP项目,如VMPROTECT(https://github.com/eaglx/VMPROTECT),rewolf-x86-virtualizer(https://github.com/rwfpl/rewolf-x86-virtualizer),也进一步推动了相关技术的研究.

为了有效梳理现有的研究和工作成果,我们首先确定了virtual machine protection,virtualization-based obfuscation,emulation-based obfuscation,software protection,虚拟机软件保护,虚拟机等关键词,然后通过如下论文数据库进行检索:The DBLP Computer Science Bibliography(https://dblp.uni-trier.de),Web of Science(https://apps.webofknowledge.com),Scopus(https://scopus.com),Semantic Scholar(https://www.semanticscholar.org),中国知网(https://www.cnki.net).

最后确定了直接相关的期刊论文共46篇(截至2022年1月).不同年份论文发表数量统计如图2所示,可以看出虽然每年的数量不一,但从总体看是呈上升趋势的,特别是近几年在文章数量上有了较大的增长.从研究机构看,国内西北大学、南开大学、国防科技大学等均在此领域有对应的研究成果,但发表在高质量的国内外期刊上的文章数量还较少,同时针对VMP的综述文章更少,仅在ARES(https://www.ares-conference.eu/)上有1篇针对VMP还原的综述[12],因此本文汇总整理目前国内外在VMP的研究成果,并对VMP的发展给出一个探讨说明.

本文的贡献在于梳理汇总了国内外目前的VMP研究,针对VMP的架构和安全性分析给出了阐述说明,有助于对该领域的进一步研究.

1 问题与挑战

为了有效标识文献内容,对其进行关键词提取,如图3所示,可得出如下结论:

1) 攻击和保护方案均从不同的维度有对应的研究成果,其中左侧为攻击方式的研究,右侧为保护方式的研究;

2) 相较于攻击的方式,增强保护呈现出多元化的状态,对于安全性增强的研究多于攻击一方;

3) 相较于保护或者攻击维度的多元化,在效果的评估指标上并没有针对VMP的特定统一指标,基本上沿用了程序分析的指标,包括安全性的理论分析和性能分析.

虽然从统计的文章中可以看出对安全研究的文章从数量上多于攻击研究的文章,但是因为没有统一的客观评估指标,针对众多的安全加固方法,其真实效果是欠缺真实考量的.同时结合年份进行分析,从图4可以得到如下结论:

1) 近几年针对VMP的研究更为密集,无论是保护层面还是攻击层面;

2) 攻击层面,更多地专注于基于语义的攻击模式;保护层面相较于早期并没有较大的理论创新,更多地是针对现有方法在某一层面上的加固或强化.

现有的VMP发展中,无论是攻击层面还是保护层面均有不同的学术成果的产出,但仍然存在一些不足和挑战:一方面是保护层面有待新理论的提出,在性能开销的降低和保护效果的增强上取得更好的效果;另一方面是对于方法的评估模型或指标的构建,结合方法本身的特性给出可量化的评估方案.

2 虚拟机结构

VMP作为软件保护的一种方法,被认为是代码混淆的一种延伸发展,归结于2点原因:其一,在处理手法上同混淆相似,对源程序进行变形处理,在保证原有语义的前提下,使得程序中核心的内容被有效隐藏;其二,VMP和混淆方法的亲和性,VMP中可以使用混淆方法进行自身效果的加强[17-18].从本质上讲,作为逻辑实体的VMP本身构成包括:虚拟机指令集(virtualization instruction set,VIS)、虚拟机解释器(virtualization interpreter)和虚拟上下文(virtualization context),其结构如图5所示.

2.1 虚拟机指令集

虚拟机指令集约定了本地指令和虚拟指令的映射关系,作为解释器的输入,指定了程序原生的语义逻辑.现有的虚拟机实现中,包括基于栈(stack-based)和基于寄存器(register-based)的实现方式[17,57],这里的分类依据便是指令集的设计.基于栈式的虚拟机实现中,将原生的指令转变为基于堆栈的操作,对虚拟机上下文传入的数据以堆栈的形式进行计算,通过压栈和出栈实现对应的逻辑运算.从虚拟机的设计上分析,栈式虚拟机是简单易于实现的,因为没有寄存器的分配问题,简化了指令集的设计难度,如VMProtect的指令架构便是基于栈;基于寄存器的虚拟机,使用类似精简指令集的形式,模拟出原生的指令功能,因此,在单条指令的长度上长于基于栈的指令,但实现相同的功能点时,对应的总体指令数量会少于栈式实现.因此,文献[17]对2种实现方式进行对比,通过实验证明,基于寄存器的解释器相较于基于栈的实现方式,能有效减少虚拟指令数量,获得更小的运行时间开销.

在指令集的设计上,考虑到虚拟机本身的开销较大[13,33],以及因为一些原生指令的使用频率较低,如x86架构的一些平台相关的指令,鉴于对原生指令全部模拟的不必要性,所以一般自定义的指令并不是图灵完备的,因此必然涉及虚拟机环境和宿主机真实环境的切换,包括寄存器、堆栈信息和标志位的状态切换.

2.2 虚拟机解释器

虚拟机解释器和虚拟机指令集是VMP的核心,整体的安全性和执行效率均受解释器影响.虚拟机解释器是以虚拟机指令为输入,使用解释器内部的逻辑处理实现对应的原生语义.内部的处理方式归结于2个主要组件:分发器(dispatcher)和处理例程[34](handler,也称之为原子处理函数[56]).基于程序指令的取指-译码-执行的模式,当解释器面对接收到的虚拟指令时,首先通过dispatcher找到对应的handler处理单元,handler再从虚拟机上下文环境中提取对应的数据,完成相应的逻辑处理[41].

现有dispatcher的设计可以分为2大类:基于译码-执行(decode-dispatcher)的方式和基于线索化的方式[17,57].前者的架构图如图6(b)所示,解释器接收到虚拟机指令,通过分发器进行译码,确定对应的handler进行处理执行,重复这个过程,直至处理完虚拟机指令或者遇到错误,记录此时的虚拟机上下文中的数据,从虚拟机环境返回到宿主机环境,并重新对程序的堆栈、寄存器和标志位等信息进行赋值.一般的实现方式为while循环内部嵌套switch结构,通过switch case进行有效的分发,好处是具有跨平台性,移植性更好,但对应的是处理逻辑上因为使用switch存在较多的跳转,包括dispatcher和handler之间的跳转,原生程序同dispatcher之间的跳转.所以为了提高程序的执行效率,另一种实现方式是使用线索化(threaded).

基于线索化的解释器是将原本dispatcher内的间接跳转替换为handler尾部添加的直接跳转,在执行完对应的handler逻辑后,直接跳转到下一个handler进行处理,为用空间换取时间的策略,VMProtect中便有该技术的使用[42],如图6(c)所示.但对于复杂的指令序列,涉及多handler处理的情况下,这种空间开销反而成为一种负担,因此出现了混合式,即对于简单的指令序列使用线索化的方式,对于复杂的指令使用分发的方式,即文献[56]中提到的分派式加链式结构,亦即图6(d)所示.

3 虚拟机安全性分析

VMP保护的安全性涉及2种安全实体:首先是保护后的程序是否足够安全,以抵抗MATE等攻击形式;其次是VMP保护程序本身是否足够安全、是否可以抵抗外在的分析攻击.应当说,前者的安全是后者安全的超集,因为VMP还可以结合其他保护方法进行效果的强化,如结合加密[18,30-32,35],防篡改[37],但VMP自身软件的安全性对于程序的整体安全性而言是重要的.

3.1 针对虚拟机的攻击方式

目前已有的针对虚拟机的破解方法主要有2类:1)基于虚拟机结构;2)基于语义分析.

基于虚拟机结构的破解方式指代的是利用虚拟机本身的结构特性,如译码-执行模式下handler与dispatcher的跳转关系,识别出具体的handler范围;使用switch对应的跳转变量识别出虚拟机的执行流[43];使用虚拟机上下文试图推导虚拟机在切换过程中的数据流等措施[44].相应地,也有众多的文献[9,19,22-23]基于上述的分析手法进行了加强保护.

Rolles[53]首次提出基于虚拟机结构的攻击,分为6步逐步将x86架构的虚拟机代码还原为x86指令:1)对虚拟机进行逆向分析.获取虚拟机的执行语义,并构建等价的中间语言.这个过程只执行1次.2)检测虚拟机的入口.3)构建反汇编器.识别基于同套指令模板的指令集异同,并使用正则匹配约简指令的差异.4)将虚拟机操作码转变为中间代码.5)对生成的中间代码进行优化处理.6)生成x86代码.虽然是基于VMProtect的软件特性设计了具体的步骤,但是提供了一种破解虚拟机的范式.类似地,文献[54]也是基于虚拟机结构对VMP进行静态分析,以实现功能上的破解.

基于语义分析的攻击[45],不需要针对虚拟机的架构有前提假设,以程序中的数据流和控制流为基准,使用动态的符号执行、污点分析跟踪程序中变量的执行流[46-47],从而实现虚拟机指令与实际指令映射关系的重构.Coogan[48]基于恶意软件必须使用系统调用这一前提,针对虚拟化后的软件,以系统调用的相关参数为基准,对其相关的指令进行递归处理,从而实现对原生程序中重要指令的识别.特别地,在指令的识别过程中,基于用户-使用链(use-define chains),为了减小指令对解释器的依赖作用,先通过对虚拟化的指令进行数据分析,再基于识别出的指令结合汇编级指令语义的方程式推理进行控制流分析.不同于其他文章力求还原出源程序的结构,该文在对解释器无任何前提假设的情况下,致力于有效识别出程序中重要的指令.文献[49]针对switch分发模式的虚拟机保护,使用前后向的数据流分析、污点分析对虚拟机保护后的程序进行分析,通过识别变量、归类变量和对指令进行语义约简实现将自定义的指令逐步还原为x86指令,并构造出程序控制流图.同时考虑到现有的VMP安全性增强实现中,对于符号执行会有一定的抵抗作用,因此一些攻击方案中针对符号执行作了强化处理,使用符号执行结合时间戳的实现方案进行破解[50];文献[51]借助于编译器的作用从而实现对虚拟指令的有效约简.需要注意的是基于语义的分析并不只是动态的分析方式,也可以结合静态方法以提高指令的识别效率[52].

除了上述提到的方法外,针对VMP的破解方式也有结合频率分析的,如文献[44]提出针对虚拟机的频率攻击,实现对虚拟指令和本地指令映射关系的还原;但对于频率分析的使用场景,受限于指令映射的复杂性,正如文献[12]指出的,如果对指令进行分割、合并或者重复等混淆操作,频率分析便会受到一定的冲击.同时,在探究VMP安全性时,更多的文章关注的是机密性,而忽视了其完整性,而文献[55]对此通过实验验证,现有的VMP完整性方面易受攻击.

3.2 解释器:一个核心

如果VMP保护的程序可以脱离解释器进行执行,则自定义指令集的优势必然消失,因为可以借助其他语言,如中间语言,重新优化代码组织形式,建立更直接的接近于宿主机指令的映射关系,因此,如果可以绕过解释器对虚拟机指令进行转换或者去除,本质上相当于脱壳后的程序.因此,众多的文献研究重点在于加强解释器的安全性.而解释器由dispatcher和handler构成,进而安全性的加强落于这两者安全性的增强.进一步讲,解释器实现的任务是对约定的映射关系进行有效的处理,所以这种保护又可以归于2阶段的映射关系,即虚拟指令和dispatcher之间的映射,dispatcher和handler之间的映射,因此众多的文章在指令层级实现了多种增强方案.如文献[24]提出设计防篡改指令、反调试指令以增强指令的安全性.文献[27-29]均从指令多样化和随机化入手,以期复杂化映射关系,提高安全性.另一方面,为了提高抵抗污点分析和符号执行的能力,文献[25]通过提出使用污点漂白和异常机制处理等针对性的设计.也有结合有限状态机实现对指令语义进行隐藏[33]的处理方案.

同时,因为指令层级的保护方案带来的一定开销,一些文章试图以基本块为基本单位进行保护[30-32],在兼顾效率的同时,使用块级的加解密提供更高的安全性.以及牺牲一部分性能,使用嵌套虚拟机[38-39]或多套虚拟机解释器[34]的实现方式,而为了更有效地隐藏解释器内的映射关系,文献[36]提出不依赖于混淆,而是通过将分发器隐藏在CPU中实现对dispatcher的有效隐藏,从而实现对现有虚拟机破解方法的抵抗.

目前国内外的文献所讨论的虚拟机方案大多作用于x86架构,有少数文章致力于跨平台的实现方案,如文献[40]提出基于LLVM实现虚拟机,从而实现跨平台性.

最后需要补充说明的是,在软件保护及相关的应用[20-21]中,VMP的应用领域不仅可以针对可执行文件,也可以如源代码层级的保护,如针对C#,在源码层级实现了虚拟化混淆的工具[58];对JavaScript代码进行虚拟机保护,将JavaScript代码转变为WebAssembly,然后针对WebAssembly代码进行虚拟化处理[59]等方案,在实现安全的解释器的同时提供可靠的虚拟机安全性.

4 未来研究方向

作为软件保护技术的VMP,其未来的研究方向可以归为以下几点:

1) 统一的评估指标.虽然文献[12]从预期效果、使用方法的类别、自动化程度和方法的通用性层面对已有的虚拟机破解方法给出了一种评判标准,但针对虚拟机保护还没有形成统一的评判标准.现有的众多的方案设计中,仅从软件的可用性、时空开销或者单一的handler数量进行效果的评定,缺乏整体性和针对性.借鉴代码混淆的评估指标或者密码学的形式化证明,可能更有助于效果的评估.

2) 开销和保护的粒度.结合硬件加密或软件加密,一定程度上取得了更高的安全性.而如果将VMP本身的处理逻辑视为一种加解密方式,嵌套虚拟机便是加密算法的叠加使用.但两者均面临程序带来的不可忽视的运行开销.合理地选择保护的粒度,如指定保护范围,针对基本块而非每条指令,可降低开销,但对应的安全性是否仍足以抵抗现有的语义攻击,粒度的选择上对安全性的影响还需具体的实验论证.

3) 同机器学习的结合.VMP本身的优势在于自定义指令集的难理解,如果可以有效利用机器学习生成指令集和解释器,利用其本身的不可解释性,将是VMP未来自动化和市场化中可以研究的方向.

4) 跨平台性.目前的软件和硬件平台愈发呈现出多样化的趋势,针对于具体的平台进行逐个开发的难度和时间成本都不容小觑,因此,借助于LLVM等平台,利用中间语言的特性实现跨平台的方案存在具体的实际需求.但如何在缺失平台特性的情况下,开发高可用的VMP仍是目前的难点.

5 结 论

虚拟机软件保护有助于提高软件的安全性,防止被恶意的静态和动态分析.基于国内外目前的研究成果,本文首先论述了目前虚拟机保护面临的问题,包括评估指标和优化方法上的创新局限性,随后介绍了虚拟机结构,并通过引述文献,分析了其安全性,最后总结现有成果,对未来进行了展望.

猜你喜欢
提取
射击痕迹的寻找和提取
滨州市沾化冬枣核中活性多糖的提取
茶色素生物活性及制备技术研究进展
木犀草素提取工艺的研究概况
现场勘查中物证的提取及应用
土壤样品中农药残留前处理方法的研究进展
中学生开展DNA“细”提取的实践初探
浅析城市老街巷景观本土设计元素的提取与置换
虾蛄壳中甲壳素的提取工艺探究
环保新型缓蚀剂发展状况与展望