2 điểm bởi GN⁺ 2024-10-27 | 1 bình luận | Chia sẻ qua WhatsApp

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_creatememfd_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_sealapply_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_creatememfd_secret để bảo vệ bộ nhớ.

1 bình luận

 
GN⁺ 2024-10-27
Ý 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

    • Bản thân cơ chế này có vẻ hợp lý, nhưng đáng ngạc nhiên là nó chưa tồn tại sẵn trong kernel
  • 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

    • Điều này có nghĩa là nó không thể dùng cho các trang được cấp phát lúc chạy, nên không thể sử dụng trừ khi có ý định giữ chúng suốt vòng đời của toàn bộ tiến trình
    • Có người đặt câu hỏi liệu điều này có nghĩa là nó không thể dùng cho bộ nhớ như JS sandbox hay không
    • Không quá quen với cách Chrome quản lý bộ nhớ/tiến trình nên không chắc vì sao đây lại không thành vấn đề
  • 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

    • Những nỗ lực vá víu cho các hệ thống cũ đang cản trở tiến bộ của điện toán và đẩy hàng tỷ người vào rủi ro
    • Vẫn có lỗi ở cấp kiến trúc, nhưng phần mềm cũng chưa tận dụng tốt các tính năng hiện có
  • Có câu hỏi liệu có thể vô hiệu hóa syscall mseal bằng mẹo LD_PRELOAD hay không

  • Nguyê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_addr chứ không phải unsigned start addr

  • OpenBSD đã 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