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