ShadowCallStack (SCS) adalah mode instrumentasi LLVM yang melindungi dari alamat return menimpa (seperti stack buffer overflow) dengan menyimpan nilai alamat return ke ShadowCallStack yang dialokasikan secara terpisah di {i>prolog fungsi<i} dari {i>nonleaf<i} dan memuat alamat {i>return<i} dari ShadowCallStack dalam epilog fungsi. Alamat pengembalian juga disimpan pada stack reguler untuk kompatibilitas dengan unwinder, tetapi tidak digunakan. Cara ini memastikan bahwa serangan yang mengubah alamat return di tumpukan reguler tidak berpengaruh pada alur kontrol program.
Di aarch64, instrumentasi menggunakan x18
mendaftar untuk mereferensikan ShadowCallStack, yang berarti mereferensikan
ke ShadowCallStack tidak harus disimpan dalam memori.
Hal ini memungkinkan penerapan runtime yang menghindari eksposur
alamat ShadowCallStack ke
penyerang yang dapat membaca
memori arbitrer.
Implementasi
Android mendukung ShadowCallStack untuk kernel dan userspace.
Mengaktifkan SCS untuk kernel
Untuk mengaktifkan ShadowCallStack untuk kernel, tambahkan baris berikut ke file konfigurasi kernel:
CONFIG_SHADOW_CALL_STACK=y
Mengaktifkan SCS di ruang pengguna
Untuk mengaktifkan ShadowCallStack dalam komponen userspace, tambahkan baris berikut ke file blueprint komponen:
sanitize: { scs: true }
SCS mengasumsikan bahwa register x18
dicadangkan untuk menyimpan alamat
ShadowCallStack, dan tidak digunakan untuk tujuan lain. Meskipun semua sistem
library dikompilasi untuk mencadangkan pendaftaran x18
, hal ini berpotensi
bermasalah jika SCS diaktifkan untuk komponen {i>userspace<i} yang memiliki interoperabilitas
kode lama yang sedang diproses (misalnya, library yang dapat dimuat oleh pihak ketiga
aplikasi), yang dapat mengacaukan register x18
. Oleh karena itu, kami hanya merekomendasikan
mengaktifkan SCS dalam komponen mandiri yang tidak akan dimuat ke dalam
biner.
Validasi
Tidak ada uji CTS khusus untuk SCS. Sebaliknya, pastikan bahwa uji CTS lulus dengan dan tanpa mengaktifkan SCS untuk memverifikasi bahwa SCS tidak memengaruhi perangkat seluler.