漫談無文件惡意軟件的發(fā)展歷史
一、前言
究竟什么是“無文件惡意軟件(fileless malware)”?談到這個名詞時,許多安全行業(yè)的專業(yè)人員都心有余悸,許多文章和產(chǎn)品手冊在介紹無文件惡意軟件時,總會順帶提到我們難以防御和分析這類威脅。我在這篇文章中會試著拋開這些陳詞濫調(diào),追溯無文件惡意軟件的最初起源,并以此類惡意軟件的幾個樣本為例,勾勒出這個名詞的演變輪廓。
二、這是一個熱門話題
人們在工業(yè)事件、私人會議以及在線討論中經(jīng)常會提到無文件惡意軟件這個話題。原因可能在于這類威脅放大了傳統(tǒng)端點安全技術(shù)的缺點,又給了新型安全技術(shù)展現(xiàn)實力的機會。
事實的確如此,Google趨勢給出的資料表明,人們在2012年到2014年之間對這個名詞鮮有問津,自2015年后人們對它的興趣逐步提升,并在2017年到達了一個峰值。
這種趨勢與近年來公眾對具備“無文件”能力的惡意軟件的討論不無關(guān)系,特別是在2017年,有大量關(guān)于這個話題的研究成果和出版物噴涌而出。
三、什么是無文件惡意軟件
首先我們得明確一點,那就是“無文件惡意軟件有時候還是會使用文件”?,F(xiàn)如今,大多數(shù)人們在使用無文件惡意軟件這個名詞時,似乎約定俗成地使用了以下這個定義:
“無文件惡意軟件是一種不需要在文件系統(tǒng)中存放惡意可執(zhí)行文件的軟件”。
這個定義對于利用惡意腳本或者文件系統(tǒng)中良性可執(zhí)行文件進行傳播的惡意軟件來說是適用的。對于隱藏在注冊表中惡意軟件來說,這個定義也是正確的,雖然這種情況下注冊表本身還是存儲在Windows文件系統(tǒng)中。這個定義不需要考慮惡意文件的傳播途徑,不論是通過漏洞利用、社會工程學(xué)技巧還是濫用某些正常功能來進行傳播,這個定義都是適用的。
雖然無文件惡意軟件最初指的是那些不使用本地持久化技術(shù)、完全駐留在內(nèi)存中的惡意代碼,但這個術(shù)語的范圍在逐漸擴大,現(xiàn)在也將那些依賴文件系統(tǒng)的某些功能以實現(xiàn)惡意代碼激活和駐留的惡意軟件包括在內(nèi)。讓我們一起回顧一下對這個術(shù)語的演變過程造成影響的那些惡意程序。
四、2001-2003: Code Red以及SQL Slammer
完全駐留在內(nèi)存中的惡意代碼肯定在21世紀前就已經(jīng)存在。然而,直到2001年,Code Red蠕蟲在互聯(lián)網(wǎng)上肆意傳播,才將“無文件惡意軟件”這個名詞帶給普羅大眾。我所能找到的最早與此有關(guān)的公開資料發(fā)布于2001年的夏天,當時卡巴斯基實驗室發(fā)表了一份公告,其中提到:
“我們預(yù)測,在不久的將來,像Code Red之類的‘無文件’蠕蟲將泛濫成災(zāi),無法處理這類威脅的反病毒軟件只能給大眾帶來安全風(fēng)險”。
Code Red蠕蟲使用了微軟IIS web服務(wù)器中的一個漏洞進行傳播,能夠完全駐留在受害主機的內(nèi)存中,詳細的分析可以參考CAIDA的這篇文章。
一年半以后,另一個蠕蟲(SQL Slammer)就像燎原野火一般傳播。SQL Slammer利用的是微軟SQL服務(wù)器中的一個漏洞。Robert Vamosi在2003年為ZDNet撰寫的一篇文章中,將這個蠕蟲歸類為“無文件”類別惡意軟件,指出它“與Code Red類似,僅駐留在內(nèi)存中”。
我也在Peter Szor(彼時正在賽門鐵克工作的一名資深前輩)于2003年提交的一份專利申請中找到了一些資料。專利名為“簽名提取系統(tǒng)及方法”,其中給出了無文件惡意軟件的定義,如下所示:
“無文件惡意軟件指的是不依賴文件、僅存在于內(nèi)存中的惡意代碼……更具體地說,無文件惡意代碼……可以將自身附加到活動進程的內(nèi)存空間中……”。
無文件惡意軟件的原始定義與這個名詞字面上的意思非常接近,指的是能夠在沒有殘留文件的前提下保持活躍的那些惡意軟件。
五、2012:安裝Lurk木馬的僵尸程序
我能找到與無文件惡意軟件有關(guān)的另一份資料,是在Code Red和SQL Slammer蠕蟲誕生的近十年之后。2012年,卡巴斯基實驗室的Sergey Golovanov發(fā)表了一份分析報告,介紹了某個沒有文件落盤行為的僵尸程序(bot),其中提到:
“我們面對的是一個非常罕見的惡意軟件,這種無文件程序不存在于硬盤文件中,僅在受感染計算機的內(nèi)存中活動”。
這個僵尸程序利用了Java客戶端的某個漏洞,僅在受感染的javaw.exe進程的內(nèi)存空間中活動。Sergey提到這個僵尸程序具備安裝Lurk銀行木馬的功能。
在2012年的早些時候,SecurityXploded的Amit Malik發(fā)表了一篇技術(shù)短文,介紹了從互聯(lián)網(wǎng)下載Windows程序后,如何在不保存到本地硬盤的前提下,實現(xiàn)Windows程序的“內(nèi)存化或無文件執(zhí)行”。
六、2014:Powerliks、Angler以及Phase僵尸程序
前面提到的程序完全駐留在內(nèi)存中,不會在文件系統(tǒng)中留下任何明顯的蛛絲馬跡。因為這種特性,它們在系統(tǒng)重啟后就消失得無影無蹤。相比之下,2014年出現(xiàn)的Poweliks惡意軟件是一種“無需文件的可持久化惡意軟件”(G Data的原話)。這個惡意軟件利用了微軟Word的某個漏洞來進入系統(tǒng),使用帶有shellcode的PowerShell以及JavaScript腳本實現(xiàn)內(nèi)存中的執(zhí)行功能。賽門鐵克的Kevin Gossett對它的本地持久化技術(shù)進行了分析,其中提到:
“通常情況下,惡意軟件會在注冊表的Run鍵值中添加一個子項,指向某個惡意可執(zhí)行文件以完成本地持久化。Poweliks將Run鍵值的子鍵指向rundll32.exe,利用這個合法的微軟程序加載DLL文件,并向其傳遞幾個參數(shù)。傳遞的參數(shù)中包括JavaScript代碼,最終實現(xiàn)將Poweliks加載到內(nèi)存中并執(zhí)行的目的”。
一個月之后,安全研究員Kafeine發(fā)表一篇關(guān)于Angler漏洞利用工具的分析文章。惡意軟件的攻擊目標是存在漏洞的Java客戶端,僅在受感染的javaw.exe進程的內(nèi)存空間中活動。2016年,Palo Alto的安全研究員Brad Duncan在一篇分析報告中提到,Angler開始出現(xiàn)安裝Bedep下載器的行為,且在安裝時不涉及到任何文件創(chuàng)建,因為Angler將下載器直接加載到內(nèi)存中運行。
2014年年末,安全研究員MalwareTech發(fā)表了一篇分析報告,研究了一款名為“Phase僵尸程序”的無文件rootkit。根據(jù)該報告內(nèi)容,這款惡意軟件可以“在不釋放任何文件到本地磁盤、不創(chuàng)建自身進程的前提下安裝到系統(tǒng)中。……Phase將可重新定位的惡意代碼加密保存在注冊表中,通過PowerShell讀取并在內(nèi)存中執(zhí)行這段與具體位置無關(guān)的代碼”。與Powerliks類似,這個惡意軟件通過注冊表的autorun鍵值,調(diào)用rundll32.exe執(zhí)行JavaScript實現(xiàn)本地持久化。
七、2014-2015:Duqu 2.0以及Kovter
在2015年年中,卡巴斯基實驗室發(fā)表了一份報告,詳細介紹了某個高級組織在2014-2015年期間使用一款名為Duqu 2.0的復(fù)雜惡意軟件平臺開展攻擊活動。他們在攻擊活動使用了某個Windows漏洞來安裝惡意軟件,惡意軟件完全隱藏在受感染主機的內(nèi)存中。惡意軟件沒有實現(xiàn)本地持久化機制,相反,攻擊者的目標是長時間上線的服務(wù)器,他們只需要在服務(wù)器重啟后重新感染系統(tǒng)即可。
名為Kovter的另一個無文件惡意軟件也在2015年引起了人們的關(guān)注。Kovter的感染方式與Powerliks十分相似。它最初由某個惡意可執(zhí)行文件加載運行,將經(jīng)過混淆或加密處理的程序保存在注冊表后,惡意軟件就將原始的加載程序從磁盤中刪除。至少有一個Kovter變種通過創(chuàng)建快捷方式執(zhí)行JavaScript以實現(xiàn)本地持久化。正如Airbus的Andrew Dove所述,這個JavaScript腳本會啟動一個能夠執(zhí)行shellcode的PowerShell腳本,所執(zhí)行的shellcode會將惡意代碼注入到一個非惡意的應(yīng)用程序中,并執(zhí)行這個應(yīng)用程序。
八、2016:PowerSniff、PowerWare以及August
在2016年年中,Palo Alto Networks的Josh Grunzweig和Brandon Levene在一篇文章中介紹了PowerSniff這個惡意軟件。惡意軟件的感染路徑從包含惡意宏的微軟Word文檔開始。PowerSniff的內(nèi)存駐留技巧在某些方面與Kovter類似,使用了PowerShell腳本來執(zhí)行shellcode,僅在內(nèi)存中執(zhí)行的shellcode可以解碼并執(zhí)行附加的惡意載荷。PowerSniff具備將惡意DLL臨時保存到文件系統(tǒng)中的能力。
幾周之后,Carbon Black的Mike Sconzo和Rico Valdez在一篇文章中介紹了PowerWare這個惡意軟件。與PowerSniff類似,PowerWare依然使用包含惡意宏的微軟Office文檔開始攻擊活動,文檔中的惡意宏最終會啟動一個PowerShell腳本,不需要在文件系統(tǒng)中存放惡意可執(zhí)行文件即可完成攻擊流程。
在當年晚些時候,Proofpoint在另一篇文章中介紹了August這個惡意軟件,該樣本同樣使用微軟Word宏以及PowerShell來完成攻擊過程。根據(jù)這篇文章,August會“從遠程站點下載部分載荷,作為PowerShell的字節(jié)數(shù)組”,載荷的執(zhí)行完全在內(nèi)存中完成,不需要保存到文件系統(tǒng)中。
九、2017:POSHSPY等
在2017年初,卡巴斯基實驗室在一篇文章中介紹了某款惡意工具,其惡意代碼以Meterpreter為基礎(chǔ),完全在內(nèi)存中活動。在文件系統(tǒng)方面,攻擊者僅使用了合法的Windows實用工具,如sc(用來安裝運行PowerShell的惡意服務(wù))以及netsh(使用隧道方式來承載惡意網(wǎng)絡(luò)流量)。
幾個月之后,Mandiant的Matthew Dunwoody在一篇分析復(fù)雜攻擊活動的文章中也提到了無文件惡意代碼。名為POSHSPY的惡意軟件使用了系統(tǒng)提供的WMI(Windows Management Instrumentation)功能來實現(xiàn)本地持久化機制,同時使用PowerShell來執(zhí)行攻擊載荷。POSHSPY能夠下載可執(zhí)行文件,并將該文件保存到文件系統(tǒng)中。Matthew總結(jié)到:
“攻擊者通過這種‘離地(living off the land)’攻擊技術(shù),實現(xiàn)了一個非常獨立的后門,可以與之前更為傳統(tǒng)和更為復(fù)雜的后門族群一起部署,以便在傳統(tǒng)后門失效后還保留目標的控制權(quán)”。
這次攻擊事件突出反映了入侵者的強大實力,即使他們只能夠依賴系統(tǒng)內(nèi)置的正常程序,他們也能在被感染系統(tǒng)上執(zhí)行惡意載荷。
十、“無文件惡意軟件”的其他說法
2012年,Sergey Golovanov在一篇文章中,最開始使用的是“無文件惡意軟件”這個名詞。非常有趣的是,現(xiàn)在這篇文章中,使用的是“無實體惡意軟件”(bodiless malware)這個名詞??ò退够鶎嶒炇以?016年之前使用的都是“無實體惡意軟件”,但在2017年之后,他們在文章中又回到了“無文件惡意軟件”這個說法。
此外,還有其他說法沒有流行起來。2013年,“高級易變性威脅”(Advanced Volatile Thread,AVT)這個說法短暫浮出水面。根據(jù)維基百科的解釋,該名詞由Triumfant公司的John Prisco提出。“AVT”存在的時間并不長,2013年,Byron Acohido在《今日美國》的一篇文章中,使用這個名詞來指代存在后門的某個Apache軟件。根據(jù)Piere-Marc Bureau(彼時是ESET的一員)的說法,這個后門“除了對web服務(wù)器文件進行修改之外,沒有在硬盤上留下其他任何痕跡”。
相比之下,Carbon Black在2016年的一份威脅報告中,使用了與無文件惡意軟件更為貼切的另一種說法。這篇報告中使用的是“無惡意軟件攻擊”這個名詞。幾個月之后,Michael Viscuso在公司的一篇博文中,對這個名詞做出了解釋,原話如下:
“無惡意軟件攻擊,指的是攻擊者使用現(xiàn)有軟件、被許可的應(yīng)用程序以及已授權(quán)的協(xié)議來開展惡意活動。無惡意軟件攻擊無需下載任何惡意文件,即可獲取計算機的控制權(quán)。無惡意軟件攻擊這個概念也可以代表無文件、內(nèi)存化或‘離地’攻擊”。
Gartner在2017年的一份報告中,與Carbon Black一樣,使用了“無惡意軟件攻擊”這個名詞。不過,一個月后,Gartner在的另一篇文章中,改用了“無文件攻擊”這個名詞。
十一、為什么寫這篇文章
我認為對于不同的場合,我們可以使用不同的說法。比如,對于僅僅依賴合法的系統(tǒng)管理工具以及其他非惡意軟件的攻擊事件,我更傾向于使用“無惡意軟件攻擊”這個說法,這種場景也就是人們常說的“離地”攻擊場景。另外,如果惡意代碼從來沒有保存到本地硬盤中(比如惡意代碼被注入到其他進程的內(nèi)存空間中),我更傾向于使用“完全內(nèi)存化惡意軟件(memory-only malware)”這個說法。如果惡意軟件不需要在文件系統(tǒng)中保存?zhèn)鹘y(tǒng)意義上的可執(zhí)行文件來實現(xiàn)本地持久化,此時我認為使用“無文件惡意軟件”也是可以的。
不幸的是,現(xiàn)在這些說法已經(jīng)雜糅在一起。盡管“無文件惡意軟件”代表各種含義,我們還是會堅持使用這個說法來描述前面提到的各種場景。只能感慨人類的語言不僅含義不清,而且總是在變,如果大家說的都是“C#”語言,說不定這個世界會變得更加美好 :-)
我之所以會關(guān)心這個術(shù)語,原因在于我在Minerva的工作是負責(zé)介紹某款反惡意軟件產(chǎn)品的功能,我需要避免使用那些陳詞濫調(diào)和毫無意義的短語。這款產(chǎn)品可以與其他端點安全工具配合使用,防御各種惡意軟件,無論它們的攻擊載荷是否需要保存到磁盤中。客戶經(jīng)常向我咨詢我們對無文件惡意軟件的處理方式,因此我決定寫一篇綜合調(diào)研文章,以便更好把握這個名詞使用的方式和時機。