Giải thích về Hộp cát 2

Thiết kế Sandbox2 dựa trên các công nghệ nổi tiếng và đã gặt hái được nhiều thành tựu, một khung chính sách cũng như 2 quy trình: Sandbox Executor và Sandboxee.

Công nghệ liên quan

Các phần sau đây trình bày các công nghệ xây dựng lớp nền tảng cho Sandbox2.

Không gian tên Linux

Không gian tên Linux là một nỗ lực nhằm cung cấp cơ chế ảo hoá ở cấp hệ điều hành. Mặc dù nhiều không gian người dùng có vẻ như chạy độc lập với nhau, nhưng chúng lại dùng chung một thực thể kernel. Sandbox2 sử dụng các loại không gian tên sau:

  • IPC
  • Mạng (trừ phi bị tắt một cách rõ ràng bằng cách gọi PolicyBuilder::AllowUnrestrictedNetworking())
  • Gắn kết (bằng cách sử dụng khung hiển thị tuỳ chỉnh của cây hệ thống tệp)
  • PID
  • Người dùng (trừ phi bị vô hiệu hoá một cách rõ ràng bằng cách gọi PolicyBuilder::AllowUnsafeKeepCapabilities())
  • UTS (UTS)

Đọc thêm về không gian tên Linux trên Wikipedia hoặc trên trang man có liên quan.

IPC

Sandbox2 cho phép trao đổi dữ liệu tuỳ ý giữa Sandbox Executor và Sandboxee không đáng tin cậy. Nền tảng này hỗ trợ các thông báo Kiểu-Độ dài-Giá trị (TLV), truyền chỉ số mô tả tệp và trao đổi thông tin xác thực thông qua mã thông báo và ô điều khiển.

Seccomp-BPF

Sandbox2 dựa trên seccomp-bpf, một phần mở rộng cho Chế độ điện toán bảo mật (seccomp) cho phép sử dụng các quy tắc Bộ lọc gói Berkeley (BPF) để lọc các lệnh gọi hệ thống.

seccomp là một cơ sở nhân Linux hạn chế các lệnh gọi hệ thống của một quy trình để chỉ cho phép exit, sigreturn, readwrite. Nếu một quy trình cố thực thi một lệnh gọi hệ thống khác, thì quy trình đó sẽ bị chấm dứt. Tiện ích seccomp-bpf cho phép linh hoạt hơn seccomp. Thay vì cho phép một tập hợp các lệnh gọi hệ thống cố định, seccomp-bpf chạy chương trình BPF dựa trên dữ liệu lệnh gọi hệ thống và tuỳ thuộc vào giá trị trả về của chương trình, nó có thể thực thi lệnh gọi hệ thống, bỏ qua lệnh gọi hệ thống và trả về một giá trị giả, chấm dứt quá trình, tạo tín hiệu hoặc thông báo cho trình theo dõi.

Ptrace (Ptrace)

syscall ptrace (dấu vết quá trình) cung cấp chức năng cho phép quy trình theo dõi quan sát và kiểm soát việc thực thi quy trình theo dõi. Quá trình theo dõi có toàn quyền kiểm soát đối với dấu vết sau khi được đính kèm. Đọc thêm về ptrace trên Wikipedia hoặc trên trang man có liên quan.

Chính sách Hộp cát

Chính sách hộp cát là phần quan trọng nhất của hộp cát, vì hộp cát này chỉ định các hành động mà Sandboxee có thể và không thể thực thi. Chính sách hộp cát có 2 phần:

  • Chính sách Syscall
  • Thiết lập không gian tên

Chính sách Syscall mặc định

Chính sách mặc định chặn các lệnh gọi hệ thống luôn nguy hiểm và được ưu tiên hơn chính sách mở rộng do người dùng cung cấp.

Chính sách Syscall mở rộng

Bạn có thể tạo chính sách syscall mở rộng bằng lớp PolicyBuilder. Lớp này xác định một số quy tắc tiện lợi (ví dụ: AllowStaticStartup, AllowDynamicStartup, AllowOpen) mà có thể được dùng để cải thiện khả năng đọc chính sách.

Nếu muốn hạn chế thêm các lệnh gọi hệ thống hoặc yêu cầu quy tắc phức tạp hơn, thì bạn có thể chỉ định các macro BPF thô bằng AddPolicyOnSyscallAddPolicyOnSyscalls. Ví dụ về crc4 sử dụng cơ chế này để hạn chế các đối số cho các lệnh gọi hệ thống read, writeclose.

Nhìn chung, Chính sách Hộp cát càng chặt chẽ thì càng tốt vì chính sách này sẽ hạn chế việc khai thác mọi lỗ hổng có trong mã. Nếu bạn có thể chỉ định chính xác những lệnh gọi và đối số cần thiết cho hoạt động bình thường của chương trình, thì mọi kẻ tấn công khai thác lỗ hổng thực thi mã cũng sẽ bị hạn chế ở cùng giới hạn đó.

Chính sách hộp cát thực sự chặt chẽ có thể từ chối tất cả các lệnh gọi hệ thống, ngoại trừ hoạt động đọc và ghi trên các chỉ số mô tả tệp đầu vào và đầu ra tiêu chuẩn. Bên trong hộp cát này, chương trình có thể nhận dữ liệu đầu vào, xử lý thông tin đó rồi trả về kết quả đầu ra. Tuy nhiên, nếu quy trình này cố gắng thực hiện bất kỳ lệnh gọi hệ thống nào khác thì hệ thống sẽ chấm dứt do vi phạm chính sách. Do đó, nếu quy trình này bị xâm phạm (do người dùng độc hại thực thi mã), thì quy trình này không thể làm gì nghiêm trọng hơn việc tạo ra kết quả không hợp lệ (mà trình thực thi và những người khác vẫn cần phải xử lý đúng cách).

Thiết lập không gian tên

Đối tượng PolicyBuilder cũng được dùng để thiết lập chế độ xem cá nhân của Hộp cát về hệ thống tệp. Các tệp đơn lẻ (AddFile / AddFileAt), toàn bộ thư mục (AddDirectory / AddDirectoryAt), cũng như bộ nhớ tạm thời (AddTmpfs) có thể được ánh xạ vào môi trường của Sandboxee. Ngoài ra, bạn có thể dùng AddLibrariesForBinary để tự động ánh xạ tất cả thư viện cần thiết cho tệp thực thi được liên kết động đã chỉ định.

Cờ dòng lệnh

Bạn có thể tắt mọi chính sách Sandbox2 bằng cách chỉ định một trong các cờ dòng lệnh sau. Những cờ này là nhằm mục đích thử nghiệm (ví dụ: trong khi tinh chỉnh Chính sách Syscall mở rộng).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Trình thực thi Sandbox

Trình thực thi hộp cát là một quy trình không có hộp cát. Đó là quy trình đánh dấu ptrace gắn với Sandboxee (quy trình truy vết ptrace). Trình thực thi Hộp cát cũng thiết lập và chạy một thực thể Monitor (Giám sát) giúp theo dõi Sandboxee và cung cấp thông tin trạng thái.

Sandbox2 cho phép ba chế độ thực thi: độc lập, Sandbox2 Forkserver và Custom Forkserver. Nếu bạn sử dụng máy chủ phát triển nhánh, Sandboxee sẽ được tạo dưới dạng một tiến trình con của Trình thực thi hộp cát. Các chế độ này được giải thích chi tiết tại đây.

Người đóng hộp cát

Sandboxee là quá trình chạy trong môi trường hộp cát, bị hạn chế được xác định theo Chính sách hộp cát. Trình thực thi hộp cát gửi chính sách này cho Sandboxee thông qua IPC. Sau đó, Sandboxee sẽ áp dụng chính sách này. Mọi lỗi vi phạm chính sách này đều sẽ dẫn đến việc chấm dứt quy trình, trừ phi được định cấu hình theo cách khác (xem Chính sách hộp cát).