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.