ShadowCallStack

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.