我是如何編寫能夠躲避殺毒軟件的惡意軟件的
殺毒軟件(AV)是一個(gè)較大規(guī)模安全防護(hù)策略的重要組成部分,能夠減緩惡意軟件在互聯(lián)網(wǎng)上的傳播速度。這就像一個(gè)農(nóng)場(chǎng)主保護(hù)自己的牲畜一樣。一個(gè)聰明的農(nóng)場(chǎng)主會(huì)在生物威脅出現(xiàn)之前給很多牲畜接種這方面的疫苗。即便是有一只牲畜被感染,它與其他未接種疫苗的牲畜的接觸會(huì)被降低。由此一來,該生物威脅就會(huì)在造成極小損失的情況下自行消除。一個(gè)沒那么謹(jǐn)慎的農(nóng)場(chǎng)主可能只會(huì)給一小部分的牲畜接種疫苗。由此一來,一旦有一只牲畜被感染,感染就會(huì)在牲畜之間快速蔓延,進(jìn)而造成災(zāi)難性的損失。
殺毒軟件就像接種一樣,而連通互聯(lián)網(wǎng)的計(jì)算機(jī)和設(shè)備就是牲畜。當(dāng)惡意軟件等新威脅出現(xiàn)后,一個(gè)疫苗或簽名就會(huì)被創(chuàng)建來識(shí)別這種威脅并注射到所有客戶端中,進(jìn)而大幅降低一個(gè)未接種疫苗的客戶端與感染接觸的可能性。
不過這一系統(tǒng)意味著在“解藥”研制出之前還是造成了損害,從而使得殺毒軟件在抵御威脅方面顯得必要但不足夠。要想針對(duì)某個(gè)威脅對(duì)一個(gè)目標(biāo)進(jìn)行接種,就必須知道這個(gè)威脅。因此,在研發(fā)出疫苗對(duì)客戶端進(jìn)行保護(hù)之前至少會(huì)有一小部分的客戶端被感染。這是一個(gè)很多殺毒軟件供應(yīng)商都不會(huì)突出強(qiáng)調(diào)的事實(shí)。此外,盡管這是一個(gè)常識(shí),客戶通常也不會(huì)認(rèn)識(shí)到這一常識(shí),既因?yàn)闅⒍拒浖陂L(zhǎng)達(dá)幾十年的時(shí)間里已經(jīng)成為了一個(gè)行業(yè)標(biāo)準(zhǔn),又因?yàn)闅⒍拒浖谠缧┠瓯徽J(rèn)可為解決這一問題的良方妙招。
近期,我對(duì)殺毒軟件以及惡意軟件檢測(cè)策略進(jìn)行了講解演示以幫助突出強(qiáng)調(diào)這一擔(dān)憂 ,并承認(rèn)每天都會(huì)有未識(shí)別的新威脅進(jìn)入網(wǎng)絡(luò),進(jìn)而無可避免地造成一些損害。為了對(duì)此進(jìn)行演示,我特意編寫了一個(gè)惡意軟件,旨在作為一個(gè)命令與控制(C&C)僵尸程序(bot)進(jìn)行運(yùn)行。它將接收來自攻擊者的指令并在受感染的機(jī)器上以最高的優(yōu)先級(jí)對(duì)這些指令進(jìn)行執(zhí)行。
很多的現(xiàn)代攻擊都需要大量的獨(dú)立機(jī)器。比如,一次分布式拒絕服務(wù)(DDoS)攻擊需要互聯(lián)網(wǎng)上成千上萬臺(tái)機(jī)器在同一時(shí)間訪問同一網(wǎng)站,從而讓服務(wù)器過載死機(jī)。一個(gè)命令與控制僵尸程序能夠完美地幫助完成這種類型的攻擊。攻擊者可能不知道僵尸程序最終的用途是什么,不過如果僵尸程序被設(shè)計(jì)得足夠靈活和通用,它們就很容易被擴(kuò)展,從而在無需發(fā)起一個(gè)新的惡意軟件傳播活動(dòng)的前提下發(fā)起新的攻擊。事實(shí)上,攻擊者可以擁有和控制互聯(lián)網(wǎng)上數(shù)萬臺(tái)獨(dú)立計(jì)算機(jī)并利用這些計(jì)算機(jī)來實(shí)施他們想要實(shí)施的任何行動(dòng)。在安全領(lǐng)域之外的其他領(lǐng)域有很多正派的研究人員會(huì)樂意付出任何代價(jià)以擁有如此強(qiáng)大的資源場(chǎng),特別是在不需要為此付錢的情況下。
有了這個(gè)特意編寫的惡意軟件,我便開始了解現(xiàn)代的殺毒軟件客戶端在面對(duì)未知威脅時(shí)的有效程度。此時(shí),還沒有殺毒軟件供應(yīng)商有機(jī)會(huì)見到惡意軟件代碼,因此也就沒有機(jī)會(huì)為其編寫簽名。這就讓眾多的殺毒軟件供應(yīng)商有些為難。要想提供任何形式的保護(hù),就必須采用不依賴對(duì)某個(gè)特定威脅編寫簽名的創(chuàng)新檢測(cè)策略。#p#
這時(shí)候一種名為“代碼模擬”的技術(shù)就派上用場(chǎng)了,而這一技術(shù)也被眾多的殺毒軟件解決方案所采用以幫助彌補(bǔ)簽名的不足。代碼模擬是一些較為高端的殺毒軟件客戶端所采用的用來識(shí)別惡意應(yīng)用程序的創(chuàng)新策略之一,即便是這些惡意應(yīng)用程序此前從未被發(fā)現(xiàn)過。并不是所有的殺毒軟件客戶端都使用這一技術(shù)。一些殺毒軟件客戶端會(huì)使用一些替代技術(shù),有些殺毒軟件客戶端在使用替代技術(shù)的同時(shí)也會(huì)使用代碼模擬。我選擇了一些擁有最大市場(chǎng)份額的流行殺毒軟件客戶端對(duì)我特意編寫的病毒進(jìn)行了測(cè)試。在理想狀態(tài)下,所有這些客戶端都應(yīng)該使用了此類策略。不過從實(shí)際情況來看,我發(fā)現(xiàn)我測(cè)試的八家殺毒軟件供應(yīng)商中只有一家殺毒軟件供應(yīng)商能夠檢測(cè)到我特意編寫的這個(gè)惡意軟件。
事實(shí)上,這并不是一個(gè)特別糟糕的結(jié)果。測(cè)試結(jié)果表明,至少有一家殺毒軟件供應(yīng)商能夠檢測(cè)出一個(gè)所有殺毒軟件供應(yīng)商都未曾見過的惡意軟件,這至少意味著該惡意軟件相對(duì)來說能夠很快地被檢測(cè)到。一旦惡意軟件被至少一家殺毒軟件供應(yīng)商在至少一臺(tái)客戶端機(jī)器上檢測(cè)到,該惡意軟件通常會(huì)被分享給所有其他的殺毒軟件供應(yīng)商以便大家能夠發(fā)布簽名對(duì)此進(jìn)行防護(hù)。不過在惡意軟件碰到來自那家殺毒軟件供應(yīng)商的那個(gè)殺毒軟件客戶端之前,在那家殺毒軟件供應(yīng)商跟其他人分享之前,一些附帶損害又會(huì)再一次出現(xiàn)。
在惡意軟件攻擊者看來,即便是被一家殺毒軟件供應(yīng)商檢測(cè)到,這也意味著他們的惡意軟件將不會(huì)持續(xù)太久,而惡意軟件持續(xù)的時(shí)間越長(zhǎng),他們所獲得的價(jià)值也就越多。因此我繼續(xù)對(duì)惡意軟件作者讓其惡意軟件無法被所有已知的殺毒軟件客戶端所檢測(cè)的過程進(jìn)行了演示。由于這個(gè)特定的病毒只是被一家殺毒軟件供應(yīng)商所檢測(cè)到,要做出的努力也不會(huì)太多。
代碼模擬的工作原理是在殺毒軟件應(yīng)用程序里創(chuàng)建一個(gè)微型虛擬機(jī),在這個(gè)微型虛擬機(jī)里,可疑的惡意軟件可以安全地被執(zhí)行。模擬器會(huì)記錄這個(gè)可疑的惡意軟件所實(shí)施的一切操作,并使用啟發(fā)式行為模式來確定這些行動(dòng)是否代表惡意代碼。比如,如果在微型虛擬機(jī)里執(zhí)行一個(gè)文件時(shí),模擬機(jī)注意到它被設(shè)計(jì)為添加一個(gè)指向回收站里的一個(gè)可執(zhí)行文件的‘自啟動(dòng)’注冊(cè)表項(xiàng),它便可以較為準(zhǔn)確地認(rèn)為可疑的文件實(shí)際上就是一個(gè)惡意軟件。這是因?yàn)閻阂廛浖?jīng)常會(huì)添加自啟動(dòng)表項(xiàng)。一個(gè)正規(guī)的自啟動(dòng)表項(xiàng)絕不會(huì)指向回收站里的任何東西,因?yàn)檫@些文件并不能夠保證長(zhǎng)期存在。另一方面,如果在執(zhí)行可疑的惡意軟件之后,所觀察到的行動(dòng)只是一些擁有很多動(dòng)畫的對(duì)話,殺毒軟件可能會(huì)認(rèn)為這是一個(gè)游戲,不太可能是惡意的。
檢測(cè)到我特意編寫的病毒的這家殺毒軟件供應(yīng)商確實(shí)采用了代碼模擬。當(dāng)它觀察到我特意編寫的病毒被放到系統(tǒng)上之后,它自動(dòng)在其代碼模擬環(huán)境中對(duì)其進(jìn)行了執(zhí)行并對(duì)其將要采取的行動(dòng)進(jìn)行了分析。由于這是一個(gè)病毒,它自然而然地需要編寫注冊(cè)表項(xiàng)、下載文件、隱藏文件等等,而殺毒軟件則正確地將此行為認(rèn)定為惡意行為。
不過,惡意軟件作者是很聰明的,他們一直在適應(yīng)新的檢測(cè)策略。在遵循惡意軟件創(chuàng)造過程的前提下,我接著開始琢磨如何讓代碼模擬器認(rèn)為文件不是惡意的。
這一過程涉及了對(duì)殺毒軟件客戶端進(jìn)行的一些瑣碎的逆向工程。我不是說要對(duì)二進(jìn)制進(jìn)行拆解,也不是說要對(duì)內(nèi)存進(jìn)行查看,而是一個(gè)簡(jiǎn)單的真假實(shí)驗(yàn)和誤差檢測(cè)方法。該方法涉及在惡意軟件中額外添加一些代碼,以試圖檢測(cè)該惡意軟件是否被模擬,并且如果是的話,讓該惡意軟件在做出任何可疑舉動(dòng)之前放棄行動(dòng)。如果對(duì)模擬器的檢測(cè)能夠正常工作的話,殺毒軟件客戶端就不會(huì)將文件報(bào)告為惡意文件。如果檢測(cè)失敗的話,殺毒軟件客戶端就會(huì)將文件報(bào)告為惡意文件。
整個(gè)過程花了大概一個(gè)小時(shí)左右的時(shí)間,直到第一個(gè)成功的躲避策略被識(shí)別出來。在此過程中我了解到,這家殺毒軟件供應(yīng)商的代碼模擬器在認(rèn)定程序可以安全運(yùn)行之前只愿意模擬有限數(shù)量的指令和時(shí)間。為了利用這一限制,我對(duì)測(cè)試惡意軟件的代碼進(jìn)行了修改,從而讓其在運(yùn)行惡意代碼之前運(yùn)行一個(gè)由八萬個(gè)指令組成的循環(huán)。由此一來,這個(gè)殺毒軟件客戶端就會(huì)耗費(fèi)整個(gè)的時(shí)間限度嘗試通過病毒頂端的一個(gè)忙碌循環(huán),因而沒有足夠的時(shí)間到達(dá)真正具有惡意行為的代碼行數(shù)。結(jié)果就是惡意軟件沒有被檢測(cè)出來。
我只利用了一種檢測(cè)方式來檢測(cè)我特意編寫的惡意軟件是否是在一個(gè)模擬器中運(yùn)行,不過我還知道至少六種繞過防護(hù)的獨(dú)立方法。這七種技術(shù)使得惡意軟件能夠躲避殺毒軟件供應(yīng)商的檢測(cè)。我不是說這些技術(shù)代表了突破研究或零日漏洞。事實(shí)上,這些技術(shù)以及成百上千的技術(shù)在近五年來惡意軟件作者所使用的論壇中都有很好的記錄。#p#
我之所以進(jìn)行這次研究,之所以要向大家展示這次研究,就是希望大家能夠關(guān)注可能出現(xiàn)的最初附帶損害。我發(fā)現(xiàn),要想讓任何已有或新出現(xiàn)的惡意軟件變成當(dāng)今市面上所有殺毒軟件客戶端都無法檢測(cè)出的惡意軟件是非常簡(jiǎn)單的事情。我希望這能夠增強(qiáng)人們的意識(shí),那就是殺毒軟件不是萬能的。盡管殺毒軟件在防止惡意軟件長(zhǎng)期傳播方面有著巨大價(jià)值,但它卻無法保護(hù)網(wǎng)絡(luò)免受即便是稍微聰明一點(diǎn)的惡意軟件作者的攻擊。
那么,當(dāng)網(wǎng)絡(luò)管理員發(fā)現(xiàn)他們多年以來依賴的工具并不能真正防止攻擊者對(duì)他們的公司造成重大損害時(shí),他們應(yīng)當(dāng)做些什么呢?首先,繼續(xù)使用客戶端殺毒軟件。盡管殺毒軟件不能檢測(cè)到一個(gè)全新的病毒或一個(gè)精心設(shè)計(jì)的病毒變體,但殺毒軟件是病毒出現(xiàn)幾天后防止病毒大規(guī)模擴(kuò)散的唯一一道防線。要考慮到損害控制,而不是損害預(yù)防。
實(shí)際上,對(duì)新出現(xiàn)威脅的最佳防御要在與將更多的高級(jí)解決方案疊加在一起。新出現(xiàn)的惡意軟件檢測(cè)方面的新創(chuàng)新能夠在不使用簽名的情況下對(duì)惡意軟件進(jìn)行檢測(cè)。這意味著它們不需要事先知道威脅。與代碼模擬最為相似但又比代碼模擬更加強(qiáng)大、更難以躲避的是沙箱這一理念。沙箱解決方案的設(shè)計(jì)旨在一個(gè)逼真的客戶端環(huán)境中對(duì)可疑文件進(jìn)行執(zhí)行。由此一來,惡意軟件將無法將測(cè)試環(huán)境和真實(shí)用戶目標(biāo)區(qū)分開來。這使得沙箱能夠更加準(zhǔn)確地對(duì)可疑文件進(jìn)行分析,從而觀察它將在終端用戶的系統(tǒng)上做些什么。此外,文件和URL信譽(yù)跟蹤以及機(jī)器學(xué)習(xí)策略等解決方案將增添更多的效率。
此外,利用包含快速實(shí)時(shí)情報(bào)共享的產(chǎn)品也很重要,這樣能夠盡可能地縮短惡意軟件發(fā)布和簽名保護(hù)之間的時(shí)間。云安全服務(wù)是關(guān)鍵。如果惡意軟件作者不得不在殺毒軟件供應(yīng)商自己寄存的黑盒檢測(cè)解決方案中對(duì)他們的惡意軟件進(jìn)行測(cè)試,那么他們?cè)谧R(shí)別成功的躲避策略方面要變得困難的多。
通過將客戶端殺毒軟件、網(wǎng)絡(luò)殺毒軟件、沙箱、代碼模擬以及聲譽(yù)服務(wù)組合在一起,管理員能夠構(gòu)建一個(gè)更加強(qiáng)勁的防護(hù)策略。擁有一個(gè)強(qiáng)勁的反惡意軟件解決方案可能真的能夠阻止未來的定向惡意軟件攻擊。盡管如此,管理員還是要留心網(wǎng)絡(luò)中的惡意軟件檢測(cè)率,以便對(duì)定向攻擊進(jìn)行早期識(shí)別和嚴(yán)密監(jiān)控。如果一個(gè)攻擊者真的是攻擊某家公司,要想防止攻擊者成功實(shí)施攻擊,就不得不進(jìn)行大量人工干預(yù),而關(guān)鍵就在于要知道什么時(shí)候需要進(jìn)行人工干預(yù)。
一切都還來得及,不過這場(chǎng)戰(zhàn)爭(zhēng)會(huì)一直打下去。如果我們希望在未來不被打敗,那么我們就必須保持勤奮,根據(jù)威脅對(duì)我們的保護(hù)策略進(jìn)行改進(jìn)。而那些跟不上戰(zhàn)爭(zhēng)節(jié)奏的人們將一次又一次地遭受重創(chuàng)。