影子調用棧

ShadowCallStack(SCS)是一個LLVM儀表模式保護免受返回地址重寫(如堆緩衝區溢出)通過在函數中的非葉函數的函數的prolog保存函數的返回地址到一個單獨分配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 測試。相反,請確保 CTS 測試在啟用和不啟用 SCS 的情況下通過,以驗證 SCS 不會影響設備。