惡意軟件隱藏技術(shù)的幫助下,盡管有最佳實踐,企業(yè)依然是黑客的首選目標。
侵入系統(tǒng)或網(wǎng)絡(luò)的惡意軟件形式多樣,有病毒、蠕蟲、間諜軟件、木馬、廣告軟件、勒索軟件等等。任何可能沖擊企業(yè)隱私和安全的惡意程序都是惡意軟件。最近新聞熱議焦點之一是約翰·波德斯塔,美國民主黨總統(tǒng)候選人希拉里·克林頓的競選主管。此人很倒霉地點進了釣魚網(wǎng)站,讓自己的電腦被種上了惡意軟件,全部私人郵件被黑客讀取。這些電子郵件最終落到了維基解密的手中,出于政治原因,每天放出幾千封。
不幸的是,高端網(wǎng)絡(luò)罪犯一直在改進他們的策略,部署能繞過傳統(tǒng)安全解決方案的惡意軟件,靜悄悄地潛入到企業(yè)網(wǎng)絡(luò)中。有報告顯示,每81秒就有惡意軟件被下載到企業(yè)環(huán)境中。這讓安全人員必須充分注意到用于隱藏惡意軟件的那些技術(shù),以下是七個惡意軟件容易藏身的位置。
1. Windows注冊表
Windows注冊表又大又復(fù)雜,很多地方都可以供惡意軟件藏身用。其中一個很好的例子就是Poweliks。Windows內(nèi)置API——ZwSetValueKey,可在注冊表中創(chuàng)建帶編碼數(shù)據(jù)塊鍵值的注冊表鍵。免文件型惡意軟件Poweliks,就是利用該API將自身代碼編碼隱藏在注冊表中。這是惡意軟件利用Windows注冊表實現(xiàn)隱藏、自啟動和長期駐留的諸多方法當中的一種。
2. 進程注入
如名字所示,進程注入就是將代碼注入到正在運行的進程中。惡意軟件利用進程注入技術(shù)將代碼執(zhí)行隱藏到已知“正常”的進程中,比如svchost.exe或explorer.exe,實現(xiàn)檢測規(guī)避。為將惡意軟件注入到已知正常進程,惡意軟件作者會利用內(nèi)置 Windows API,比如說,設(shè)置調(diào)試權(quán)限的那些。進程若被設(shè)置為調(diào)試模式,就能調(diào)用很多調(diào)試API,實現(xiàn)附著到其他進程并命令進程分配額外內(nèi)存等功能。目標進程分配了更多內(nèi)存后,惡意進程就能往該進程中注入任意代碼。
進程注入實例:
Poison Ivy 是利用進程注入的一大惡意軟件實例,它通過數(shù)據(jù)庫分表給系統(tǒng)帶來傷害。該惡意軟件不占用一整塊內(nèi)存,而是在多個不同進程中分配小小的內(nèi)存塊,讓對 Poison Ivy 的分析更為痛苦,逆向工程也更難更耗時。
3. 進程挖空
另一個與進程注入相關(guān)的技術(shù)叫做進程挖空。挖空指的是已知良好進程以掛起狀態(tài)啟動。當代碼加載完畢準備執(zhí)行時,好代碼被挖空(此處可自行想象用冰淇淋勺大勺掏空冰淇淋桶的舒爽感覺),進程中便出現(xiàn)了供壞人放入自己代碼并修改頭部和尾部的空間。這讓修改充填過的代碼看起來似乎還是好的,然后進程再被重啟動。對普通用戶而言,這就是個由Windows啟動的正常系統(tǒng)進程。因此,逆向工程師和內(nèi)存鑒證人員也就更難以進行分析了。Dridex銀行木馬便屬于常使用進程挖空技術(shù)的惡意軟件家族。
4. 進程列表解鏈
進程列表解鏈是另一種主要概念。進程就是計算機上運行的任意東西,無論是在用戶空間里還是在內(nèi)核空間里。進程列表解鏈涉及到操作“進程列表”,也就是包含了所有“活動”進程的雙向鏈表。一旦進程被從進程列表中抽出(解鏈),該進程便可以對所有查看“活動”進程的工具隱身了。可通過使用ZwSystemDebugControl()函數(shù),或映射DevicePhysicalMemory來實現(xiàn)這一操作。
怎樣將進程從列表中刪除:
設(shè)要從列表中刪除的進程為B,B的后鏈B->BLink指向其上一個進程A,前鏈B->FLink指向其下一個進程C。只需將進程A的前鏈((B->BLink)->FLink)指向C(B->FLink),再將進程C的后鏈((B->FLink)->BLink)指向A(B->BLink),便可順利將進程B從雙向鏈表中摘除,遍歷進程列表時直接從A跳到C。更高級的黑客還會更進一步,在從列表中移除該進程后,再重寫那塊內(nèi)存,這樣即便有內(nèi)存鑒證調(diào)查也無法定位到該進程了。安全研究人員有工具可用于查找隱藏惡意代碼,比如PsAc4veProcessHead遍歷、進程池標簽掃描、線程池標簽掃描等等。
5. 動態(tài)鏈接庫列表解鏈
通過操作動態(tài)鏈接庫(DLL)列表也能隱藏惡意軟件。就像進程列表,DLL列表也是雙向鏈表,每個DLL信息節(jié)點都有指向其上一個節(jié)點和下一個節(jié)點的指針,有API可以調(diào)用來修改DLL列表中的節(jié)點,摘除其中節(jié)點,并抹去內(nèi)存中的信息以輔助逃過內(nèi)存鑒證或備份工具的檢測。這種方法在rootkit活動中很常見。
6. 內(nèi)核模塊列表解鏈
內(nèi)核模塊又更底層了。內(nèi)核模塊包含加載到內(nèi)核的任意模塊。與DLL和進程列表類似,內(nèi)核模塊也有自己的列表,能通過API查詢,返回每一個被加載到內(nèi)核的模塊信息。同樣,有調(diào)試API可以將內(nèi)核模塊從列表中移除并清零。這一點尤其重要,因為在內(nèi)核級,只要被清零,再找回的難度就大得多了——該權(quán)限就像Ring0級權(quán)限,絕對與rootkit行為有關(guān)。一般來講,惡意軟件會在用戶空間執(zhí)行,然后嘗試內(nèi)核級漏洞利用以得到內(nèi)核管理權(quán)限,隨后釋放出主rootkit,主rootkit再將自身從內(nèi)核模塊列表進程列表中清除。到了這一步,惡意軟件就藏身良好,非常難以被發(fā)現(xiàn)了。