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