ShadowCallStack

ShadowCallStack (SCS) là chế độ thiết bị LLVM bảo vệ chống ghi đè địa chỉ trả về (như tràn bộ đệm ngăn xếp) bằng cách lưu địa chỉ trả về của hàm vào ShadowCallStack được phân bổ riêng trong prolog hàm của các hàm không có lá và tải địa chỉ trả về từ ShadowCallStack trong hàm phần kết. Địa chỉ trả về cũng được lưu trữ trên ngăn xếp thông thường để tương thích với các bộ giải mã, nhưng không được sử dụng. Điều này đảm bảo rằng các cuộc tấn công sửa đổi địa chỉ trả về trên ngăn xếp thông thường không ảnh hưởng đến luồng điều khiển chương trình.

Trên aarch64, thiết bị đo sử dụng thanh ghi x18 để tham chiếu ShadowCallStack, nghĩa là các tham chiếu đến ShadowCallStack không cần phải được lưu trữ trong bộ nhớ. Điều này giúp có thể triển khai thời gian chạy tránh để lộ địa chỉ của ShadowCallStack cho những kẻ tấn công có thể đọc bộ nhớ tùy ý.

Thực hiện

Android hỗ trợ ShadowCallStack cho cả kernel và không gian người dùng.

Kích hoạt SCS cho kernel

Để bật ShadowCallStack cho kernel, hãy thêm dòng sau vào tệp cấu hình kernel:

CONFIG_SHADOW_CALL_STACK=y

Kích hoạt SCS trong không gian người dùng

Để bật ShadowCallStack trong các thành phần không gian người dùng, hãy thêm các dòng sau vào tệp bản thiết kế của thành phần:

sanitize: {
  scs: true
}

SCS giả định rằng thanh ghi x18 được dành riêng để lưu trữ địa chỉ của ShadowCallStack và không được sử dụng cho bất kỳ mục đích nào khác. Mặc dù tất cả các thư viện hệ thống được biên dịch để dự trữ thanh ghi x18 , nhưng điều này có thể có vấn đề nếu SCS được bật cho các thành phần không gian người dùng tương tác với mã kế thừa trong quá trình (ví dụ: các thư viện có thể được tải bởi các ứng dụng của bên thứ ba), điều này có thể làm tắc nghẽn thanh ghi x18 . Vì vậy, chúng tôi chỉ khuyên bạn nên bật SCS trong các thành phần độc lập sẽ không được tải vào các tệp nhị phân cũ.

Thẩm định

Không có thử nghiệm CTS cụ thể cho SCS. Thay vào đó, hãy đảm bảo rằng các bài kiểm tra CTS vượt qua khi bật và không bật SCS để xác minh rằng SCS không ảnh hưởng đến thiết bị.