作者簡(jiǎn)介:韓佳琪(1993-),女,漢族,黑龍江樺川人,齊齊哈爾工程學(xué)院,本科,研究方向:計(jì)算機(jī)科學(xué)與技術(shù)。
摘要:隱蔽軟件是近十幾年來(lái)計(jì)算機(jī)安全研究領(lǐng)域的一個(gè)新興分支,與傳統(tǒng)的安全研究不同,隱蔽軟件不關(guān)心如何使計(jì)算機(jī)免于計(jì)算機(jī)病毒入侵,它關(guān)心的是計(jì)算機(jī)病毒的作者是如何防止他人分析病毒的。本文主要就這類(lèi)隱蔽軟件開(kāi)展分析。
關(guān)鍵詞:隱蔽軟件;計(jì)算機(jī)安全;攻擊和防御;程序分析方法
計(jì)算機(jī)安全研究的目的就是防止黑客控制我們的電腦,這些技術(shù)的基本設(shè)計(jì)思想是限制黑客攻擊的同時(shí)又不影響用戶正常使用電腦。我們要討論的就是這些技術(shù),我們把這種能保護(hù)軟件中含有的秘密免受攻擊的技術(shù)成為軟件保護(hù)技術(shù),相應(yīng)的軟件稱(chēng)為隱蔽軟件。
一、什么是隱蔽軟件
隱蔽軟件(surreptitious software)是近十年來(lái)計(jì)算機(jī)安全研究領(lǐng)域新興的一個(gè)分支。在隱蔽軟件的研究過(guò)程中不僅需要借鑒計(jì)算機(jī)安全方面的技術(shù),還會(huì)用到計(jì)算機(jī)科學(xué)其他領(lǐng)域的大量技術(shù),如密碼學(xué)、隱寫(xiě)術(shù)、數(shù)字水印、軟件量度(software metric)、逆向工程以及編譯器優(yōu)化等。我們使用這些技術(shù)來(lái)滿足在計(jì)算機(jī)程序中安全存儲(chǔ)秘密信息的需求,盡管這些需求的表現(xiàn)形式千差萬(wàn)別、各不相同。
與傳統(tǒng)的安全研究不同,隱蔽軟件不關(guān)心如何使計(jì)算機(jī)免于計(jì)算機(jī)病毒入侵,它關(guān)心的是計(jì)算機(jī)病毒的作者是如何防止他人分析病毒的!同樣,我們也不關(guān)心軟件到底有沒(méi)有安全漏洞,我們關(guān)心的是如何隱蔽的在程序中加入一些只有在程序被篡改時(shí)才會(huì)執(zhí)行的代碼。密碼學(xué)研究領(lǐng)域中,被加密數(shù)據(jù)的安全性依賴(lài)于加密密鑰的隱秘性,而我們現(xiàn)在研究的恰恰是如何隱藏密鑰,軟件工程中有大量的軟件量度技術(shù),以確保程序結(jié)構(gòu)良好。
傳統(tǒng)的計(jì)算機(jī)安全和密碼學(xué)研究成果有事并不能解決實(shí)際工作中遇到的且待解決的安全問(wèn)題。比如使用軟件水印技術(shù)防止軟件盜版,軟件水印是在程序中嵌入的唯一標(biāo)識(shí)(類(lèi)似信用卡的卡號(hào)或者版權(quán)聲明),通過(guò)這個(gè)標(biāo)識(shí),程序的某個(gè)副本就和程序的作者或者客戶聯(lián)系在了一起。假若發(fā)現(xiàn)市場(chǎng)上在買(mǎi)自己軟件的盜版光盤(pán),就可以通過(guò)在盜版軟件中提取的水印追查制作這個(gè)盜版軟件的母版當(dāng)初是誰(shuí)從你這買(mǎi)走的。當(dāng)給合作商提供新開(kāi)發(fā)的游戲的測(cè)試版時(shí),你也可以在測(cè)試版中加上數(shù)字水印。要是你感覺(jué)有人泄露了你的代碼,就能找出肇事者,并把他送上法庭。
以往的經(jīng)驗(yàn)證明,任何類(lèi)似“不公開(kāi),即安全”的做法最終都將以失敗告終,而且不管在程序中怎樣隱藏密鑰,最終它都逃不出一個(gè)足夠頑強(qiáng)的逆向分析人員的手心。當(dāng)然,必須承認(rèn)你的做法也還是對(duì)的。可以說(shuō)絕大部分的技巧都不能保證軟件能永遠(yuǎn)免于黑客的毒手。不必保證某個(gè)東西永遠(yuǎn)處于保密狀態(tài),也不必保證程序永遠(yuǎn)處于不可能被篡改的狀態(tài),更不需要保證代碼永遠(yuǎn)不會(huì)被剽竊。除非這個(gè)研究領(lǐng)域有什么重大的突破,否則能指望的只是延緩對(duì)方的攻擊。我們的目標(biāo)就是把攻擊者的攻擊速度減緩到足夠低,使他感到攻擊你的軟件十分痛苦或要付出過(guò)高的代價(jià),從而放棄攻擊。也可能攻擊者很有耐心地花了很長(zhǎng)時(shí)間攻破了你的防御,但這時(shí)你已經(jīng)重這個(gè)軟件中賺夠了錢(qián),或者已經(jīng)用上了更新版本的代碼,這時(shí)候他得到的東西也就沒(méi)有什么價(jià)值了。
二、攻擊和防御
或者從事計(jì)算機(jī)安全相關(guān)的工作。比如在密碼學(xué)研究中,我們一般都會(huì)假設(shè)“攻擊者是拿不到密鑰的”,“攻擊者在因式分解的計(jì)算機(jī)能力上并不比我強(qiáng)”或者“攻擊者破壞不開(kāi)這種智能卡”,一旦確定了攻擊模型,你就可以由此出發(fā),著手設(shè)計(jì)一個(gè)在此模型下安全的系統(tǒng)。在實(shí)際操作中,攻擊者會(huì)馬上試圖尋找你忽略掉的東西,并以此繞過(guò)你設(shè)計(jì)的防線。攻擊加密系統(tǒng)最好的辦法并不是花上80萬(wàn)去制造專(zhuān)門(mén)的硬件去破解密鑰,而是花40萬(wàn)去賄賂那個(gè)擁有密鑰的人。同樣破解智能卡的最佳方法也不是硬把卡敲開(kāi),而是通過(guò)改變輸入智能卡的電壓,把智能卡放在X光燈下面照射等方法探測(cè)智能卡設(shè)計(jì)上的缺陷,總之就是要從被設(shè)計(jì)者忽略的地方著手。
在隱蔽軟件的研究中,情況也是一樣。研究者也會(huì)根據(jù)自己的研究方向,而不是所有的破解者可能使用的攻擊方法去設(shè)定攻擊模型。有的研究者可能會(huì)給出這樣的一種攻擊模型:“攻擊者會(huì)把整個(gè)軟件看成一個(gè)圖,并試圖從圖中找出一個(gè)與圖的其他部分聯(lián)系最不緊密的子圖,而秘密信息很可能就隱藏在這個(gè)子圖中。因?yàn)槌绦蛑兴拿孛懿⒉皇浅绦蜃陨淼囊徊糠?,而是后?lái)被添加進(jìn)程序的,所以它與程序之間的聯(lián)系一定會(huì)比程序自身內(nèi)部的聯(lián)系弱一些”。這種是有深厚圖論功底的。有些研究者可能會(huì)低估攻擊者的能力:“攻擊者不會(huì)運(yùn)行這個(gè)程序,所以我的程序很安全”,又有些研究者會(huì)高估攻擊者的本領(lǐng):“攻擊者擁有或者會(huì)編寫(xiě)一個(gè)很復(fù)雜的針對(duì)被攻擊程序的測(cè)試輸入集,所以即使程序不是攻擊者編寫(xiě)的,甚至在攻擊者連程序的源碼或者文檔也沒(méi)有的情況下,他仍然能對(duì)程序進(jìn)行批量修改”。
遺憾的是,現(xiàn)在已發(fā)表的很多關(guān)于隱蔽軟件的論文中根本就不曾提及針對(duì)的是何種攻擊模型。
三、程序分析方法
對(duì)程序的攻擊一般分為兩個(gè)步驟:一是分析階段,就是從程序中收集相關(guān)信息,二是轉(zhuǎn)換階段,就是根據(jù)收集到的信息對(duì)程序進(jìn)行修改,而分析程序則有兩種基本的方法:第一種只是分析程序代碼本身,第二種運(yùn)行程序搜集信息。
在過(guò)去的這些年里,人們已經(jīng)開(kāi)發(fā)了很多程序靜態(tài)分析方法。它們大多數(shù)是由軟件工程研究人員為了減少程序中可能出現(xiàn)的漏洞,或者編譯器設(shè)計(jì)者為了優(yōu)化程序而研發(fā)的,但也有一些破解高手為了減少程序中可能出現(xiàn)的漏洞,或者編譯器設(shè)計(jì)者為了優(yōu)化程序而研發(fā)的,但也有一些破界高手為了除去程序中的軟件保護(hù)代碼而自己開(kāi)發(fā)了一些程序靜態(tài)分析方法。靜態(tài)分析搜集到的信息是保守的。說(shuō)它是“保守的”是因?yàn)橹挥心切┐_定的信息才會(huì)被收集到,即使只有略微一點(diǎn)點(diǎn)的疑問(wèn)的信息都不會(huì)被靜態(tài)分析工具收集。
動(dòng)態(tài)分析是通過(guò)運(yùn)行程序,并給程序輸入一定的數(shù)據(jù)的方式來(lái)收集信息的,而動(dòng)態(tài)分析收集到的信息精準(zhǔn)性則取決于輸入數(shù)據(jù)的完備性。只有根據(jù)使用靜態(tài)分析獲得的信息進(jìn)行的代碼轉(zhuǎn)換才是安全的,換言之,根據(jù)動(dòng)態(tài)分析所收集到的信息進(jìn)行的代碼轉(zhuǎn)換時(shí)不安全的,如果輸入的數(shù)據(jù)集不完備,那么所做的修改很可能就把程序給改錯(cuò)了。
攻擊者是根據(jù)自己的意圖選用不同的代碼分析與轉(zhuǎn)換方法的。如果他只想破解某個(gè)軟件,那他只需要一些最基本的靜態(tài)和動(dòng)態(tài)分析工具就夠了,但如果他想搞清楚一個(gè)大型程序中所使用的某個(gè)算法的話,那一個(gè)能把可執(zhí)行文件完全反編譯回源碼狀態(tài)的反編譯器對(duì)他就會(huì)比較有用。
四、代碼混淆
代碼混淆這一技術(shù)的特別之處在于,它是一把雙刃劍:它既能被壞蛋們?cè)趷阂獯a上使用,讓病毒木馬難以別發(fā)現(xiàn),又能被好人們用來(lái)防止自己的軟件被破解,但同樣在盜版,反盜版的斗爭(zhēng)中,壞蛋們又會(huì)用它來(lái)抹除好人們嵌在軟件中的水印。
多數(shù)情況下,混淆程序就意味著把程序轉(zhuǎn)換成一種更為難讀的、更難修改的形式。從這個(gè)角度上說(shuō),我們發(fā)布軟件的二進(jìn)制可執(zhí)行文件而不是程序的源碼就是一種代碼混淆,因?yàn)槎M(jìn)制機(jī)器碼要比高級(jí)語(yǔ)言源碼難讀的多,同樣,使用編譯器優(yōu)化一個(gè)程序也可以被認(rèn)為是對(duì)這個(gè)程序進(jìn)行混淆。因?yàn)椴徽撌鞘止し治鲞€是使用工具,優(yōu)化后的代碼總是比沒(méi)有優(yōu)化的代碼難處理的多。因?yàn)榇a優(yōu)化工具對(duì)代碼進(jìn)行轉(zhuǎn)換只是為了生成運(yùn)行速度更快、個(gè)頭更小的代碼,而我們混淆代碼的目的就是為了使代碼變得更難分析,當(dāng)然代碼混淆也有些副作用,比如它會(huì)生成體積比較大,或者運(yùn)行速度更慢的程序,所以軟件開(kāi)發(fā)人員在使用代碼混淆技術(shù)時(shí)要權(quán)衡一下利弊,決定一下程序的哪些部分需要保護(hù),哪些部分只好放棄保護(hù)。
事情沒(méi)有絕對(duì),軟件也沒(méi)有絕對(duì)安全,所以你必須要權(quán)衡一下利弊,決定是不是要在的的項(xiàng)目中使用軟件保護(hù)技術(shù)。(作者單位:齊齊哈爾工程學(xué)院)
參考文獻(xiàn):
[1]Hofstadter and Douglas R.Basic Books,Godel,Escher,Bacb:An Eternal Golden Braid,January 1999.ISBN 0465026567
[2]D.Abramson and R.Sosic Relative debugging using multiple program versions.In8tb Int.Symp.on Languages for Intensional,Programming,Sydney,May 1995.
[3]Alfred V.Aho,Ravi Sethi,and Jeffery D.Ullman.Compinciples:Principles,Tecbniques,and Tools.Addison-Wesley,1998.