沙盒
沙箱是一種安全模式,可讓您的瀏覽器從任何站點運行 JavaScript,您的手機運行任何開發人員的應用程序,以及您的筆記型電腦打開電子郵件附件 - 所有這些程序都無法讀取您的銀行帳戶文件。正是技術層將不受信任的程式碼從漏洞轉變為功能。
完整的文章正文以英文提供如下。
Sandboxing 是在受限環境內執行程式碼的做法,以防止程式碼存取其邊界之外的資源。沙箱限制它可以讀取哪些檔案、可以建立哪些網路連線、可以與哪些其他進程通訊以及可以呼叫哪些系統呼叫。如果程式碼被證明是惡意或有錯誤,則損害已得到控制。
為什麼沙箱很重要
現代計算取決於運行我們不完全信任的程式碼:
- 來自瀏覽器訪問的任何網站的JavaScript
- 來自應用程式商店的行動應用程式(經過審查但未經正式驗證)XP LZ12X
- 瀏覽器擴展,IDE插件、程式碼中的依賴項
- 文件中的巨集、電子郵件中附加的腳本
- 雲端基礎設施中的容器工作負載
如果沒有沙箱,其中每一項都會發生的憑證攻擊。沙箱是讓模型運作的關鍵。
如何建構沙箱
實作技術,分層:
- 進程隔離。 現代瀏覽器中的每個分頁都是一個單獨的作業系統進程。瀏覽器內核仲裁允許進程執行的操作。 Linux 上的
- seccomp-bpf — 進程可以進行系統呼叫的核心強制過濾器。沙箱聲明它需要的系統呼叫(讀、寫、mmap 等),而核心拒絕其他所有內容。
- Linux 上的命名空間與功能 — 檔案系統、流程、網路等的隔離視圖。容器是根據這些原語建構的。 macOS/iOS 上的
- App 沙箱 - 聲明性權利,描述應用程式需要哪些功能(相機存取、網路、特定路徑)。沒有授權的應用程式無法存取這些功能。
- AppContainer / Windows Sandbox — Microsoft 的等效隔離模型。
- Chrome 和 Firefox 中的站點隔離 — 每個來源的單獨進程,防止一個站點的 JavaScript 讀取另一個站點的內存,即使存在內核級漏洞發現
瀏覽器沙箱詳細信息
PLZ53XPLZ53X
PLZ53X
PLZ53X
PLZ53XPLZ53XPLZ53XPLZ53XPLZ53XPLZ53XPLZ53XPLZ53X”瀏覽器內核作為可信進程運行。每個渲染器進程(每個選項卡一個或多個)作為不受信任的進程運行,具有最少的功能。渲染器可以:- 分配記憶體
- 透過IPC與瀏覽器核心通訊以執行非常具體的操作
- 渲染到圖形緩衝區
- 運行JavaScript和WebAssemblyXPLZPLZPL6Z62X 67X
- 在其沙箱目錄之外打開檔案
- 與任意網路目標通訊(瀏覽器核心進行這些連線)
- 產生其他行程
- 通訊其他進程的記憶體XPLZ76PLPLZ77XXPLZ7888萬美元的錯誤Chrome 上最有利可圖的單一賞金(超過 20 萬美元)針對的是逃離沙箱的完整鏈。
行動應用程式沙箱
iOS 和 Android 將沙箱發揮到了邏輯極限:每個應用程式都在自己的 UID 中運行,看到自己的檔案系統視圖,並且只能透過狹窄的、作業系統介導的 IPC 通道(Android 上的意圖、URL 方案)與其他應用程式上的應用程式進行通訊。作業系統在運作時提示使用者提供功能樣式的權限(攝影機、麥克風、聯絡人)。結果是:手機上的惡意軟體比桌面上的惡意軟體受到更嚴格的控制。
WebAssembly 和新的沙箱
WebAssembly 從一開始就將沙箱作為一流的屬性進行設計。 WASM 模組沒有自己的系統呼叫;一切都必須由主機環境提供(WASI 用於系統呼叫式 API、瀏覽器中的 Web API)。這使得 WASM 成為在受信任的應用程式中運行不受信任的插件的有力候選者——以前需要大量進程隔離的用例。 wasmtime 和 wasmer 等工具使用此模型。
當沙箱失敗時
沙箱逃脫漏洞是真實存在的並且很有價值。重複出現的故障模式:
- 核心表面中的錯誤。 即使受 seccomp 限制的進程有時也可以利用透過允許的系統呼叫可到達的核心錯誤。
- IPC 錯誤。 沙箱用來與代理程式對話的介面本身就是攻擊面。
- 側通道。 Spectre 和Meltdown 顯示 CPU 最佳化可能會跨進程邊界洩漏資料。現代沙箱可以緩解這個問題,但根本問題仍然是硬體層級的問題。
- 沙箱設定檔錯誤。 操作員有時會放鬆沙箱設定檔以使軟體正常運作,從而意外打開漏洞。
沙箱是一種機率防禦 - 它提高了利用的門檻,而不是消除它。深度防禦將沙盒與其他措施(記憶體安全語言、消毒劑、減少攻擊面)結合。
沙盒對您意味著什麼
對於最終用戶來說,沙盒幾乎是不可見的。實際意義:保持瀏覽器和作業系統更新,因為沙箱逃逸是最高優先順序的安全修復。避免停用沙箱功能(一些 Linux 用戶關閉 seccomp 設定文件,一些高級用戶禁用 Chrome 的沙箱標誌),除非您了解後果。瀏覽器預設是經過強化的;預設值幾乎對所有使用者都是正確的。
PLZ53XPLZ53XPLZ53XPLZ53XPLZ53XPLZ53X”瀏覽器內核作為可信進程運行。每個渲染器進程(每個選項卡一個或多個)作為不受信任的進程運行,具有最少的功能。渲染器可以:- 分配記憶體
- 透過IPC與瀏覽器核心通訊以執行非常具體的操作
- 渲染到圖形緩衝區
- 運行JavaScript和WebAssemblyXPLZPLZPL6Z62X 67X
- 在其沙箱目錄之外打開檔案
- 與任意網路目標通訊(瀏覽器核心進行這些連線)
- 產生其他行程
- 通訊其他進程的記憶體XPLZ76PLPLZ77XXPLZ7888萬美元的錯誤Chrome 上最有利可圖的單一賞金(超過 20 萬美元)針對的是逃離沙箱的完整鏈。
行動應用程式沙箱
iOS 和 Android 將沙箱發揮到了邏輯極限:每個應用程式都在自己的 UID 中運行,看到自己的檔案系統視圖,並且只能透過狹窄的、作業系統介導的 IPC 通道(Android 上的意圖、URL 方案)與其他應用程式上的應用程式進行通訊。作業系統在運作時提示使用者提供功能樣式的權限(攝影機、麥克風、聯絡人)。結果是:手機上的惡意軟體比桌面上的惡意軟體受到更嚴格的控制。
WebAssembly 和新的沙箱
WebAssembly 從一開始就將沙箱作為一流的屬性進行設計。 WASM 模組沒有自己的系統呼叫;一切都必須由主機環境提供(WASI 用於系統呼叫式 API、瀏覽器中的 Web API)。這使得 WASM 成為在受信任的應用程式中運行不受信任的插件的有力候選者——以前需要大量進程隔離的用例。 wasmtime 和 wasmer 等工具使用此模型。
當沙箱失敗時
沙箱逃脫漏洞是真實存在的並且很有價值。重複出現的故障模式:
- 核心表面中的錯誤。 即使受 seccomp 限制的進程有時也可以利用透過允許的系統呼叫可到達的核心錯誤。
- IPC 錯誤。 沙箱用來與代理程式對話的介面本身就是攻擊面。
- 側通道。 Spectre 和Meltdown 顯示 CPU 最佳化可能會跨進程邊界洩漏資料。現代沙箱可以緩解這個問題,但根本問題仍然是硬體層級的問題。
- 沙箱設定檔錯誤。 操作員有時會放鬆沙箱設定檔以使軟體正常運作,從而意外打開漏洞。
沙箱是一種機率防禦 - 它提高了利用的門檻,而不是消除它。深度防禦將沙盒與其他措施(記憶體安全語言、消毒劑、減少攻擊面)結合。
沙盒對您意味著什麼
對於最終用戶來說,沙盒幾乎是不可見的。實際意義:保持瀏覽器和作業系統更新,因為沙箱逃逸是最高優先順序的安全修復。避免停用沙箱功能(一些 Linux 用戶關閉 seccomp 設定文件,一些高級用戶禁用 Chrome 的沙箱標誌),除非您了解後果。瀏覽器預設是經過強化的;預設值幾乎對所有使用者都是正確的。
PLZ53XPLZ53XPLZ53XPLZ53X”瀏覽器內核作為可信進程運行。每個渲染器進程(每個選項卡一個或多個)作為不受信任的進程運行,具有最少的功能。渲染器可以:- 分配記憶體
- 透過IPC與瀏覽器核心通訊以執行非常具體的操作
- 渲染到圖形緩衝區
- 運行JavaScript和WebAssemblyXPLZPLZPL6Z62X 67X
- 在其沙箱目錄之外打開檔案
- 與任意網路目標通訊(瀏覽器核心進行這些連線)
- 產生其他行程
- 通訊其他進程的記憶體XPLZ76PLPLZ77XXPLZ7888萬美元的錯誤Chrome 上最有利可圖的單一賞金(超過 20 萬美元)針對的是逃離沙箱的完整鏈。
行動應用程式沙箱
iOS 和 Android 將沙箱發揮到了邏輯極限:每個應用程式都在自己的 UID 中運行,看到自己的檔案系統視圖,並且只能透過狹窄的、作業系統介導的 IPC 通道(Android 上的意圖、URL 方案)與其他應用程式上的應用程式進行通訊。作業系統在運作時提示使用者提供功能樣式的權限(攝影機、麥克風、聯絡人)。結果是:手機上的惡意軟體比桌面上的惡意軟體受到更嚴格的控制。
WebAssembly 和新的沙箱
WebAssembly 從一開始就將沙箱作為一流的屬性進行設計。 WASM 模組沒有自己的系統呼叫;一切都必須由主機環境提供(WASI 用於系統呼叫式 API、瀏覽器中的 Web API)。這使得 WASM 成為在受信任的應用程式中運行不受信任的插件的有力候選者——以前需要大量進程隔離的用例。 wasmtime 和 wasmer 等工具使用此模型。
當沙箱失敗時
沙箱逃脫漏洞是真實存在的並且很有價值。重複出現的故障模式:
- 核心表面中的錯誤。 即使受 seccomp 限制的進程有時也可以利用透過允許的系統呼叫可到達的核心錯誤。
- IPC 錯誤。 沙箱用來與代理程式對話的介面本身就是攻擊面。
- 側通道。 Spectre 和Meltdown 顯示 CPU 最佳化可能會跨進程邊界洩漏資料。現代沙箱可以緩解這個問題,但根本問題仍然是硬體層級的問題。
- 沙箱設定檔錯誤。 操作員有時會放鬆沙箱設定檔以使軟體正常運作,從而意外打開漏洞。
沙箱是一種機率防禦 - 它提高了利用的門檻,而不是消除它。深度防禦將沙盒與其他措施(記憶體安全語言、消毒劑、減少攻擊面)結合。
沙盒對您意味著什麼
對於最終用戶來說,沙盒幾乎是不可見的。實際意義:保持瀏覽器和作業系統更新,因為沙箱逃逸是最高優先順序的安全修復。避免停用沙箱功能(一些 Linux 用戶關閉 seccomp 設定文件,一些高級用戶禁用 Chrome 的沙箱標誌),除非您了解後果。瀏覽器預設是經過強化的;預設值幾乎對所有使用者都是正確的。
PLZ53XPLZ53X”瀏覽器內核作為可信進程運行。每個渲染器進程(每個選項卡一個或多個)作為不受信任的進程運行,具有最少的功能。渲染器可以:- 分配記憶體
- 透過IPC與瀏覽器核心通訊以執行非常具體的操作
- 渲染到圖形緩衝區
- 運行JavaScript和WebAssemblyXPLZPLZPL6Z62X 67X
- 在其沙箱目錄之外打開檔案
- 與任意網路目標通訊(瀏覽器核心進行這些連線)
- 產生其他行程
- 通訊其他進程的記憶體XPLZ76PLPLZ77XXPLZ7888萬美元的錯誤Chrome 上最有利可圖的單一賞金(超過 20 萬美元)針對的是逃離沙箱的完整鏈。
行動應用程式沙箱
iOS 和 Android 將沙箱發揮到了邏輯極限:每個應用程式都在自己的 UID 中運行,看到自己的檔案系統視圖,並且只能透過狹窄的、作業系統介導的 IPC 通道(Android 上的意圖、URL 方案)與其他應用程式上的應用程式進行通訊。作業系統在運作時提示使用者提供功能樣式的權限(攝影機、麥克風、聯絡人)。結果是:手機上的惡意軟體比桌面上的惡意軟體受到更嚴格的控制。
WebAssembly 和新的沙箱
WebAssembly 從一開始就將沙箱作為一流的屬性進行設計。 WASM 模組沒有自己的系統呼叫;一切都必須由主機環境提供(WASI 用於系統呼叫式 API、瀏覽器中的 Web API)。這使得 WASM 成為在受信任的應用程式中運行不受信任的插件的有力候選者——以前需要大量進程隔離的用例。 wasmtime 和 wasmer 等工具使用此模型。
當沙箱失敗時
沙箱逃脫漏洞是真實存在的並且很有價值。重複出現的故障模式:
- 核心表面中的錯誤。 即使受 seccomp 限制的進程有時也可以利用透過允許的系統呼叫可到達的核心錯誤。
- IPC 錯誤。 沙箱用來與代理程式對話的介面本身就是攻擊面。
- 側通道。 Spectre 和Meltdown 顯示 CPU 最佳化可能會跨進程邊界洩漏資料。現代沙箱可以緩解這個問題,但根本問題仍然是硬體層級的問題。
- 沙箱設定檔錯誤。 操作員有時會放鬆沙箱設定檔以使軟體正常運作,從而意外打開漏洞。
沙箱是一種機率防禦 - 它提高了利用的門檻,而不是消除它。深度防禦將沙盒與其他措施(記憶體安全語言、消毒劑、減少攻擊面)結合。
沙盒對您意味著什麼
對於最終用戶來說,沙盒幾乎是不可見的。實際意義:保持瀏覽器和作業系統更新,因為沙箱逃逸是最高優先順序的安全修復。避免停用沙箱功能(一些 Linux 用戶關閉 seccomp 設定文件,一些高級用戶禁用 Chrome 的沙箱標誌),除非您了解後果。瀏覽器預設是經過強化的;預設值幾乎對所有使用者都是正確的。
”瀏覽器內核作為可信進程運行。每個渲染器進程(每個選項卡一個或多個)作為不受信任的進程運行,具有最少的功能。渲染器可以:- 分配記憶體
- 透過IPC與瀏覽器核心通訊以執行非常具體的操作
- 渲染到圖形緩衝區
- 運行JavaScript和WebAssemblyXPLZPLZPL6Z62X 67X
- 在其沙箱目錄之外打開檔案
- 與任意網路目標通訊(瀏覽器核心進行這些連線)
- 產生其他行程
- 通訊其他進程的記憶體XPLZ76PLPLZ77XXPLZ7888萬美元的錯誤Chrome 上最有利可圖的單一賞金(超過 20 萬美元)針對的是逃離沙箱的完整鏈。
行動應用程式沙箱
iOS 和 Android 將沙箱發揮到了邏輯極限:每個應用程式都在自己的 UID 中運行,看到自己的檔案系統視圖,並且只能透過狹窄的、作業系統介導的 IPC 通道(Android 上的意圖、URL 方案)與其他應用程式上的應用程式進行通訊。作業系統在運作時提示使用者提供功能樣式的權限(攝影機、麥克風、聯絡人)。結果是:手機上的惡意軟體比桌面上的惡意軟體受到更嚴格的控制。
WebAssembly 和新的沙箱
WebAssembly 從一開始就將沙箱作為一流的屬性進行設計。 WASM 模組沒有自己的系統呼叫;一切都必須由主機環境提供(WASI 用於系統呼叫式 API、瀏覽器中的 Web API)。這使得 WASM 成為在受信任的應用程式中運行不受信任的插件的有力候選者——以前需要大量進程隔離的用例。 wasmtime 和 wasmer 等工具使用此模型。
當沙箱失敗時
沙箱逃脫漏洞是真實存在的並且很有價值。重複出現的故障模式:
- 核心表面中的錯誤。 即使受 seccomp 限制的進程有時也可以利用透過允許的系統呼叫可到達的核心錯誤。
- IPC 錯誤。 沙箱用來與代理程式對話的介面本身就是攻擊面。
- 側通道。 Spectre 和Meltdown 顯示 CPU 最佳化可能會跨進程邊界洩漏資料。現代沙箱可以緩解這個問題,但根本問題仍然是硬體層級的問題。
- 沙箱設定檔錯誤。 操作員有時會放鬆沙箱設定檔以使軟體正常運作,從而意外打開漏洞。
沙箱是一種機率防禦 - 它提高了利用的門檻,而不是消除它。深度防禦將沙盒與其他措施(記憶體安全語言、消毒劑、減少攻擊面)結合。
沙盒對您意味著什麼
對於最終用戶來說,沙盒幾乎是不可見的。實際意義:保持瀏覽器和作業系統更新,因為沙箱逃逸是最高優先順序的安全修復。避免停用沙箱功能(一些 Linux 用戶關閉 seccomp 設定文件,一些高級用戶禁用 Chrome 的沙箱標誌),除非您了解後果。瀏覽器預設是經過強化的;預設值幾乎對所有使用者都是正確的。
- 在其沙箱目錄之外打開檔案
- 與任意網路目標通訊(瀏覽器核心進行這些連線)
- 產生其他行程
- 通訊其他進程的記憶體XPLZ76PLPLZ77XXPLZ7888萬美元的錯誤Chrome 上最有利可圖的單一賞金(超過 20 萬美元)針對的是逃離沙箱的完整鏈。
行動應用程式沙箱
iOS 和 Android 將沙箱發揮到了邏輯極限:每個應用程式都在自己的 UID 中運行,看到自己的檔案系統視圖,並且只能透過狹窄的、作業系統介導的 IPC 通道(Android 上的意圖、URL 方案)與其他應用程式上的應用程式進行通訊。作業系統在運作時提示使用者提供功能樣式的權限(攝影機、麥克風、聯絡人)。結果是:手機上的惡意軟體比桌面上的惡意軟體受到更嚴格的控制。
WebAssembly 和新的沙箱
WebAssembly 從一開始就將沙箱作為一流的屬性進行設計。 WASM 模組沒有自己的系統呼叫;一切都必須由主機環境提供(WASI 用於系統呼叫式 API、瀏覽器中的 Web API)。這使得 WASM 成為在受信任的應用程式中運行不受信任的插件的有力候選者——以前需要大量進程隔離的用例。 wasmtime 和 wasmer 等工具使用此模型。
當沙箱失敗時
沙箱逃脫漏洞是真實存在的並且很有價值。重複出現的故障模式:
- 核心表面中的錯誤。 即使受 seccomp 限制的進程有時也可以利用透過允許的系統呼叫可到達的核心錯誤。
- IPC 錯誤。 沙箱用來與代理程式對話的介面本身就是攻擊面。
- 側通道。 Spectre 和Meltdown 顯示 CPU 最佳化可能會跨進程邊界洩漏資料。現代沙箱可以緩解這個問題,但根本問題仍然是硬體層級的問題。
- 沙箱設定檔錯誤。 操作員有時會放鬆沙箱設定檔以使軟體正常運作,從而意外打開漏洞。
沙箱是一種機率防禦 - 它提高了利用的門檻,而不是消除它。深度防禦將沙盒與其他措施(記憶體安全語言、消毒劑、減少攻擊面)結合。
沙盒對您意味著什麼
對於最終用戶來說,沙盒幾乎是不可見的。實際意義:保持瀏覽器和作業系統更新,因為沙箱逃逸是最高優先順序的安全修復。避免停用沙箱功能(一些 Linux 用戶關閉 seccomp 設定文件,一些高級用戶禁用 Chrome 的沙箱標誌),除非您了解後果。瀏覽器預設是經過強化的;預設值幾乎對所有使用者都是正確的。
常見問題
- 沙箱和虛擬化一樣嗎?
- 它們重疊但不相同。虛擬化在模擬器內運行整個作業系統;隔離處於硬體虛擬化層級。沙箱通常在同一作業系統內運行進程,並具有核心強制限制。虛擬化較重,但隔離性較強;現代設計通常將兩者結合(用於無伺服器的 Firecracker VM,用於容器的 gVisor)。
- 沙箱會減慢速度嗎?
- 適度的開銷 - 通常用於系統呼叫過濾的百分比為個位數,用於進程隔離的開銷略高。透過硬體支援(Intel CET、ARM PAC)積極降低了效能成本,因此現代沙箱對於大多數工作負載基本上是免費的。
- VPN 可以逃脫沙箱嗎?
- VPN 用戶端軟體通常需要比沙盒應用程式更多的權限 - 它們配置路由和網路介面。在 macOS 和 iOS 上,他們使用特定的 API(網路擴充框架)來安全地執行此操作。 VPN用戶端本身是有特權的;流經它的資料對其他應用程式是不透明的。
- 在 Docker 容器中運行程式碼與沙箱相同嗎?
- Docker 容器使用 Linux 命名空間和 seccomp 進行隔離,這是沙箱的一種形式。這種隔離比基於虛擬化的沙箱(容器共享主機核心)弱,並且比禁止大多數系統呼叫的使用者空間沙箱(容器允許許多系統呼叫)弱。對於不受信任的工作負載,gVisor 或 Kata Containers 等專案在 Docker UX 周圍提供了更強的隔離。
- 為什麼 Chrome 使用這麼多記憶體?
- 站點隔離。每個來源都在自己的進程中運行 - 不同站點的 50 個選項卡意味著 50 個進程,每個進程都有自己的記憶體開銷。成本是RAM;好處是一個選項卡的漏洞無法讀取另一個選項卡的資料(密碼、會話)。現代 Chrome 在記憶體共享優化上投入了更多精力,以減少影響,但該架構本質上是用記憶體來換取安全性。