ShadowCallStack (SCS) adalah mode instrumentasi LLVM yang melindungi terhadap alamat pengirim yang menimpa (seperti stack buffer overflows) dengan menyimpan alamat pengirim suatu fungsi ke ShadowCallStack yang dialokasikan secara terpisah dalam prolog fungsi dari fungsi nonleaf dan memuat alamat pengirim dari ShadowCallStack dalam fungsi epilog Alamat pengirim juga disimpan di tumpukan biasa untuk kompatibilitas dengan penggulung, tetapi sebaliknya tidak digunakan. Ini memastikan bahwa serangan yang mengubah alamat pengirim pada tumpukan biasa tidak berpengaruh pada aliran kontrol program.
Pada aarch64, instrumentasi menggunakan register x18
untuk mereferensikan ShadowCallStack, yang berarti bahwa referensi ke ShadowCallStack tidak harus disimpan dalam memori. Ini memungkinkan untuk mengimplementasikan runtime yang menghindari memaparkan alamat ShadowCallStack ke penyerang yang dapat membaca memori arbitrer.
Penerapan
Android mendukung ShadowCallStack untuk kernel dan ruang pengguna.
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 di komponen ruang pengguna, tambahkan baris berikut ke file cetak biru komponen:
sanitize: { scs: true }
SCS mengasumsikan bahwa register x18
dicadangkan untuk menyimpan alamat ShadowCallStack, dan tidak digunakan untuk tujuan lain apa pun. Meskipun semua pustaka sistem dikompilasi untuk mencadangkan register x18
, hal ini berpotensi bermasalah jika SCS diaktifkan untuk komponen ruang pengguna yang beroperasi dengan kode lama dalam proses (misalnya, pustaka yang dapat dimuat oleh aplikasi pihak ketiga), yang dapat mengganggu register x18
. Karena itu, kami hanya menyarankan untuk mengaktifkan SCS di komponen mandiri yang tidak akan dimuat ke biner lama.
Validasi
Tidak ada tes CTS khusus untuk SCS. Sebagai gantinya, pastikan pengujian CTS lulus dengan dan tanpa SCS diaktifkan untuk memverifikasi bahwa SCS tidak memengaruhi perangkat.