基于完整性验证的软件防篡改方案
2016-09-08马巧梅胡沙沙陈够喜
马巧梅 胡沙沙 陈够喜
(中北大学计算机与控制工程学院 山西 太原 030051)
基于完整性验证的软件防篡改方案
马巧梅胡沙沙陈够喜
(中北大学计算机与控制工程学院山西 太原 030051)
为了解决软件响应和验证易受攻击的问题,对现有的防篡改方案进行研究,提出一种基于完整性验证的防篡改模型TPM(Tamper Proofing Model)。该方案将软件分为多个单元,采用多种加密方式加密软件,对程序的控制流进行完整性验证得到Hash值,通过隐藏在程序中的密钥生成函数,利用得到的哈希值、注册码和用户码来计算各个加密单元的解密密钥。理论分析和实验结果表明,该模型无需修改底层硬件,易于实现,开销小且算法安全性高。
防篡改完整性验证控制流安全性
0 引 言
防篡改技术是通过软硬件措施防止软件被非法修改、分发和使用的一种技术和科学[1]。现有防篡改技术分为两类[2]:一类是静态防篡改技术;另一类是动态防篡改技术。前者针对程序静态分析,阻止攻击者对程序实施逆向工程以提取程序的核心代码;后者阻止攻击者篡改程序,使意图篡改者无法执行原功能。完整性验证[3-5]是目前动态防篡改技术的一个重要研究领域。Jacob等人[6]利用代码重叠技术将隐式指令嵌入目标代码,用于验证程序运行时状态和指令的完整性。控制流完整性[7]是通过保证控制流的完整性来实现软件防篡改的方法。主要通过所得运算值与预期值的比较来判断软件是否被篡改。软件哨兵[8,9]是通过分布式来实现程序代码的保护,但哨兵本身的安全性无法保证。余艳玮等[10]在此基础上又提出了基于三线程和软件哨兵的防篡改技术,该技术利用改进的三线程结构来保护哨兵自身安全,其保护力度得到明显的提高。张贵民等人[11]提出了基于函数级控制流监控的软件防篡改,由监控模块实时获取哨兵发送的软件运行状态,通过对比运行状态和预期值判断程序是否被篡改。在目前的防篡改方案中,如隐式哈希和控制流检测都涉及与预期值比较,不合理的预期值预存方案将成为攻击者的突破口,攻击者可以通过替换预期值从而成功通过完整性验证。
针对现有方案的不足,本文提出基于完整性验证的防篡改模型。该模型使用多种方法加密软件,利用完整性验证得到的Hash值来计算每个加密模块的解密密钥。如果软件被篡改,解密密钥的计算就会出错,解密失败。该方案能加大软件的保护力度,不依赖硬件设施,成本低且易于实现。
1 基于完整性验证的防篡改模型
完整性验证是通过插入验证代码等验证机制来验证程序的完整性,以此来判断程序是否被篡改。现有的防篡改方案不能保证验证代码的安全性且验证机制易受攻击。基于此,本文提出了一种基于完整性验证的防篡改模型TPM,模型如图1所示。
图1 基于完整性验证的防篡改模型
模型中相关符号描述如下:
Pi:程序被分块后的第i个单元块;
Ci:被加密后程序的第i个单元块;
K1i:第i个单元块的加密密钥;
K2i:第i个单元块的解密密钥;
Ei:第i个单元块的加密算法;
Di:第i个单元块的解密密钥;
Fi:第i个单元块的密钥生成函数;
G:分解函数,将用户码和注册码进行分段处理;
CF[]:用于存储函数运行信息的数组;
Hi(CF[]):第i个单元块运行信息生成的Hash值;
Ui:用户码被分解后的第i个值;
Ri:注册码被分解后的第i个值。
TPM由若干个代码单元组成,在程序执行之前,所有的单元均处于加密状态。在用户获得软件后,需要输入用户码和注册码,程序会将收到的用户码和注册码分段写入自定义格式的数据文件中,再结合软件运行所得到的信息解密各个加密单元块,从而执行相应的功能。
该模型主要有以下特点:(1) 直接对二进制文件操作,不依赖源代码。(2) 无需对底层硬件和操作系统进行修改。(3) 无需存储程序的预期信息,可以避免被攻击者修改。(4) 哨兵是程序执行必不可少的一部分,能够避免被攻击者移除。(5) 验证及响应被解密所替代,能够避免被篡改,在防篡改的同时加大了对程序的保护力度。
2 基于完整性验证的防篡改方案
所有的非法篡改,最终都体现在控制流的改变上,所以对控制流的监控可以检测软件是否被防篡改。程序按函数来划分为不同的功能模块,所以可以通过验证函数控制流的完整性来保证程序的完整性。如何获取控制流以及如何根据所得到的控制流来判断程序是否被篡改是本文需要解决的问题。
2.1控制流的获取
多数防篡改机制都是向软件中植入监控代码来实现,监控代码即为哨兵,通过哨兵实时获取软件的运行状态,哨兵的植入无需修改底层操作系统,易于实现,合理选择植入位置和数量能够减少对软件性能的影响。控制流图是一个过程或程序的抽象表现,用以描述软件行为,既可以通过源文件获取,也可以通过对二进制文件进行静态分析来获取。从二进制文件获取控制流图[12]的研究成果较多,在本文中,软件的正常运行行为用函数级控制流图来描述。
函数的执行序列即为程序的运行状态,为了获取软件的运行信息,可以在程序中植入哨兵。为了保证监控的力度,可在每个函数入口处植入哨兵,哨兵执行完后再执行函数的功能。本文中的哨兵只执行跳转功能,即将哨兵后的函数名发送给完整性验证函数数组,该数组按每个函数的执行顺序存放各函数名,用于后续的完整性验证。图2为示例程序的函数级控制流图。
图2 程序example的函数控制流图
获取函数的控制流图, 是为了用函数的运行信息来判断程序是否被篡改。用一个数组CF[]来存储函数的运行信息,每当执行一个函数,哨兵就会将要执行函数的函数名发送给该数组,数组按发送的顺序来存储各函数名。所有哨兵共享此部分代码,每读取完一次数组信息,就将数组清空,以接收下一个单元的相关运行信息,实现数组共享。
2.2分存策略
防篡改机制弹性的强弱即机制的抗攻击性强弱,本方案的验证机制被解密功能所替代。若想篡改软件,首先应解密所有程序,即必须先获得所有解密密钥。为了增大机制的抗攻击性,本方案采取分存策略,即将一个载体分解为多个载体进行传输和存储。
设f(x)是[0,1]上的函数,n∈Z+,Bernstein多项式函数Bn(x)[13]定义为:
(1)
(2)
根据每个单元加密方法的不同,选择合适的函数使其满足:
K2i=Fi(Ui,Ri,Hi(CF[]))
(3)
用Bernstein多项式对注册码和用户码进行分存,将注册码和用户码按式(1)分解为若干个不同的子注册码和用户码,进而可推导出式(2)。然后根据所得到的子用户码,注册码以及得到的各单元的Hash值,运用式(3)构造出满足要求的密钥生成函数F,并用这些函数来计算每个加密单元的解密密钥,从而在程序中实现分存。
2.3方案的实现
动态防篡改机制是验证软件是否被篡改,并对篡改作出响应的一种技术。通过验证自身的完整性来判断软件是否被篡改,完整性的验证主要通过加入验证模块来实现,如何保证验证模块的安全和可信是研究的重点。本文方案将验证模块作为程序执行必不可少的一部分,使得对验证模块进行任意的修改和删除都会破坏软件的正常执行。这样既可以避免验证模块被绕过又可以避免验证模块被修改或移除。TPM由若干个加密代码单元组成,每一个单元的解密密钥均由隐藏在程序中的F计算得到。在整个程序的运行过程中,只有上一个单元正确运行完成才能正确解密下一个单元。任何更改程序运行功能的行为都会使解密密钥的计算结果不正确,程序解密异常,TPM的运行过程如下:
(1) 用户输入U和R。
(2) 通过分解函数G将U和R分存成多段。
(3) 利用得到的第一组用户码和注册码解密第一个加密单元,并将依次执行函数的函数名发送给控制流储存数组。
(4) 利用第二组用户码和注册码以及得到的H2(CF[]), 通过密钥生成函数F2来计算第二个加密单元的密钥,解密加密单元并执行自身功能。
(5) 触发下一单元的解密函数,计算密钥,解密并执行。
(6) 重复执行,直至所有单元被执行。
基于完整性验证的软件防篡改,使用多种加密方法对程序进行加密,且构造多个不同的Fi。程序的响应功能被解密所替代,而程序的密钥是计算得到的,无法被攻击者定位提取,破解者只有通过对加密软件本身进行破解,这样在一定程度上加大了破解的难度。计算密钥所需的用户名和注册码是用户自己输入的,通过对函数级完整性进行验证得到计算密钥所需的另一个值,任何一个数据的出错都会导致密钥计算结果的不一致。即使软件破解者破解了其中的几个加密单元,也不能由解密密钥得到对应的子注册码和用户码。在对程序进行完整性验证的同时也实现了对程序的加密,进而加大了对程序的保护力度。
3 性能分析
下面从有效性、性能和安全性三个方面对本文提出的基于完整性验证的防篡改方案进行分析。
3.1有效性分析
以图2所示程序为例,图2即为程序的控制流图,在每个函数的入口处植入哨兵。在本程序中,S2含有缓存区溢出漏洞,利用该漏洞修改返回地址,使程序跳过S3继续执行,使得该程序的控制流被篡改。下面验证本文模型能否对该篡改做出反应。
当程序正常执行时会有两条执行路径,当判断条件为真时,执行的为图2所示的左边的执行路径,此时控制流储存数组得到的相关信息为CF[]={‘S’,‘1’,‘S’,‘2’,‘S’,‘3’,‘S’,‘4’}。通过计算Hash值得到Hi(CF[]),并结合相应的Ui,Ri利用隐藏在程序中的密钥生成函数来计算下一单元的解密密钥。
当判断条件为假时,执行的为图2所示的右边的执行路径,此时控制流储存数组得到的相关信息为CF[]={‘S’,‘1’,‘S’,‘5’}。通过计算Hash值得到Hi(CF[]),并结合相应的Ui,Ri利用隐藏在程序中的密钥生成函数来计算下一单元的解密密钥。
当程序的控制流被篡改时,控制流储存数组得到的相关信息为CF[]={‘S’,‘1’,‘S’,‘2’,‘S’,‘4’}。此时得到的Hash值与正常执行时得到的Hash值不一致,利用函数得到的解密密钥就会出错,使得解密失败。
根据执行序列的不同设置不同的密钥生成函数,如示例程序的两个正确的执行序列一和二,通过触发不同的密钥生成函数来保证密钥结果的唯一性。实验结果表明,基于完整性验证的防篡改机制对函数级防篡改是有效的,能够对篡改做出相应的反应。
3.2性能分析
本模型的开销主要分为两部分,第一部分为程序控制流的获取,哨兵的植入以及对程序进行加密,这部分时间开销比较大,但这部分开销跟程序的执行没有必然联系,只需要考虑第二部分哨兵发送函数运行信息以及解密的时间。为了分析本模型在植入哨兵前后运行时间的变化,用IDA Pro中的函数窗口进行分析。表1列出了个程序中哨兵的数目,图3为植入哨兵后运行时间的变化情况,其数值为植入后增加的运行时间与植入前运行时间的比值。
表1 各程序植入哨兵的数目
图3 植入哨兵后运行时间增加百分比
根据实验结果表明,约75%的程序在哨兵植入后运行时间开销增加在50%左右,所有测试程序增加的时间开销为60%。从时间开销上来说,比控制流完整性防篡改(开销增加低于45%[7])相比较大,但从空间开销上来说,控制流完整性防篡改需要在每个函数的入口和出口加入验证相关信息,而本文方案只需在入口处植入验证代码,是前者的一半。无论从时间还是空间上说,本方案与文献[11]的开销相近,但本方案的安全性高。在文献[11]中,没有考虑哨兵本身的安全性,哨兵可以被移除。若其中一处的哨兵被移除,如foo3处,程序依然按原功能正常执行,但是监控模块收到的监控序列跟所存储的信息不一致。在本方案中,哨兵作为软件执行的一部分,安全性受到保护。在时间开销上,所有哨兵共享完整性验证函数数组,在程序中仅插入跳转指令,这些指令所产生的开销很小。开销主要由
解密产生,可以通过合理的设置解密方案来减少所产生的时间开销。
3.3安全性分析
该模型的安全性体现在如下几个方面:
(1) 模型的响应环节为解密,不需要存储函数运行的相关信息。程序没有被篡改则执行相应的功能,被篡改解密失败则执行错误的功能,不需要存取原始值,不合理的原始值是攻击者的突破口,攻击者可以通过逆向工程定位进而移除。
(2) 分存策略和加密相结合,将用户码和注册码分段存储,在加大破解者获取注册信息难度的同时也确保哨兵的安全。在本方案中,哨兵作为程序正常运行的一部分,若被修改则收到的函数运行信息就会发生变动,所得的Hash就会和所预期的不一样,最终导致密钥结果计算的不一致,解密出错。
(3) 密钥生成函数隐藏在程序中,只有程序的正确运行才能触发密钥生成函数的执行。攻击者在不了解程序属性的情况下,无法确定隐秘信息的存在,即使攻击者找到了密钥生成函数所在的位置,计算密钥所需的用户码、注册码及函数正常运行信息的哈希值,其中任意一个值的出错都不可能得到正确的解密密钥。函数随机的插入到程序中,如果攻击者找到其中一个函数的所在,而且破解了一个加密模块,并不能通过解密密钥得到计算所需的用户码、注册码及运行信息,并不影响其余函数的隐秘性及安全性。如果攻击者定位删除密钥生成函数,则解密功能不能进行,程序也将无法正常运行。通过多个函数的应用,使得攻击者花费更多的时间和精力来确定每个函数的位置,这在一定程度上增加了攻击者的分析难度,进一步增加软件的安全性[14]。
4 结 语
本文提出了一种基于完整性验证的防篡改模型。该模型采用分存策略对注册码和用户码进行分段,利用对程序完整性验证得到的Hash值,结合相应的子注册码和用户码,通过多个隐藏在程序中的函数来计算各单元的解密密钥,使得程序受多种加密方式的保护,在防止软件被非法篡改的同时加大了软件的保护力度。然而并不能确保攻击者对少数函数单元内部的更改,如何在函数中加入相关的防篡改验证,进一步提高软件的防篡改能力是下一步的研究重点。
[1] David Aucsmith.Tamper resistant software:An implementation[M]//Proceedings of the First International Workshop on Information Hiding,Springer Berlin Heidelberg,1996:317-333.
[2] 王朝坤,付军宁,王建民,等.软件防篡改技术综述[J].计算机研究与发展,2011,48(6):923-933.
[3] 牛飞斐,张若箐,杨亚涛,等.基于Hash函数的计算机日志完整性检测模型设计[J].计算机工程与设计,2014,35(3):830-834.
[4] 牛毅,李清宝,钟春丽,等.独立可执行设备支持的终端代码防篡改技术研究[J].小型微型计算机系统,2013,34(12):2809-2813.
[5] 段国云,陈浩,黄文,等.一种Web程序防篡改系统的设计与实现[J].计算机工程,2014,40(5):149-153.
[6] Jacob M,Jakubowski M H,Venkatesan R.Towards integral binary execution:Implementing oblivious hashing using overlapped instruction encodings[C]//Proceedings of the 9thworkshop on Multimedia & security.New York,NY,USA:ACM,2007:129-140.
[7] Abadi M,Budiu M,Erlingsson U.Control-flow integrity principles,implementations and applications[J].ACM Transactions on Information and System Security,2009,13(1):1-40.
[8] 武少杰,鹤荣育,薛长松,等.基于循环哨兵的软件保护方法研究[J].计算机与现代化,2012,61(1):161-165.
[9] 赵媛,房鼎益,刘强波,等.应用改进哨兵的软件攻击威胁自感知方法[J].小型微型计算机系统,2014,35(7):1486-1490.
[10] 余艳玮,赵亚鑫.基于三线程保护和软件哨兵的防篡改技术[J].计算机应用,2013,33(1):1-3,34.
[11] 张贵民,李清宝,王炜,等.基于函数级控制流监控的软件防篡改[J].计算机应用,2013,33(9):2520-2524.
[12] Xu L,Sun F Q,Su Z D.Constructing precise control flow graphs from binaries[R].Davis:University of Computer Science,2009.
[13] 王蕊,杨秋翔,陈够喜,等.基于分存策略的软件保护博弈模型[J].计算机应用,2013,33(9):192-196.
[14] 张萌,陈够喜,张鹏程.高效可执行文件后门隐写算法[J].计算机应用研究,2013,30(4):1198-1204.
SOFTWARE TAMPERPROOFING SCHEME BASED ON INTEGRITY CHECKING
Ma QiaomeiHu ShashaChen Gouxi
(SchoolofComputerandControlEngineering,NorthUniversityofChina,Taiyuan030051,Shanxi,China)
To solve the problem that the software response and verification are vulnerable to attack, we studied the existing tamperproofing schemes and presented an integrity checking-based tamperproofing model. The scheme divides the software into several units and employs various encryption methods to encrypt software. By conducting integrity checking on the control flow of the program it gets the Hash value, then through the key generation function hidden in the program and by making use of the derived Hash value, register code and user ID it calculates the decryption keys of each encryption unit. Theoretical analysis and experimental results demonstrated that the model does not need to modify the underlying hardware, it is easy to implement with small overhead and strong algorithm security.
TamperproofingIntegrity checkingControl flowSecurity
2015-03-02。山西省自然科学基金项目(2012011010-1)。马巧梅,副教授,主研领域:图形图像处理,信息安全技术。胡沙沙,硕士生。陈够喜,副教授。
TP3
A
10.3969/j.issn.1000-386x.2016.08.069