ShadowCallStack

ShadowCallStack (SCS) adalah mode instrumentasi LLVM yang melindungi terhadap penimpaan alamat pengirim (seperti buffer overflow tumpukan) dengan menyimpan alamat pengirim suatu fungsi ke ShadowCallStack yang dialokasikan secara terpisah dalam prolog fungsi fungsi nonleaf dan memuat alamat pengirim dari ShadowCallStack dalam fungsi tersebut epilog. Alamat pengirim juga disimpan di tumpukan biasa untuk kompatibilitas dengan unwinder, namun sebaliknya tidak digunakan. Hal ini memastikan bahwa serangan yang mengubah alamat pengirim pada tumpukan reguler tidak berpengaruh pada aliran kontrol program.

Pada aarch64, instrumentasi menggunakan register x18 untuk mereferensikan ShadowCallStack, artinya referensi ke ShadowCallStack tidak harus disimpan dalam memori. Hal ini memungkinkan penerapan runtime yang menghindari pemaparan alamat ShadowCallStack kepada penyerang yang dapat membaca memori sewenang-wenang.

Penerapan

Android mendukung ShadowCallStack untuk kernel dan ruang pengguna.

Mengaktifkan SCS untuk kernel

Untuk mengaktifkan ShadowCallStack pada 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 berasumsi bahwa register x18 dicadangkan untuk menyimpan alamat ShadowCallStack, dan tidak digunakan untuk tujuan lain apa pun. Meskipun seluruh pustaka sistem dikompilasi untuk memesan register x18 , hal ini berpotensi menjadi masalah jika SCS diaktifkan untuk komponen ruang pengguna yang berinteroperasi dengan kode lama yang sedang dalam proses (misalnya, pustaka yang dapat dimuat oleh aplikasi pihak ketiga), yang mungkin mengganggu daftar x18 . Oleh karena itu, kami hanya menyarankan untuk mengaktifkan SCS pada komponen mandiri yang tidak akan dimuat ke biner lama.

Validasi

Tidak ada tes CTS khusus untuk SCS. Sebaliknya, pastikan pengujian CTS lulus dengan dan tanpa mengaktifkan SCS untuk memverifikasi bahwa SCS tidak memengaruhi perangkat.