ShadowCallStack (SCS) là một 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 một hàm vào ShadowCallStack được phân bổ riêng trong phần mở đầu chức năng của các chức năng nonleaf và tải địa chỉ trả về từ ShadowCallStack trong chức năng epilog. Đị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 trình giải nén, nhưng nếu không thì 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 đạc sử dụng thanh ghi x18
để tham chiếu đến ShadowCallStack, có 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 làm cho nó có thể triển khai thời gian chạy để tránh làm 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ả nhân và không gian người dùng.
Bật SCS cho hạt nhân
Để bật ShadowCallStack cho hạt nhân, hãy thêm dòng sau vào tệp cấu hình hạt nhân:
CONFIG_SHADOW_CALL_STACK=y
Bậ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 kế hoạch chi tiết của thành phần:
sanitize: { scs: true }
SCS giả định rằng sổ đăng ký 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. Trong khi tất cả các thư viện hệ thống được biên dịch để dành riêng cho thanh ghi x18
, điều này có khả năng xảy ra 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
. Do đó, 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 kế thừa.
Thẩm định
Không có bài kiểm tra CTS nào dành riêng cho SCS. Thay vào đó, hãy đảm bảo rằng các bài kiểm tra CTS vượt qua khi có và không bật SCS để xác minh rằng SCS không ảnh hưởng đến thiết bị.