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

Thiết kế của Sandbox2 được xây dựng dựa trên các công nghệ đã biết và đã được thiết lập, một khung chính sách và hai quy trình: Trình thực thi hộp cát và Sandboxee.

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ó vẻ độc lập với nhau, nhưng chúng dùng chung một thực thể nhân. 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 (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 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. Giao thức này hỗ trợ các thông báo Loại-Độ 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à tên người dùng.

Seccomp-BPF

Sandbox2 dựa vào seccomp-bpf, một tiện ích của Chế độ điện toán bảo mật (seccomp) cho phép sử dụng các quy tắc của 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 giúp 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 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 lệnh gọi hệ thống cố định, seccomp-bpf chạy một chương trình BPF 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, seccomp-bpf 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 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 hướng dẫn 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à Hộp cát 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 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 tiện lợi (ví dụ: AllowStaticStartup, AllowDynamicStartup, AllowOpen) có thể dùng để cải thiện khả năng đọc chính sách của bạn.

Trong hầu hết các trường hợp, bạn nên bắt đầu bằng DefaultPolicyBuilder (sapi::Sandbox2Config::DefaultPolicyBuilder()), trả về một PolicyBuilder được định cấu hình sẵn với chính sách cơ sở cho các thư viện đơn luồng thông thường và có thể tuỳ chỉnh thêm bằng các quy tắc bổ sung (chẳng hạn như .AllowDynamicStartup() và .AddLibrariesForBinary() khi tạo hộp cát cho tệp nhị phân). Trong Sandboxed API (SAPI), DefaultPolicyBuilder() được sapi::SandboxConfig::DefaultConfig() sử dụng cùng với sapi::SandboxConfig::DefaultFlags(), sapi::SandboxConfig::DefaultEnvironmentVariables() và sapi::Sandbox2Config::DefaultLimits(). Bạn chỉ nên tạo trực tiếp PolicyBuilder khi không thể sử dụng DefaultPolicyBuilder() hoặc khi cần có cấu hình chính xác.

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ụ về crc4 sử dụng cơ chế này để hạn chế các đối số cho lệnh gọi hệ thống 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 bất kỳ lỗ hổng nào có trong mã sẽ bị chính sách này hạn chế. Nếu có thể chỉ định chính xác những lệnh gọi hệ thống và đối số nào 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 phạm vi tương tự.

Chính sách hộp cát thực sự chặt chẽ có thể từ chối tất cả lệnh gọi hệ thống, ngoại trừ các lệnh đọc và ghi trên chỉ số mô tả tệp đầu vào và đầu ra chuẩn. Bê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ề kết quả đầ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 nhập (người dùng độc hại thực thi mã), thì quy trình này 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 lẻ 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 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 dành cho mục đích thử nghiệm (ví dụ: trong khi tinh chỉnh Chính sách 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

Trình thực thi hộp cát là một quy trình không nằm trong hộp cát. Đây là quy trình theo dõi ptrace đính kèm vào Sandboxee (quy trình theo dõi 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 (Trình giám sát) để theo dõi Sandboxee và cung cấp thông tin về 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. Mọi lỗi 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 theo cách khác (xem Chính sách hộp cát).