ShadowCallYığın

ShadowCallStack (SCS), bir işlevin dönüş adresini yaprak olmayan işlevlerin işlev prologunda ayrı olarak ayrılmış bir ShadowCallStack'e kaydederek ve işlevdeki ShadowCallStack'ten dönüş adresini yükleyerek dönüş adresi üzerine yazmalarına (yığın arabellek taşmaları gibi) karşı koruma sağlayan bir LLVM enstrümantasyon modudur. 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'te, enstrümantasyon ShadowCallStack'e referans vermek için x18 kaydından yararlanır, bu da ShadowCallStack'e yapılan referansların bellekte saklanması gerekmediği anlamına gelir. 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, x18 kaydının ShadowCallStack adresini depolamak için ayrıldığını ve başka herhangi bir amaçla kullanılmadığını varsayar. Tüm sistem kitaplıkları x18 kaydını rezerve etmek için derlenirken, SCS, işlem içi eski kodla birlikte çalışan kullanıcı alanı bileşenleri için etkinleştirilirse (örneğin, üçüncü taraf uygulamalar tarafından yüklenebilen kitaplıklar) bu durum potansiyel olarak sorunludur. x18 kaydı. 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 olarak yapılmış 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.