ShadowCallYığın

ShadowCallStack (SCS) bir olduğu LLVM enstrümantasyon fonksiyonunda ShadowCallStack dönüş adresi nonleaf işlevlerin işlev önbölüküne ayrı tahsis ShadowCallStack bir fonksiyon geri adresini kaydetme ve yükleme ile (yığın bellek taşmaları gibi) geri dönüş adresi üzerine yazma karşı koruma modu epilog. Dönüş adresi ayrıca, sarıcılar ile uyumluluk için normal yığında saklanır, ancak bunun dışında kullanılmaz. Bu, normal yığındaki dönüş adresini değiştiren saldırıların program kontrol akışı üzerinde hiçbir etkisi olmamasını sağlar.

Aarch64 günü, enstrümantasyon markaları kullanımı x18 ShadowCallStack göndermeler hafızada saklanabilir gerekmez, yani ShadowCallStack başvurmak için kayıt. Bu, ShadowCallStack adresinin rastgele bellek okuyabilen saldırganlara gösterilmesini önleyen bir çalışma zamanının uygulanmasını mümkün kılar.

uygulama

Android, hem çekirdek hem de kullanıcı alanı için ShadowCallStack'i destekler.

Çekirdek için SCS'yi etkinleştirme

Çekirdek için ShadowCallStack'i etkinleştirmek için, çekirdek yapılandırma dosyasına aşağıdaki satırı ekleyin:

CONFIG_SHADOW_CALL_STACK=y

Kullanıcı alanında SCS'yi etkinleştirme

Kullanıcı alanı bileşenlerinde ShadowCallStack'i etkinleştirmek için, bir bileşenin plan dosyasına aşağıdaki satırları ekleyin:

sanitize: {
  scs: true
}

SCS varsayar x18 register ShadowCallStack adresini saklamak için ayrılmıştır ve diğer amaçlar için kullanılmaz. Tüm sistem kütüphaneleri ayırmak için derlenmiş olsa da x18 kayıt SCS userspace bileşenleri için etkinse, bu sorun yaratabilecek olduğunu clobber (örneğin, üçüncü taraf uygulamalar tarafından yüklenen olabilir kütüphanelerde) işlem içi eski kod, birlikte çalışır x18 kayıt. Bu nedenle, yalnızca eski ikili dosyalara yüklenmeyecek bağımsız bileşenlerde SCS'yi etkinleştirmenizi öneririz.

doğrulama

SCS için özel bir CTS testi yoktur. Bunun yerine, SCS'nin cihazı etkilemediğini doğrulamak için CTS testlerinin SCS etkinken ve etkinleştirilmeden geçtiğinden emin olun.