UNTRUSTEDCODE/etccredsnetSANDBOXno access outside

沙盒

10 最小閱讀量安全

沙箱是一種安全模式,可讓您的瀏覽器從任何站點運行 JavaScript,您的手機運行任何開發人員的應用程序,以及您的筆記型電腦打開電子郵件附件 - 所有這些程序都無法讀取您的銀行帳戶文件。正是技術層將不受信任的程式碼從漏洞轉變為功能。

完整的文章正文以英文提供如下。

Sandboxing 是在受限環境內執行程式碼的做法,以防止程式碼存取其邊界之外的資源。沙箱限制它可以讀取哪些檔案、可以建立哪些網路連線、可以與哪些其他進程通訊以及可以呼叫哪些系統呼叫。如果程式碼被證明是惡意或有錯誤,則損害已得到控制。

為什麼沙箱很重要

現代計算取決於運行我們不完全信任的程式碼:

  • 來自瀏覽器訪問的任何網站的JavaScript
  • 來自應用程式商店的行動應用程式(經過審查但未經正式驗證)XP LZ12X
  • 瀏覽器擴展,IDE插件、程式碼中的依賴項
  • 文件中的巨集、電子郵件中附加的腳本
  • 雲端基礎設施中的容器工作負載

如果沒有沙箱,其中每一項都會發生的憑證攻擊。沙箱是讓模型運作的關鍵。

如何建構沙箱

實作技術,分層:

  • 進程隔離。 現代瀏覽器中的每個分頁都是一個單獨的作業系統進程。瀏覽器內核仲裁允許進程執行的操作。 Linux 上的
  • seccomp-bpf — 進程可以進行系統呼叫的核心強制過濾器。沙箱聲明它需要的系統呼叫(讀、寫、mmap 等),而核心拒絕其他所有內容。
  • Linux 上的命名空間與功能 — 檔案系統、流程、網路等的隔離視圖。容器是根據這些原語建構的。 macOS/iOS 上的
  • App 沙箱 - 聲明性權利,描述應用程式需要哪些功能(相機存取、網路、特定路徑)。沒有授權的應用程式無法存取這些功能。
  • AppContainer / Windows Sandbox — Microsoft 的等效隔離模型。
  • Chrome 和 Firefox 中的站點隔離 — 每個來源的單獨進程,防止一個站點的 JavaScript 讀取另一個站點的內存,即使存在內核級漏洞發現

瀏覽器沙箱詳細信息

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

PLZ53X

”瀏覽器內核作為可信進程運行。每個渲染器進程(每個選項卡一個或多個)作為不受信任的進程運行,具有最少的功能。渲染器可以:

  • 分配記憶體
  • 透過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 的沙箱標誌),除非您了解後果。瀏覽器預設是經過強化的;預設值幾乎對所有使用者都是正確的。

常見問題

沙箱和虛擬化一樣嗎?
它們重疊但不相同。虛擬化在模擬器內運行整個作業系統;隔離處於硬體虛擬化層級。沙箱通常在同一作業系統內運行進程,並具有核心強制限制。虛擬化較重,但隔離性較強;現代設計通常將兩者結合(用於無伺服器的 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 在記憶體共享優化上投入了更多精力,以減少影響,但該架構本質上是用記憶體來換取安全性。
沙盒解釋:瀏覽器和作業系統如何包含不受信任的程式碼