ShadowCallStack

ShadowCallStack (SCS) 是一種LLVM 偵測模式,透過將函數的回傳位址儲存到非葉函數的函數序言中單獨指派的ShadowCallStack並從函數中的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 測試。相反,請確保在啟用和未啟用 SCS 的情況下通過 CTS 測試,以驗證 SCS 不會影響設備。