Tôi đã làm việc trên một dự án cá nhân trong C # với mục đích ít nhiều là cho phép người dùng thực thi các tập lệnh được viết bởi người dùng khác và hạn chế quyền của tập lệnh đó. Chương trình của tôi biên dịch các tập lệnh bằng thư viện của bên thứ ba, tạo hộp cát cho chúng bằng các cơ chế bảo mật truy cập mã .NET và đảm bảo rằng chúng chỉ có các quyền mà người dùng muốn cấp cho chúng.
Nói rộng ra, yêu cầu bảo mật của tôi là:
- người dùng sẽ có thể hạn chế quyền truy cập của tập lệnh không đáng tin cậy vào chỉ một số phần nhất định của hệ thống tệp, bao gồm cấm tất cả quyền truy cập hệ thống tệp
- người dùng sẽ có thể hạn chế các kết nối mạng của tập lệnh không tin cậy ở một số địa chỉ IP hoặc tên máy chủ nhất định, bao gồm cấm tất cả các kết nối mạng
- Không sao nếu tập lệnh người dùng quản lý để treo hoặc chấm dứt ứng dụng máy chủ, nhưng tập lệnh người dùng không thể tránh được các hạn chế về quyền (nghĩa là từ chối dịch vụ là được, vi phạm không được)
Tôi đang suy nghĩ về việc cố gắng làm một cái gì đó tương tự trong C ++, như một dạng bài tập cá nhân. Rõ ràng, mọi thứ phức tạp hơn khi chạy mã gốc trực tiếp, ngay cả khi tập lệnh người dùng được viết bằng ngôn ngữ kịch bản như Lua.
Cách tiếp cận đầu tiên tôi có thể nghĩ đến là chèn các hook của riêng tôi vào các chức năng thư viện chuẩn của môi trường script. Ví dụ: nếu ngôn ngữ kịch bản là Lua, thay vì hiển thị io.open bình thường, tôi sẽ phải hiển thị trình bao bọc kiểm tra các đối số chống lại quyền của tập lệnh trước khi chuyển chúng sang triển khai ban đầu.
Mối quan tâm của tôi với cách tiếp cận này là nó làm tăng đáng kể số lượng mã của riêng tôi chịu trách nhiệm bảo mật và do đó, một lỗ hổng bảo mật tiềm ẩn mà tôi tự viết. Nói cách khác, khi làm việc với .NET CAS, tôi có thể tin tưởng rằng Microsoft đã làm tốt công việc của mình trong mã hộp cát, trái ngược với việc phải tin vào mã hộp cát của riêng tôi.
Có bất kỳ sự thay thế nào tôi không biết?