Thiết kế Sandbox2 dựa trên các công nghệ đã được thiết lập và nổi tiếng, một khung chính sách và 2 quy trình: Sandbox Executor và Sandboxee.
Các công nghệ liên quan
Các phần sau đây trình bày về những công nghệ tạo nên 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 tính năng ảo hoá ở cấp hệ điều hành. Mặc dù nhiều không gian người dùng chạy độc lập với nhau, nhưng chúng dùng chung một phiên bản kernel. Sandbox2 sử dụng các loại không gian tên sau:
- IPC
- Mạng (trừ phi bạn tắt một cách rõ ràng bằng cách gọi
PolicyBuilder::AllowUnrestrictedNetworking()
) - Mount (sử dụng chế độ xem tuỳ chỉnh của cây hệ thống tệp)
- PID
- Người dùng
- UTS
Đọc thêm về không gian tên Linux trên Wikipedia hoặc trên trang hướng dẫn 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. Giao diện này hỗ trợ các thông báo Loại-Độ dài-Giá trị (TLV), truyền các bộ mô tả tệp và trao đổi thông tin đăng nhập thông qua mã thông báo và các giá trị nhận dạng.
Seccomp-BPF
Sandbox2 dựa vào seccomp-bpf, đây là một tiện ích cho Chế độ điện toán an toàn (seccomp) cho phép sử dụng các quy tắc Berkeley Packet Filter (BPF) để lọc các lệnh gọi hệ thống.
seccomp là một cơ sở của 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
, read
và write
. Nếu một quy trình cố gắng thực thi một syscall khác, thì quy trình đó sẽ bị chấm dứt. Tiện ích seccomp-bpf linh hoạt hơn seccomp. Thay vì cho phép một nhóm syscall cố định, seccomp-bpf chạy một chương trình BPF trên dữ liệu syscall và tuỳ thuộc vào giá trị trả về của chương trình, chương trình này có thể thực thi syscall, bỏ qua syscall và trả về một giá trị giả, chấm dứt quy trình, tạo tín hiệu hoặc thông báo cho trình theo dõi.
Ptrace
Syscall ptrace (theo dõi quy 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 quá trình thực thi của quy trình tracee. Quy trình theo dõi có toàn quyền kiểm soát đối với tracee 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 về 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ì chính sách này chỉ định những hành động mà Sandboxee có thể và không thể thực hiện. 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 lệnh gọi hệ thống mặc định
Chính sách mặc định sẽ chặn các lệnh gọi hệ thống luôn gây 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 mở rộng về lệnh gọi hệ thống
Bạn có thể tạo chính sách syscall mở rộng bằng cách sử dụng lớp PolicyBuilder của chúng tôi. Lớp này xác định một số quy tắc thuận tiện (ví dụ: AllowStaticStartup
, AllowDynamicStartup
, AllowOpen
) mà bạn có thể dùng để cải thiện khả năng đọc chính sách của mình.
Nếu muốn hạn chế thêm các lệnh gọi hệ thống hoặc yêu cầu các quy tắc phức tạp hơn, bạn có thể chỉ định các macro BPF thô bằng AddPolicyOnSyscall
và AddPolicyOnSyscalls
. Ví dụ crc4 sử dụng cơ chế này để hạn chế các đối số cho syscall read
, write
và close
.
Nhìn chung, Chính sách hộp cát càng chặt chẽ thì càng tốt vì việc khai thác mọi lỗ hổng có trong mã sẽ bị chính sách này hạn chế. Nếu bạn có thể chỉ định chính xác những syscall 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 bị giới hạn trong cùng một giới hạn.
Chính sách Hộp cát thực sự nghiêm ngặt có thể từ chối tất cả các lệnh gọi hệ thống, ngoại trừ các lệnh đọc và ghi trên các bộ mô tả tệp đầu vào và đầu ra tiêu chuẩn. Trong hộp cát này, một chương trình có thể nhận dữ liệu đầu vào, xử lý dữ liệu đó và trả về đầu ra. Tuy nhiên, nếu quy trình cố gắng thực hiện bất kỳ lệnh gọi hệ thống nào khác, thì quy trình đó sẽ bị chấm dứt do vi phạm chính sách. Do đó, nếu quy trình bị xâm phạm (người dùng độc hại thực thi mã), thì quy trình đó không thể làm gì nguy hiểm hơn ngoài việc tạo ra đầu ra không hợp lệ (mà trình thực thi và những người khác vẫn cần 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 riêng của Sandboxee về hệ thống tệp. Các tệp riêng 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 liên kết tất cả các thư viện cần thiết theo cách động với tệp thực thi được liên kết động đã chỉ định.
Cờ hiệu 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. Các cờ này chỉ dành cho mục đích thử nghiệm (ví dụ: trong khi tinh chỉnh Chính sách lệnh gọi hệ thống mở rộng).
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
Bộ thực thi hộp cát
Sandbox Executor là một quy trình không tự tạo hộp cát. Đây là quy trình theo dõi ptrace sẽ đính kèm vào Sandboxee (quy trình tracee ptrace). Sandbox Executor cũng thiết lập và chạy một phiên bản Monitor theo dõi Sandboxee và cung cấp thông tin trạng thái.
Sandbox2 cho phép 3 chế độ thực thi: Độc lập, Sandbox2 Forkserver và Custom Forkserver. Nếu bạn sử dụng forkserver, Sandboxee sẽ được tạo dưới dạng một quy trình con của Sandbox Executor. Các chế độ này được giải thích chi tiết tại đây.
Sandboxee
Sandboxee là quy trình chạy trong môi trường hộp cát bị hạn chế do Chính sách hộp cát xác định. Sandbox Executor gửi chính sách đến Sandboxee thông qua IPC. Sau đó, Sandboxee sẽ áp dụng chính sách này. Mọi hành vi vi phạm chính sách sẽ dẫn đến việc chấm dứt quy trình, trừ phi được định cấu hình khác (xem Chính sách hộp cát).