Tính toàn vẹn của luồng điều khiển (CFI) là một cơ chế bảo mật không cho phép thay đổi biểu đồ luồng điều khiển ban đầu của tệp nhị phân đã biên dịch, khiến việc thực hiện các cuộc tấn công như vậy trở nên khó khăn hơn đáng kể.
Kể từ Android 9, bạn có thể bật CFI trong kernel.
Kernel Linux có 2 cách triển khai CFI:
- đối với Linux 6.0 trở xuống, Clang CFI dựa vào Clang LTO
- đối với Linux 6.1 trở lên, Clang KCFI
Clang CFI yêu cầu biên dịch bằng tính năng Tối ưu hoá thời gian liên kết (LTO). LTO giữ nguyên biểu diễn mã bit LLVM của các tệp đối tượng cho đến thời gian liên kết, cho phép trình biên dịch suy luận tốt hơn về những hoạt động tối ưu hoá có thể thực hiện. Trong quá trình thử nghiệm trên Android, việc kết hợp LTO và CFI dẫn đến chi phí không đáng kể cho kích thước mã và hiệu suất. Tuy nhiên, việc bật LTO sẽ làm tăng đáng kể thời gian xây dựng kernel.
Clang KCFI không yêu cầu LTO, vì vậy, các kernel Android gần đây sẽ được hưởng lợi từ CFI mà không phải chịu chi phí LTO trong thời gian tạo.
Triển khai
CFI được kiểm soát bằng tuỳ chọn CONFIG_CFI_CLANG, cho phép bật Clang CFI hoặc Clang KCFI.
Để biết thêm thông tin kỹ thuật về CFI và cách xử lý các lượt kiểm tra khác về quyền kiểm soát chuyển tiếp, hãy xem tài liệu thiết kế LLVM. KCFI được gọi là -fsanitize=kcfi.
Khắc phục sự cố
Sau khi bật, hãy khắc phục mọi lỗi không khớp về loại có thể xảy ra với trình điều khiển của chúng. Lệnh gọi hàm gián tiếp thông qua con trỏ hàm không tương thích sẽ kích hoạt CFI. Khi phát hiện lỗi CFI, kernel sẽ in ra cảnh báo bao gồm cả hàm được gọi và dấu vết ngăn xếp dẫn đến lỗi. Hãy khắc phục lỗi này bằng cách đảm bảo con trỏ hàm luôn có cùng loại với hàm được gọi.
Để hỗ trợ gỡ lỗi các lỗi CFI, hãy bật CONFIG_CFI_PERMISSIVE. Tuỳ chọn này sẽ in ra cảnh báo thay vì gây ra lỗi kernel. Bạn không được sử dụng chế độ cho phép trong phiên bản chính thức.
Xác nhận kết quả
Hiện tại, không có bài kiểm thử CTS nào dành riêng cho CFI. Thay vào đó, hãy đảm bảo rằng các bài kiểm thử CTS vượt qua khi bật và tắt CFI để xác minh rằng CFI không ảnh hưởng đến thiết bị.