Mới đây, tác giả của thư viện chuẩn Cosmopolitan C và nền tảng Redbean đã công bố việc triển khai cơ chế cách ly pledge() cho Linux.
Ban đầu được phát triển bởi dự án OpenBSD , pledge cho phép bạn chọn lọc cấm các ứng dụng truy cập vào các lệnh gọi hệ thống không được sử dụng (tạo danh sách trắng các lệnh gọi hệ thống cho ứng dụng và cấm các lệnh gọi khác). Không giống như các cơ chế kiểm soát truy cập lệnh gọi hệ thống có sẵn trong Linux, chẳng hạn như seccomp, pledge được thiết kế từ đầu để thân thiện với người dùng nhất có thể.
Sáng kiến thất bại trong việc cô lập các ứng dụng trong môi trường cơ sở OpenBSD bằng cách sử dụng cơ chế systrace đã chứng minh rằng việc cô lập ở cấp độ các lệnh gọi hệ thống riêng lẻ là quá phức tạp và tốn thời gian.
Một phương án khác được đề xuất là cam kết cho phép tạo ra các quy tắc cách ly mà không cần đi vào chi tiết và thao tác với các lớp truy cập đã được chuẩn bị sẵn.
Ví dụ: các lớp được cung cấp là stdio (đầu vào / đầu ra), rpath (chỉ đọc tệp), wpath (ghi tệp), cpath (tạo tệp), tmppath (làm việc với tệp tạm thời), inet (ổ cắm mạng), unix (ổ cắm unix ), dns (phân giải DNS), getpw (đọc quyền truy cập vào cơ sở dữ liệu người dùng), ioctl (gọi ioctl), proc (kiểm soát quy trình), thực thi (quy trình khởi động) và id (kiểm soát quyền).
Các quy tắc làm việc với các lệnh gọi hệ thống được quy định dưới dạng các chú thích bao gồm danh sách các lớp lệnh gọi hệ thống được cho phép và một mảng các đường dẫn tệp mà quyền truy cập được cho phép. Sau khi biên dịch và chạy ứng dụng đã sửa đổi, nhân hệ điều hành sẽ đảm nhiệm việc giám sát việc tuân thủ các quy tắc đã quy định.
Riêng biệt, việc triển khai cam kết cho FreeBSD đang được phát triển, được phân biệt bởi khả năng cô lập các ứng dụng mà không thực hiện thay đổi đối với mã của chúng, trong khi trong OpenBSD, lời kêu gọi cam kết nhằm mục đích tích hợp chặt chẽ với môi trường cơ sở và bổ sung các chú thích vào mã của mỗi người.
Cam kết giống như trái cấm mà tất cả chúng ta đều thèm muốn khi ông chủ nói rằng chúng ta nên sử dụng những thứ như Linux. Tại sao lại là vấn đề đó? Đó là bởi vì commit () thực sự làm cho việc bảo mật trở nên dễ hiểu. Linux chưa bao giờ thực sự có một lớp bảo mật mà người bình thường có thể hiểu được.
Các nhà phát triển của bản port Pledge cho Linux đã noi theo FreeBSD và thay vì thay đổi mã nguồn, họ đã chuẩn bị một tiện ích bổ sung từ pledge.com cho phép bạn áp dụng các hạn chế mà không cần sửa đổi mã ứng dụng của mình. Ví dụ, để chạy tiện ích curl chỉ với quyền truy cập vào các lớp gọi hệ thống stdio, rpath, inet và threadstdio, chỉ cần chạy `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.
Tiện ích này hoạt động trên tất cả các bản phân phối Linux từ RHEL6 trở lên và không yêu cầu quyền truy cập root. Ngoài ra, dựa trên thư viện cosmopolitan, một API được cung cấp để quản lý các hạn chế trong mã chương trình C, cho phép, trong số những thứ khác, tạo ra các vùng bảo mật để hạn chế quyền truy cập một cách có chọn lọc vào các chức năng ứng dụng cụ thể.
Đã có một vài nhà phát triển trong quá khứ đã thử điều này. Tôi sẽ không nêu tên, vì hầu hết các dự án này chưa bao giờ được hoàn thành. Khi nói đến SECOMP, các hướng dẫn trực tuyến chỉ giải thích cách lập danh sách trắng các cuộc gọi hệ thống, vì vậy hầu hết mọi người đều mất hứng thú trước khi tìm ra cách lọc các đối số. Các dự án tiến lên cũng có những sơ suất như cho phép thay đổi các bit setuid / setgid / stick. Do đó, không có lựa chọn thay thế nào hiện tại nên được sử dụng. Tôi nghĩ rằng nỗ lực này đưa chúng ta đến gần với việc cam kết () hơn bao giờ hết.
Việc triển khai không yêu cầu thay đổi hạt nhân: các ràng buộc tiện ích được dịch thành các quy tắc SECCOMP BPF và được xử lý bằng cách sử dụng cơ chế cách ly cuộc gọi hệ thống gốc của Linux. Ví dụ: gọi hứa hẹn ("stdio rpath", 0) sẽ chuyển đổi thành bộ lọc BPF
Cuối cùng, nếu bạn muốn tìm hiểu thêm, bạn có thể xem chi tiết tại liên kết sau.