當惡意軟件開發者發現自己在沙盒中運行時,會竭盡全力避免惡意行為。目前有很多沙盒檢測方法,每種方法都有優缺點。
至於惡意軟件開發者如何檢測到沙盒?有很多不同的方法,但總的來說,他們會檢查環境的特徵,看看它是否看起來像一個目標主機,而不是一個自動化系統。
逃避沙盒策略惡意軟件開發者會使用大量技術來檢查它們是否運行在“真正的”目標主機上,比如計算瀏覽器緩存中的cookie數量,或者檢查顯存是否太小。
檢測儀器或“掛鉤”逃避沙盒儀器的檢測,這絕對是最流行的技術之一。最常見的例子是檢查API掛鉤,因為這是沙盒和防病毒供應商檢測和記錄分析中的可執行文件進行的所有API調用的常用方法。這可以像檢查常見函數的函數序言一樣簡單,看看它們是否被掛鉤。
在下圖中,我們看到了Windows 10中CreateFileA的序言的反彙編是什麼樣子的,以及如果在沙盒中插入了指令,它可能是什麼樣子。
系統API中函數上的典型沙盒掛鉤
如上所示,攻擊者很容易察覺到這一點,這就是為什麼這是我們所看到的最常見的方法之一。
這種技術的一個有趣的變化是,惡意軟件檢測並解除現有的掛鉤,以便在不記錄其活動的情況下偷偷執行。當惡意軟件開發者想要通過端點保護而不被目標主機檢測到時,就會發生這種情況。
下圖顯示了GuLoader如何解包ZwProtectVirtualMemory函數序言的字節以恢復原始功能的示例。
GuLoader正在解除逃避系統API函數中的檢測
減少逃避沙盒儀器檢測的方法防止惡意軟件作者檢測檢測儀器的黃金標準就是不要有任何對你正在分析的程序可見的異常內容。越來越多的沙盒將這一想法作為其檢測策略的重點。當你在操作系統中的任何地方都不改變一個字節時,你就更容易避免逃避。
與其通過更改代碼來檢測API,不如使用虛擬化來無形地檢測分析中的程序。從來賓VM外部檢測惡意軟件有很多好處。
客戶機與基於虛擬機監控程序的掛鉤引擎。左:程序分析組件與它執行的惡意軟件樣本一起存在於來賓VM中。右:分析組件完全存在於來賓VM之外,因此對於被分析的程序來說是不可見的
檢測虛擬環境另一個常見的逃避則涉及檢測文件正在虛擬機(VM)中執行。這可能涉及指紋資源,如低CPU核心數、系統或視頻內存或屏幕分辨率。它還可能涉及特定VM的指紋工件。
在構建沙盒時,供應商有大量的虛擬機解決方案可供選擇,如KVM、VirtualBox和Xen。每一個都有各種各樣的工件和特性,它們可以被運行在它們下面的vm中的軟件檢測到。
其中一些特性是特定係統特有的,比如檢查VMware的後門接口,或者檢查提供給操作系統的硬件是否與QEMU提供的虛擬硬件匹配。其他方法可以簡單地檢測一般的管理程序。例如,Mark Lim在一篇文章中討論了管理程序的一般逃避,該文章利用了許多管理程序錯誤地模擬trap標誌行為這一事實。
惡意軟件確定其是否在VMware虛擬機內運行的最早和最廣泛使用的機制之一是使用VMware的後門接口來查看VMware虛擬機管理程序是否有任何有效響應。這種檢查的示例如下圖所示。
惡意軟件檢查它是否在VMware虛擬機內運行
惡意軟件家族還可以使用Windows Management Instrumentation(WMI)查詢來查詢計算機製造商或型號信息。這允許他們獲取有關係統的信息,並將其與已知的沙盒或管理程序字符串進行比較。
下圖顯示瞭如何使用它對VMware、Xen、VirtualBox和QEMU進行查詢。同樣的技術也可以在Al-Khaser中找到,這是一個包含許多反沙盒技術的開源工具。
用於查詢計算機信息的WMI查詢
下圖顯示了惡意軟件可能與之交互的軟件組件,以顯示它是否在虛擬環境中執行。
進程可以與之交互以評估它們是否在VM內部
此外,在來賓虛擬機周圍經常會散佈大量信息,這些信息可以很容易地提供有關來賓操作系統在其下運行的虛擬機平台的線索。具體信息取決於所使用的VM基礎架構(例如,VMware、KVM或QEMU)。
以下只是惡意軟件作者可以檢查的幾個示例:
顯示VM特定硬件、驅動程序或服務的註冊表項路徑;
VM特定驅動程序或其他服務的文件系統路徑;
特定於某些VM基礎結構的MAC地址;
虛擬硬件(例如,如果查詢報告你的網卡是多年未生產的Intel e1000,它可以推斷你可能正在使用Qemu硬件模型運行);
運行顯示虛擬機平台特定服務以支持準虛擬化的流程,或為用戶提供方便的系統(如VMware工具);
CPUID指令,在許多情況下,有助於通知VM平台的客戶端軟件;
緩解虛擬機逃避大多數緩解措施的主要問題是,主流虛擬化平台替代方案為惡意軟件開發者所熟知。為了便於實現,大多數沙盒都基於KVM、Xen或QEMU等系統,這使得這類逃避特別難以緩解。
每一個主流虛擬機平台都被沙盒逃避所針對。問題是,除了編寫自己的自定義管理程序來支持惡意軟件分析之外,沒有什麼能有效地解決這類逃避問題。
缺乏人機互動這一類別包括需要特定人機互動的逃避。例如,惡意軟件開發者希望看到鼠標點擊或其他事件發生在“真實”用戶驅動的系統上,但這在典型的自動分析平台中是不存在的。惡意軟件家族通常會檢查人員交互,如果看起來沒有用戶驅動系統,則停止執行,因為用戶活動正在模擬中。
以下是我們在人機交互檢查中觀察到的一般主題:
提示用戶進行交互。例如,應該點擊沙盒可能不知道的對話框或虛假eula以確保引爆。
檢查鼠標點擊,鼠標移動和按鍵。甚至可以分析鼠標事件的位置或擊鍵的時間,以確定它們看起來是“自然的”還是通過編程生成的。
在文檔中放置宏以檢查是否存在諸如滾動、單擊電子表格中的單元格或檢查其他工作表選項卡等人機交互的證據。
讓我們看一個具體的示例(如下圖所示),說明惡意軟件如何獲取自上次用戶輸入(GetLastUserInput)和自系統啟動(GetTickCount)以來的時間。然後,它可以比較自按下最後一個鍵以來經過了多長時間,以檢測系統上是否有任何活動。
攻擊開始所需的用戶交互
減少人際互動逃避在實現沙盒時,我們可以控制虛擬鍵盤、鼠標和顯示器。如果由於某種原因,分析的可執行文件需要任何輸入鍵,我們可以向分析發送按鍵,或者確保點擊正確的按鈕以繼續執行可執行文件。
與VM檢測問題的所有其他領域一樣,我們需要對惡意軟件家族正在尋找的內容保持警惕,並不斷改進緩解逃避策略。最近的一個例子涉及需要在Excel電子表格中的多個單元格上單獨點擊鼠標的惡意軟件。
時間和計算資源逃避早期,沙盒中最常見的逃避方式之一是在做任何攻擊之前只需要睡眠一個小時。這樣,它將保證惡意軟件將遠遠超出幾乎所有沙盒使用的最短分析時間窗口,因為運行每個樣本超過幾分鐘是不可行的。
沙盒開發者對此的反應是將長時間睡眠縮短為短時間睡眠。下圖顯示了一種使用Windows計時器和Windows消息的逃避技術。其思想是安裝一個每秒鐘觸發一次的計時器,然後在執行計時器的回調時增加一個內部變量。
一旦變量達到特定的閾值,它將發送另一條Windows消息通知示例開始執行惡意軟件。這種規避的問題是,沙盒不能簡單地將計時器的超時時間減少到一個較低的數字,因為它可能會中斷其他軟件的執行,但它仍然必須以某種方式執行。
使用定時器和Windows消息的睡眠示例
另一個示例如下圖所示,其中惡意可執行文件只需在循環中調用時間戳計數器指令。
使用時間戳計數器指令的休眠循環
緩解利用時間逃避的方法老實說,利用時間逃避很難緩解。如前所述,我們總是可以調整睡眠參數和計時器,但這並不能完全解決問題。
我們發現另一個有用的策略是,因為我們控制管理程序,所以我們可以使用技術來控制所有硬件和軟件,從而使來賓VM中的時間過得更快。甚至不需要更改參數或安裝任何掛鉤就可以做到這一點。我們可以在幾分鐘內實時運行一個小時的可執行文件,這使我們能夠更快地獲取惡意代碼。
垃圾指令循環或虛擬機退出循環可能是最難對付的情況。如果惡意軟件開發者執行了幾百萬條CPUID指令,在管理程序下面執行這些指令的時間就會呈指數級增長,那麼我們的代碼就是在VM中運行的。
Pocket Litter檢查“Pocket Litter”一詞來自間諜活動領域,其目的是用於惡意軟件開發者檢查環境是否顯示出真實的目標主機的證據。
在沙盒環境中,檢查“Pocket Litter”通常包括查找合理的系統正常運行時間、My Documents文件夾中的足夠數量的文件或系統瀏覽器緩存中的大量頁面。這些都有助於證實該系統是“真實的”,而不是沙盒環境。與其他類別一樣,變化的數量似乎是無限的。
下圖顯示了另一個示例,其中惡意軟件檢查是否有兩個以上的可用處理器以及是否有足夠的可用內存。通常,沙盒環境的可用內存沒有普通PC那麼多,這項檢查是測試目標系統是否可能是台式PC或在沙盒環境中運行。
檢查所需的最小處理器數量和運行所需的內存
在下圖中,還有另一個示例,如果卷磁盤序列號與已知防病毒供應商使用的模擬器的序列號匹配,則AutoIt可執行文件將退出。
檢查卷序列號
Pocket Litter檢查緩解措施目前沒有一種特定的方法可以用於緩解這種逃避,只能具體問題具體解決。
例如,當我們看到對特定位置的特定類型文件進行檢查時(如果它看起來是對VM映像的無害更改),我們將它們添加到任何相關示例中以查看。這種Pocket Litter的方法感覺像是貓捉老鼠的遊戲。
總結沙盒逃避的方法太多,沒有哪一種方法可以有效地解決所有問題,因此必須具體問題具體分析解決。