天天看點

沙箱:概述

作者:anhkgg

日期:2019年10月4日

最早接觸沙箱,對它的印象就是:sandboxie。

因為學的是安全相關專業,在網上下載下傳東西非常謹慎,就算通過了防毒軟體掃描,但是也怕有後門或者其他東西,畢竟我也可以靜态過掉殺軟。

很多軟體沒有官網,各種下載下傳站的東西真的是讓人不放心。

是以在下載下傳某些軟體後,隻要不影響功能,基本都會用sandboxie來運作軟體。如果不行,則放到虛拟機裡。

是以我對沙箱最初的概念就是:sandboxie,它是一個輕量級虛拟機,軟體的操作都不會影響真正的系統,包括檔案、系統資料庫等等資源,可以放肆地想幹嘛幹嘛。

那時當然是不怎麼知道sanboxie是怎麼做的。

題外話:最近因為微軟的關系,sanboxie已選宣布免費,後續還可能開源,感興趣的可以關注關注。

沙箱

注:沙箱現在的概念非常雜,某些分析平台後端也叫沙箱,主要關注的行為擷取,我這裡說的不一樣。

那麼沙箱究竟是怎麼做的呢?

一句話概括的話就是:沙箱内萬物基于重定向。

重定向,顧名思義,就是重新指定方向,也就是說沙箱能夠做到讓沙箱内軟體操作的檔案、系統資料庫等路徑重定向到其他位置(沙箱指定位置),這樣軟體本來想操作的資源就不會被通路或者操作,保證資源的安全性。

這也就是我使用沙箱跑一些不明軟體的原因,萬一軟體被惡意修改過,存在病毒,想破壞系統關鍵檔案,也就不可能了。

言歸正傳。

重定向我們還有個進階的詞叫做“虛拟化”,也可以稱作"隔離",說到底沙箱就是為程式提供一個虛拟化環境,也就是隔離環境,并保證程式所有操作都在這個隔離環境内。

再舉一個簡單的例子了解一下重定向。如果程式要删除c:\boot.ini,沙箱如何做到隔離,保證檔案不被删除呢。

  1. 沙箱hook ZwDeleteFile,函數是HOOK_ZwDeleteFile。
  2. 在HOOK_ZwDeleteFile中,講路徑c:\boot.ini加上一個字首c:\sandbox\boot.ini,轉到沙箱内檔案路徑。
  3. c:\sandbox\boot.ini不存在,會先把c:\boot.ini拷貝到沙箱内。
  4. 然後調用原始ZwDeleteFile,删除c:\sandbox\boot.ini。
NTSTATUS HOOK_ZwDeleteFile(
  POBJECT_ATTRIBUTES ObjectAttributes
) {
   AddPrefix(ObjectAttributes->ObjectName, L"sandbox");//路徑加上沙箱字首
   if(!PathFileExists(ObjectAttributes->ObjectName.Buffer)) {
      CopyFile();//拷貝進來
   }
   return OrigZwDeleteFile(ObjectAttributes);
}
           

如此就完成了一個簡單的删除檔案的隔離。

一個完備的沙箱一般需要虛拟化(隔離)處理這些東西:

  1. 檔案
  2. 系統資料庫
  3. DCOM(RPCSS)
  4. 服務
  5. 其他如:視窗、類名、消息、token等。
  6. 程序、線程安全
  7. 全局鈎子、注入等防護
  8. 驅動加載

下面對比較重要的幾個内容進行一下闡述。

檔案重定向

保證沙箱内程式建立、修改、删除、讀取等檔案操作都在沙箱内,不會影響系統中真實的檔案。

功能實作方式由很多,主要可以按下面分為:

  1. 使用者态實作,hook ntdll.dll檔案相關函數,然後路徑重定向
  2. 核心态實作,ssdt hook檔案相關函數,或者minifilter等技術

使用者态實作較為簡單,語義更清晰,但是強度不夠,有很多方式穿透ntdll.dll這層的檔案操作函數,導緻檔案重定向(隔離)失敗,比如使用者态通過直接扇區讀寫來修改檔案。

核心态如果使用minifilter來實作,強度基本就夠了。

不過sandboxie是在使用者态實作的。

系統資料庫重定向

保證沙箱内程式建立、修改、删除、讀取等系統資料庫操作都在沙箱内,不會影響系統中真實的系統資料庫資訊。

同樣,和檔案重定向一樣,也可以在使用者态或核心态使用不同的技術完成,先不細說。

DCOM虛拟化

其實做DCOM虛拟化,最主要是為了防止沙箱内程式逃逸。

所謂逃逸,就是沙箱無法控制沙箱内程式行為,程式可以繞過沙箱,對系統造成破壞。

逃逸的方式有很多,對于支援DCOM的程式,就是其中一種。

舉個例子,在wordpad.exe(寫字闆)插入對象-畫筆圖檔,會啟動mspaint,可以看到mspaint是svchost.exe -k DcomLaunch的子程序。

沙箱:概述

什麼意思呢?

一般來說,如果在沙箱中啟動wordpad.exe,wordpad.exe的子程序預設也會進入沙箱,但通過DCOM啟動的mspaint就沒法拉入沙箱了,它不是wordpad.exe子程序。

是以,此時需要虛拟化DCOM,讓沙箱内啟動一個DCOM服務,這樣wordpad.exe直接和沙箱内DCOM通信,啟動子程序mspaint.exe,作為沙箱内DCOM服務的子程序,自然也被拉入沙箱内。

如此做到組織逃逸。

這裡面涉及到很多技術細節,如RPC,後面細說。

服務虛拟化

其實服務也是逃逸沙箱的一種方式,但是也可以說如果沙箱不支援服務虛拟化,某些程式就不能在沙箱内正常工作。

是以不管出于那種原因考慮,沙箱都得實作服務虛拟化。

至于說服務也能逃逸是怎麼回事呢?

很簡單,程式通過服務API建立一個服務,然後啟動服務,對應服務程式就沒法被沙箱接管,逃出沙箱控制。

實作就是接管服務相關API了。

其他

剩下的其他内容,暫時也不分析了,如果有時間,後面繼續分享。

最後

前面說的内容都是如何完成虛拟化的東西,一個成熟的沙箱肯定還包括其他很多東西,比如多沙箱的支援、沙箱清理、安全浏覽器等等,不過這些都不在我們重點讨論範圍,畢竟這些隻有在實際産品才會考慮的問題,我們這裡隻是研究沙箱核心相關的技術。

另外,針對每種重定向技術細節後續會慢慢詳細分享,敬請關注。

最後,再來一張簡單的沙箱框圖。

沙箱:概述

如果覺得内容還不錯,歡迎關注公衆号:漢客兒

繼續閱讀