计算机安全之隐蔽软件
摘要:隐蔽软件是近十几年来计算机安全研究领域的一个新兴分支,与传统的安全研究不同,隐蔽软件不关心如何使计算机免于计算机病毒入侵,它关心的是计算机病毒的作者是如何防止他人分析病毒的。本文主要就这类隐蔽软件开展分析。
关键词:隐蔽软件;计算机安全;攻击和防御;程序分析方法
计算机安全研究的目的就是防止黑客控制我们的电脑,这些技术的基本设计思想是限制黑客攻击的同时又不影响用户正常使用电脑。我们要讨论的就是这些技术,我们把这种能保护软件中含有的秘密免受攻击的技术成为软件保护✈技术,相应的软件称为隐蔽软件。
一、什么是隐蔽软件
隐蔽软件(surreptitious software)是近十年来计算机安全研究领域新兴的一个分支。在隐蔽软件的研究过程中不仅需要借鉴计算机安全方面的技术,还会用到计算机科学其他领域的大量技术,如密码学、隐写术、数字水印、软件量度(software met유ric)、逆向工程以及编译器优化等。我们使用这些技术来满足在计算机程序中安全存储秘密信息的需求,尽管这些需求的表现形式千差万别、各不相同。
与传统的安全研究不同,隐蔽软件不关心如何使计算机免于计算机病毒入侵,它关心的是计算机病毒的作者是如何防止他人分析病毒的!同样,我们也不关心软件到底有没有安全漏洞,我们关心的是如何隐蔽的在程序中加入一些只有在程序被篡改时才会执行的代码。密码学研究领域中,被加密数据的安全性依赖于加密密钥的隐秘性,而我们现在研究的恰恰是如何隐藏密钥,软件工程中有大量的软件量度技术,以确保程序结构良好。
传统的计算机安全和密码学研究成果有事并不能解决实际工作中遇到的且待解决的安全问题。比如使用软件水印技术防止软件盗版,软件水印是在程序中嵌入的唯一标识(类似信用卡的卡号或者版权声明),通过这个标识,程序的某个副本就和程序的作者或者客户联系在了一起。假若发现市场上在买自己软件的盗版光盘,就可以通过在盗版软件中提取的水印追查制作这个盗版软件的母版当初是谁从你这买走的。当给合作商提供新开发的游戏的测试版时,你也可以在测试版中加上数字水印。要是你感觉有人泄露了你的代码,就能找出肇事者,并把他送上法庭。
以往的经验证明,任何类似“不公开,即安全”的做法最终都将以失败告终,而且不管在程序中怎样隐藏密钥,最终它都逃不出一个足够顽强的逆向分析人员的手心。当然,必须承认你的做法也还是对的。可以说绝大部分的技巧都不能保证软件能永远免于黑客的毒手。不必保证某个东西永远处于保密状态,也不必保证程序永远处于不可能被篡改的状态,更不需要保证代码永远不会被剽窃。除非这个研究领域有什么重大的突破,否则能指望的只是延缓对方的攻击。我们的目标就是把攻击者的攻击速度减缓到足够低,使他感到攻击你的软件十分痛苦或要付出过高的代价,从而放弃攻击。也可能攻击者很有耐心地花了很长时间攻破了你的防御,但这时你已经重这个软件中赚够了钱,或者已经用上了更新版本的代码,这时候他得到的东西也就没有什么价值了。
二、攻击和防御
或者从事计算机安全相关的工作。比如在密码学研究中,我们一般都会假设“攻击者是拿不到密钥的”,“攻击者在因式分解的计算机能力上并不比我强”或者“攻击者破坏不开这种智能卡”,一旦确定了攻击模型,你就可以由此出发,着手设计一个在此模型下安全的系统。在实际操作中,攻击者会马上试图寻找你忽略掉的东西,并以此绕过你设计的防线。攻击加密系统最好的办法并不是花上80万去制造专门的硬件去破解密钥,而是花40万去贿赂那个拥有密钥的人。同样破解智能卡的最佳方法也不是硬把卡敲开,而是通过改变输入智能卡的电压,把智能卡放在X光灯下面照射等方法探测智能卡设计上的缺陷,总之就是要从被设计者忽略的地方着手。
在隐蔽软件的研究中,情况也是一样。研究者也会根据自己的研究方向,而不是所有的破解者可能使用的攻击方法去设定攻击模型。有的研究者可能会给出这样的一种攻击模型:“攻击者会把整个软件看成一个图,并试图从图中找出一个与图的其他部分联系最不紧密的子图,而秘密信息很可能就隐藏在这个子图中。因为程序中所含的秘密并不是程序自身的一部分,而是后来被添加进程序的,所以它与程序之间的联系一定会比程序自身内部的联系弱一些”。这种是有深厚图论功底的。有些研究者可能会低估攻击者的能力:“攻击者不会运行这个程序,所以我的程序很安全”,又有些研究者会高估攻击者的本领:“攻击者拥有或者会编写一个很复杂的针对被攻击程序的测试输入集,所以即使程序不是攻击者编写的,甚至在攻击者连程序的源码或者文档也没有的情况下,他仍然能对程序进行批量修改”。
遗憾的是,现在已发表的很多关于隐蔽软件的论文中根本就不曾提及针对的是何种攻击模型。
三、程序分析方法
对程序的攻击一般分为两个步骤:一是分析阶段,就是从程序中收集相关信息,二是转换阶段,就是根据收集到的信息对程序进行修改,而分析程序则有两种基本的方法:第一种只是分析程序代码本身,第二种运行程序搜集信息。
在过去的这些年里,人们已经开发了很多程序静态分析方法。它们大多数是由软件工程研究人员为了减少程序中可能出现的漏洞,或者编译器设计者为了优化程序而研发的,但也有一些破解高手为了减少程序中可能出现的漏洞,或者编译器设计者为了优化程序而研发的,但也有一些破界高手为了除去程序中的软件保护代码而自己开发了一些程序静态分析方法。静态分析搜集到的信息是保守的。说它是“保守的”是因为只有那些确定的信息才会被收集到,即使只有略微一点点的疑问的信息都不会被静态分析工具收集。
动态分析是通过运行程序,并给程序输入一定的数据的方式来收集信息的,而动态分析收集到的信息精准性则取决于输入数据的完备性。只有根据使用静态分析获得的信息进行的代码转换才是安全的,换言之,根据动态分析所收集到的信息进行的代码转换时不安全的,如果输入的数据集不完备,那么所做的修改很可能就把程序给改错了。 攻击者是根据自己的意图选用不同的代码分析与转换方法的。ป如果他只想破解某个软件,那他只需要一些最基本的静态和动态分析工具就够了,但如果他想搞清楚一个大型程序中所使用的某个算法的话,那一个能把可执行文件完全反编译回源码状态的反编译器对他就会比较有用。
四、代码混淆
代码混淆这一技术的特别之处在于,它是一把双刃剑:它既能被坏蛋们在恶意代码上使用,让病毒木马难以别发现,又能被好人们用来防止自己的软件被破解,但同样在盗ด版,反盗版的斗争中,坏蛋们又会用它来抹除好人们嵌在软件中的水印。
多数情况下,混淆程序就意味着把程序转换成一种更为难读的、更难修改的形式。从这个角度上说,我们发布软件的二进制可ภ执行文件而不是程序的源码就是一种代码混淆,因为二进制机器码要比高级语言源码难读的多,同样,使用编译器优化一个程序也可以被认为是对这个程序进行混淆。因为不论是手工分析还是使用工具,优化后的代码总是比没有优化的代码难处理的多。因为代码优化工具对代码进行转换只是为了生成运行速度更快、个头更小的代码,而我们混淆代码的目的就是为了使代码变得更难分析,当然代码混淆也有些副作用,比如它会生成体积比较大,或者运行速度更慢的程序,所以软件开发人员在使用代码混淆技术时要权衡一下利弊,决定一下程序的哪些部分需要保护,哪些部分只好放弃保护。
事情没有绝对,软件也没有绝对安全,所以你必须要权衡一下利弊,决定是不是要在的的项目中使用软件保护技术。