ShadowCallStack

ShadowCallStack (SCS) 是一種 LLVM 檢測模式, 透過儲存函式的 將地址退還到單獨的 ShadowCallStack 非分葉函式的向量函式,並從中載入回傳地址 函式 epilog 中的 ShadowCallStack。系統也會儲存退貨地址 ,以便與展開程式相容,不過並不會使用。 這可確保在一般堆疊上修改傳回地址的攻擊 不會影響程式控制流程

在 aarch64 上,檢測會使用 x18 註冊即可參照 ShadowCallStack,也就是參照 您就不必在記憶體內儲存 ShadowCallStack 這樣一來,您就能實作避免暴露風險的執行階段 向攻擊者發出 ShadowCallStack 的位址,以便讀取 任意記憶體

實作

Android 同時為核心和使用者空間支援 ShadowCallStack。

為核心啟用 SCS

如要為核心啟用 ShadowCallStack,請將下列程式碼新增至 核心設定檔:

CONFIG_SHADOW_CALL_STACK=y

啟用使用者空間中的 SCS

如要在使用者空間元件中啟用 ShadowCallStack,請將 嵌入元件的藍圖檔案中加入幾行:

sanitize: {
  scs: true
}

SCS 會假設 x18 暫存器保留給儲存 ShadowCallStack,不會用於其他用途。在所有系統上 系統會對程式庫進行編譯,保留 x18 暫存器,這可能 如果使用者空間元件啟用了 SCS 程序中舊版程式碼 (例如可由第三方載入的程式庫) 應用程式),這可能會破壞 x18 暫存器。因此,我們只建議 針對無法載入至舊版的獨立元件啟用 SCS 二進位檔。

驗證

請注意,我們並未專門針對 SCS 執行 CTS 測試。應先讓 CTS 測試 成功傳入和未啟用 SCS,以驗證 SCS 是否影響 裝置。