Phân tích chuyên sâu về lời gọi hệ thống mseal mới của Linux
mseal là một lời gọi hệ thống mới được giới thiệu trong Linux kernel phiên bản 6.10, cung cấp tính năng "niêm phong bộ nhớ" để bảo vệ bộ nhớ.
- Lời gọi hệ thống này khiến một vùng nhớ trở nên bất biến trước các chỉnh sửa trái phép trong quá trình thực thi chương trình, ngăn kẻ tấn công thay đổi quyền bộ nhớ hoặc thao túng bố cục bộ nhớ.
mseal nhằm ngăn chặn việc thực thi mã của kẻ tấn công từ xa, khác với memfd_create và memfd_secret vốn dùng để phòng thủ trước kẻ tấn công cục bộ nhắm vào dữ liệu nhạy cảm được lưu trong bộ nhớ.
Cách mseal hoạt động
- Chữ ký hàm của
mseal khá đơn giản: nhận địa chỉ bắt đầu và độ dài rồi niêm phong vùng nhớ tương ứng.
- Hàm
do_mseal khóa vùng nhớ, sau đó dùng check_mm_seal và apply_mm_seal để kiểm tra tính hợp lệ và áp dụng niêm phong cho vùng nhớ.
- Với vùng nhớ đã niêm phong, các thay đổi quyền, hủy ánh xạ, thay đổi kích thước thông qua các lời gọi hệ thống như
mprotect, munmap, mremap đều không thể thực hiện.
Các kỹ thuật tấn công mà mseal phòng vệ
- Tăng cường NX:
mseal ngăn không cho thay đổi quyền thực thi của VMA, từ đó chặn các cuộc tấn công dựa trên shellcode.
- Giảm thiểu tấn công chỉ dùng dữ liệu dựa trên unmap:
mseal ngăn việc giải phóng và ánh xạ lại vùng nhớ một cách tùy ý, qua đó chặn các cuộc tấn công chỉ dùng dữ liệu.
Tăng cường phần mềm với mseal
mseal có thể tăng cường bảo mật bằng cách niêm phong các vùng nhớ cụ thể của phần mềm.
- Nhà phát triển có thể dùng
mseal để niêm phong có chọn lọc các vùng nhớ có thể chứa dữ liệu không đáng tin cậy.
- Khi việc tích hợp với glibc tiến triển, khả năng sẽ có thêm tính năng niêm phong tự động.
Tổng kết của GN⁺
mseal là một tính năng bảo mật mới được đưa vào Linux kernel, giúp ngăn thực thi mã của kẻ tấn công từ xa bằng cách niêm phong các vùng nhớ.
- Không giống các cơ chế bảo vệ bộ nhớ hiện có, lời gọi hệ thống này ngăn việc thay đổi quyền bộ nhớ và hủy ánh xạ, từ đó chặn các cuộc tấn công chỉ dùng dữ liệu.
- Việc đưa
mseal vào có vai trò quan trọng trong việc tăng cường bảo mật phần mềm, và khi tích hợp với glibc, nhiều trường hợp sử dụng hơn nữa được kỳ vọng sẽ xuất hiện.
- Các dự án khác có chức năng tương tự gồm
memfd_create và memfd_secret để bảo vệ bộ nhớ.
1 bình luận
Ý kiến trên Hacker News
Có ý kiến nhắc đến một "cuộc tranh luận nảy lửa" trên danh sách thư của kernel. Có người thắc mắc liệu ai trong cuộc có thể tóm tắt các phản đối và lo ngại hay không, vì họ có xu hướng tránh danh sách thư này do quá căng thẳng
Chrome muốn lời gọi này, nhưng không thể bỏ niêm phong các trang đã được niêm phong vì kẻ tấn công có thể ánh xạ lại chúng với các cờ khác
Có cung cấp liên kết đến
mseal()và các bài viết tiếp theo về nóCó cảm giác đáng buồn khi dù các kiến trúc hiện đại (x86_64) có nhiều tính năng thúc đẩy lập trình an toàn, hệ điều hành vẫn phải triển khai những lời gọi như thế này
Có câu hỏi liệu có thể vô hiệu hóa syscall
msealbằng mẹo LD_PRELOAD hay khôngNguyên mẫu
mseal()trong bài viết không đúng về mặt cú pháp. Đối số đầu tiên phải làunsigned long start_addrchứ không phảiunsigned start addrOpenBSD đã có tính năng này từ lâu. Có người đặt câu hỏi vì sao đến giờ Linux mới đưa vào