則建設(shè)與工程化實踐)
1. 先把“免殺對抗”這件事說到位很多人看到“免殺對抗”四個字第一反應(yīng)是攻擊者怎么改樣本繞過殺毒軟件。我自己的工作視角不太一樣我在安全運營和惡意樣本分析這個圈子里待了挺久每天面對的問題不是“怎么繞過檢測”而是“為什么這種惡意樣本沒被攔住”或者是“已上線的檢測規(guī)則為什么一夜之間失效了”。這些問題的本質(zhì)其實是一場持續(xù)發(fā)生的攻防對抗而作為防守方我們手里能用的牌并不多。這篇筆記里說的“免殺對抗”不是教人怎么對抗殺毒軟件而是站在檢測與防御視角記錄我們?nèi)绾畏治鰫阂鈽颖?、理解攻擊者的對抗思路、從而持續(xù)修正檢測策略。這個方向適合三類人一是剛?cè)腴T安全分析、想搞清楚惡意樣本到底怎么工作的新人二是做安全運營或藍(lán)隊值守的工程師需要把檢測規(guī)則做得更穩(wěn)三是做威脅情報和樣本復(fù)現(xiàn)相關(guān)工作的人希望通過一套相對工程化的流程把樣本分析從“憑感覺”變成“可復(fù)用”。為什么值得寫出來因為大多數(shù)資料會把“對抗”描述得很神秘好像靠一兩個絕招就能解決所有問題。實際干下來完全不是那么回事真正能落地的對抗能力靠的是基礎(chǔ)功、流程規(guī)范、樣本積累和持續(xù)迭代。這篇筆記就是我過去幾年踩坑、復(fù)盤、調(diào)整后的一個階段性總結(jié)很多細(xì)節(jié)是文檔里不會寫清楚的。2. 理解“免殺”背后的對抗邏輯是防守的第一步2.1 安全產(chǎn)品為什么會失手安全產(chǎn)品終端殺軟、EDR、網(wǎng)關(guān)檢測這類檢測惡意樣本核心依賴三類信號靜態(tài)特征、行為模式、外部情報。靜態(tài)特征靠文件哈希、字符串、結(jié)構(gòu)特征行為模式靠樣本在運行過程中產(chǎn)生的操作序列外部情報靠C2域名、IP信譽、樣本關(guān)聯(lián)關(guān)系等。攻擊者想繞過這些檢測就要研究檢測邏輯和弱點。比如靜態(tài)特征被提取了就加殼、做字符串混淆、改變編譯特征行為模式被收錄了就延遲執(zhí)行、分階段執(zhí)行、只在特定條件下觸發(fā)行為外部情報被標(biāo)記了就做短時效域名、頻繁更換基礎(chǔ)設(shè)施。說到底這就像門鎖和撬鎖工具的關(guān)系——鎖匠每加固一次鎖芯撬鎖的人就會研究新的開鎖方式雙方不斷循環(huán)。作為防守方如果連攻擊者繞過的思路都不理解檢測規(guī)則的維護(hù)就會變成“頭痛醫(yī)頭”。我們看到某個樣本變了就急著加一條特征卻不思考這個樣本為什么能活到我們面前、它通過哪一層檢測漏進(jìn)來的、是同源變種還是全新的手法。沒有這個思考過程規(guī)則庫會越來越大誤報越來越多真正有效的檢測覆蓋率卻在下降。2.2 防守方真正要做的三件事理解了對抗邏輯之后我通常會把防守工作拆成三個目標(biāo)。第一把檢測面做寬。單靠靜態(tài)掃描撐不住必須加行為監(jiān)控、內(nèi)存檢測、日志審計等多條檢測路徑。任何單點的失效不能導(dǎo)致全盤失守。第二把誤報率壓低。誤報是安全運營的隱性成本一次嚴(yán)重誤報可能會讓業(yè)務(wù)部門停掉整個檢測系統(tǒng)的權(quán)限。所以規(guī)則寧可偏精確、寧可少收一點也不能大量誤傷正常文件。第三把分析速度提快。每來一個新樣本如果不能快速判斷它是什么、有沒有威脅、和已知事件有沒有關(guān)聯(lián)那整個藍(lán)隊就是在疲于奔命。分析自動化、流程標(biāo)準(zhǔn)化是唯一出路。這三件事做好才算真正意義上“對抗”住了而不是靠堆規(guī)則數(shù)量取勝。3. 樣本分析工程化建立自己的分析流水線3.1 樣本來源與預(yù)處理我們在實際環(huán)境中接觸到的樣本來源非常雜終端上報的可疑文件、郵件網(wǎng)關(guān)攔截的附件、蜜罐捕捉的掃描器投遞物、威脅情報平臺共享的哈希和樣本、甚至內(nèi)網(wǎng)流量中還原出來的文件。不同來源的樣本質(zhì)量完全不一樣有真正的惡意樣本也有大量灰色軟件、PUA程序、破解工具、測試文件純粹是誤報。拿到樣本后的第一件事不是丟進(jìn)虛擬機跑而是按流程走一遍預(yù)處理。先做哈希計算MD5、SHA-1、SHA-256用哈希去威脅情報平臺和內(nèi)部樣本庫查重如果已經(jīng)存在就直接關(guān)聯(lián)然后看樣本的文件類型PE、ELF、腳本、文檔、壓縮包不同類型的分析路徑不一樣再記錄文件大小、編譯時間戳、數(shù)字簽名狀態(tài)等基礎(chǔ)元數(shù)據(jù)。我吃過一個大虧早期分析樣本不重視預(yù)處理拿到文件就運行結(jié)果發(fā)現(xiàn)這個樣本早就被分析過了只是文件名變了白白浪費了半天時間。后來我強制要求所有樣本必須先過一遍預(yù)處理清單才允許進(jìn)入下一步效率提升非常明顯。預(yù)處理的核心目的就一句話——把未知問題盡可能變成已知問題把分析資源留給真正需要深度分析的樣本。3.2 命名規(guī)范與樣本分類管理樣本多了以后破事就來了。文件名千奇百怪有的叫“1.exe”有的叫“新建文本文檔(2).exe”有的直接是一串隨機字符串。如果不做統(tǒng)一命名和分類管理過兩周你自己都找不到當(dāng)初分析的是哪個文件更別提回溯響應(yīng)用例了。我現(xiàn)在用的命名規(guī)范是“威脅類型_家族_操作系統(tǒng)_哈希前綴”。比如一個Windows平臺上的間諜軟件樣本命名可以是“spyware_xxx_family_win_1a2b3c”。這樣看到名字就能大概知道這是個什么東西。同時所有樣本按類別歸檔到獨立目錄靜態(tài)分析產(chǎn)物、動態(tài)行為日志、關(guān)聯(lián)情報分別存放并用一個簡單的索引表維護(hù)每個樣本的分析狀態(tài)和結(jié)論。分類管理還有個好處同類樣本可以批量提取公共特征。同一個家族的樣本往往會復(fù)用一些固定字符串、反調(diào)試手法或文件結(jié)構(gòu)積累到一定數(shù)量后做聚類檢測規(guī)則的產(chǎn)出效率會高非常多。這個環(huán)節(jié)看起來不起眼卻是整個分析工作能不能長期積累的前提。4. 靜態(tài)分析不動手先看清文件“長什么樣”4.1 哈希、殼信息與編譯器指紋靜態(tài)分析的第一步是細(xì)看文件本身。哈希是最基礎(chǔ)的除了用來查重還能在后續(xù)動態(tài)分析時做比對——同一文件運行前后哈希是否變化可以發(fā)現(xiàn)自解密、自解壓這類行為。然后是查殼。檢測殼和編譯器指紋工具很多開源的比如DIE、PEiD、ExeinfoPE都有各自優(yōu)勢。我們內(nèi)部偏向用DIE做第一道掃描它對常見殼、混淆器、編譯器的識別比較穩(wěn)還能輸出文件格式的詳細(xì)信息。這里有個經(jīng)驗查殼工具報“有殼”不代表一定是惡意很多正常的商業(yè)軟件也會加殼保護(hù)反過來無殼文件可能直接用原生匯編寫惡意邏輯反而更難靜態(tài)分析。所以查殼結(jié)果只是參考信息不能直接當(dāng)判定條件。編譯器指紋很有意思會透露很多信息。比如編譯時間戳顯示是最近幾天但使用的編譯器版本卻是十年前的老版本這種矛盾就很可疑再比如某個樣本聲稱是正常業(yè)務(wù)工具內(nèi)部卻包含大量的內(nèi)存操作和系統(tǒng)調(diào)用特征那基本就是有意偽裝了。4.2 字符串、導(dǎo)入表與資源信息要交叉驗證靜態(tài)分析里最容易出多層信息的就是字符串提取。用工具提取可打印字符串后常見做法是篩出URL、IP、注冊表路徑、文件路徑、命令參數(shù)這類關(guān)鍵信息。單獨看這些字符串往往看不出所以然但把它們放在一起交叉驗證就能拼湊出這個樣本的意圖。比如一個樣本里同時出現(xiàn)遠(yuǎn)程地址、下載指令和擴展名相關(guān)字符串那初步推斷它可能有下載外聯(lián)能力如果樣本資源里還嵌著一個大小異常的數(shù)據(jù)塊那很可能是內(nèi)嵌的附加組件。不要只停留在“提取”這一步要追問一句話——這些字符串為什么同時出現(xiàn)在一個文件里它們之間有沒有邏輯關(guān)聯(lián)導(dǎo)入表分析也是同理。看到LoadLibrary和GetProcAddress組合再加上網(wǎng)絡(luò)相關(guān)API基本能判斷樣本具備動態(tài)加載外部模塊的能力如果還出現(xiàn)了一些不常見的進(jìn)程操作API那就要重點觀察運行時的進(jìn)程行為。字符串、導(dǎo)入表、資源信息、節(jié)表特征這幾個維度要互相印證而不是各自孤立看。還有個小技巧很多樣本會把真正的惡意代碼放在加密資源里靜態(tài)看不出來。這時候就要結(jié)合動態(tài)分析去觸發(fā)解密流程觀察內(nèi)存中是否出現(xiàn)新的可執(zhí)行模塊這也是為什么靜態(tài)分析永遠(yuǎn)替代不了動態(tài)分析的原因。5. 動態(tài)行為分析讓樣本自己“說”它要干什么5.1 分析環(huán)境搭建與關(guān)鍵配置動態(tài)分析的目的只有一個讓樣本在受控環(huán)境里跑起來觀察它到底做了什么。前提是環(huán)境必須完全可控、可還原、不泄毒。我的做法是準(zhǔn)備一臺獨立的分析宿主機宿主機上開多個虛擬機每個虛擬機都做了干凈快照。虛擬機內(nèi)部網(wǎng)絡(luò)嚴(yán)格隔離虛擬網(wǎng)卡只連接到單獨的虛擬交換機不接入真實辦公網(wǎng)和互聯(lián)網(wǎng)。有些樣本需要聯(lián)網(wǎng)才能觸發(fā)完整的惡意行為所以我會在宿主機上搭一套DNS重定向和HTTP服務(wù)模擬把樣本可能訪問的域名指到本地記錄它的請求內(nèi)容而不是讓它真正連到外網(wǎng)。還有幾個容易被忽略的細(xì)節(jié)虛擬機要關(guān)掉共享文件夾、關(guān)掉剪貼板共享、禁用宿主機與虛擬機之間的拖拽傳輸防止樣本把惡意代碼帶到宿主機分析機里不要安裝真實身份信息相關(guān)的軟件快照要在樣本運行前打一個運行結(jié)束后恢復(fù)快照確保下次分析永遠(yuǎn)是干凈狀態(tài)。5.2 監(jiān)控工具組合與行為日志解讀動態(tài)分析不是只開一臺沙箱就完事監(jiān)控維度一定要多。我最常用的組合是行為監(jiān)控、進(jìn)程監(jiān)控、注冊表監(jiān)控、文件系統(tǒng)監(jiān)控和網(wǎng)絡(luò)流量記錄這五件套。行為監(jiān)控方面Process Monitor這類工具可以記錄進(jìn)程所有文件操作和注冊表操作進(jìn)程樹分析可以看到樣本有沒有創(chuàng)建子進(jìn)程、往其他進(jìn)程注入模塊流量記錄可以用Wireshark或tcpdump重點看可疑的外聯(lián)行為和DNS請求。把這些工具全部打開再讓樣本運行三到五分鐘導(dǎo)出的日志量會非常大關(guān)鍵是怎么讀。讀行為日志要帶著問題去讀樣本啟動后做了哪些文件釋放有沒有修改自啟動項或服務(wù)配置有沒有試圖關(guān)閉或干擾安全軟件網(wǎng)絡(luò)行為是主動外聯(lián)還是被動等待命令把這些問題按時間線串起來就是樣本的完整行為畫像。我見過太多人只盯著一個監(jiān)控工具的輸出看結(jié)果漏掉了關(guān)鍵動作比如一個樣本明明在注冊表里寫了自啟動項但因為他只看了文件監(jiān)控沒看注冊表監(jiān)控完全沒有發(fā)現(xiàn)。動態(tài)分析還有一個原則樣本運行時間要足夠長。有些樣本帶有反沙箱機制前幾分鐘表現(xiàn)得很正常等分析師放松警惕才會觸發(fā)惡意外聯(lián)或文件加密操作。我一般至少觀察十五分鐘部分疑難樣本會反復(fù)運行多次調(diào)整參數(shù)、改變運行條件盡可能觸發(fā)所有行為狀態(tài)。6. 檢測規(guī)則建設(shè)把分析結(jié)論變成能打的“檢測能力”6.1 從特征提取到Y(jié)ARA規(guī)則的工程化落地分析完一批樣本后最重要的事情是把結(jié)論沉淀成檢測規(guī)則。我這邊用得最多的是YARA規(guī)則靈活、跨平臺、維護(hù)成本低各家的終端安全產(chǎn)品和沙箱基本都能導(dǎo)入。寫YARA規(guī)則不是把樣本里提取的字符串隨便堆上去那樣誤報率會爆炸。我自己的經(jīng)驗是優(yōu)先用樣本里不容易變化的固定字節(jié)序列做特征。比如樣本的某個固定資源段、解密循環(huán)的固定操作碼組合、特定文件頭的畸形字段這些特征比字符串穩(wěn)定得多。字符串能改但一段精心構(gòu)造的代碼結(jié)構(gòu)很難在變種中完全重寫。一個輔助技巧是先用樣本家族里的多個樣本做交集找出它們共同具備的特征再去正常文件庫里驗證這些特征不命中。我跟團隊定的標(biāo)準(zhǔn)是一個規(guī)則至少要覆蓋家族里八成以上的樣本同時在內(nèi)部白文件庫和公開文件集里零誤報才會推到生產(chǎn)環(huán)境。6.2 行為檢測規(guī)則的優(yōu)先級和聯(lián)動思路特征規(guī)則只能攔住已知樣本面對變種和沒見過的家族就會有心無力。所以檢測規(guī)則建設(shè)一定要有行為層兜底行為檢測不看文件長得什么樣而看它做的事是不是“不正?!?。行為檢測規(guī)則的個人經(jīng)驗是高優(yōu)先級關(guān)注三類行為異常的子進(jìn)程創(chuàng)建鏈、敏感系統(tǒng)操作的批量執(zhí)行、可疑的外聯(lián)行為組合。舉個具體例子一個普通辦公軟件沒理由去遍歷域內(nèi)所有主機的共享目錄也沒理由同時調(diào)用大量系統(tǒng)枚舉API如果某個進(jìn)程出現(xiàn)“高權(quán)限自啟動項寫入敏感目錄遍歷外部網(wǎng)絡(luò)連接嘗試”的組合那就值得告警。行為規(guī)則的落地不只是在產(chǎn)品后臺配置還需要日志側(cè)配合。Windows事件日志里的進(jìn)程創(chuàng)建事件4688、Sysmon的進(jìn)程網(wǎng)絡(luò)連接事件、EDR的終端行為流都是行為檢測的數(shù)據(jù)源。把這些日志統(tǒng)一收上來、格式化、建立檢索索引再去做規(guī)則匹配這套管道建設(shè)比單純寫規(guī)則更積累團隊能力。沒有可靠的數(shù)據(jù)管道行為規(guī)則寫得再漂亮也無法真正跑起來。這就是為什么我一直強調(diào)“檢測能力”不等于“規(guī)則文件”數(shù)據(jù)基礎(chǔ)、執(zhí)行引擎、響應(yīng)流程缺一不可。7. 常見問題與排查心得這些坑我替你踩過了7.1 規(guī)則誤報與被繞過的排查思路誤報是檢測規(guī)則運營里最磨人的問題。規(guī)則明明只針對一個惡意樣本寫的結(jié)果上線第二天就有一堆正常文件被報毒一查發(fā)現(xiàn)命中了某個通用API序列。排查誤報的正確姿勢是回溯命中的所有樣本提取交集對著交集去看規(guī)則條件大概率是有特征寫得太寬了。規(guī)則被繞過的情況更隱蔽。一個樣本按照特征提取的規(guī)則能穩(wěn)定命中但某個版本加了個小花招之后特征位置發(fā)生了偏移規(guī)則就失效了。排查這類問題不能只盯規(guī)則本身我會把新樣本重新跑一遍完整的靜態(tài)加動態(tài)分析對比它和舊樣本之間的差異找到新樣本里“穩(wěn)定不變”的部分再加進(jìn)去。繞過的本質(zhì)是樣本變了而我們沒有跟著變。7.2 信息孤島導(dǎo)致檢測盲區(qū)團隊剛起步的時候大家各分析各的樣本結(jié)論都留在個人電腦里規(guī)則也各寫各的。一段時間后問題集中爆發(fā)同一個家族的樣本被拆成好幾個規(guī)則互相不覆蓋還存在大量重復(fù)的告警分析工作。解決辦法是把樣本、分析報告、檢測規(guī)則全部沉淀到公共平臺日常工作中強制更新新樣本先查重再分析新規(guī)則先同步再上線。這些做齊之后檢測覆蓋面才真正連成片這比寫多少條規(guī)則都有用。7.3 自動化分析平臺不是萬能藥市面上有不少自動化沙箱平臺能把樣本丟進(jìn)去自動出行為報告看起來效率很高。但實際使用時自動化報告只能作為初篩參考不能替代分析師的人工判斷。自動沙箱的環(huán)境指紋很容易被樣本識別檢測到虛擬機環(huán)境后樣本會主動隱藏惡意行為而且自動化平臺對帶交互邏輯的樣本也很無力樣本運行到一半等待用戶輸入或者等待特定命令報告出來自然就是“未發(fā)現(xiàn)惡意行為”。我的建議是自動化平臺用來做批量篩選和線索發(fā)現(xiàn)所有高風(fēng)險樣本、無法給出明確結(jié)論的樣本都必須走人工深度分析流程。分析師的判斷力、環(huán)境熟悉度和積累的對抗經(jīng)驗是自動化工具替代不了的。7.4 個人經(jīng)驗總結(jié)與持續(xù)積累最后說一點長期感受。惡意樣本分析這個方向入門門檻其實不高工具到處都有教程也不少但真正拉開差距的是經(jīng)驗積累的厚度。一個老分析師看到可疑文件能掃一眼結(jié)構(gòu)就知道該往哪個方向深挖一個新人在同樣的文件面前可能無從下手這種判斷力只能靠一個個樣本喂出來。我現(xiàn)在每次分析完一個樣本都會順手寫一份短報告記錄分析思路、踩了什么坑、這條樣本暴露了檢測體系的哪個短板。每周抽時間把這一周的樣本分析匯總過一次隔一個月再翻一次。這些記錄累積下來比任何公開資料都更適合自己的團隊作為參考。后續(xù)想在這個方向拓展的團隊完全可以照著這套模式從樣本預(yù)處理、靜態(tài)加動態(tài)分析、檢測規(guī)則建設(shè)到響應(yīng)流程規(guī)范逐步建立自己的對抗筆記體系。對抗這件事不會有終點但分析和積累的每一步都會讓下一輪對抗變得更從容一些。