Ví dụ

Tổng quan

Chúng tôi đã chuẩn bị một số ví dụ để minh hoạ cách sử dụng Sandbox2 trong nhiều tình huống và cách viết chính sách.

Bạn có thể tìm thấy các phiên bản này trong //sandboxed_api/sandbox2/examples và xem nội dung giải thích chi tiết ở bên dưới.

CRC4

Ví dụ CRC4 là một phép tính có chủ đích của một tổng kiểm tra CRC4 bị lỗi, minh hoạ cách tạo hộp cát cho một chương trình khác và cách giao tiếp với chương trình đó.

  • crc4bin.cc: Chương trình mà chúng ta muốn tạo hộp cát (tức là Sandboxee)
  • crc4sandbox.cc: Chương trình hộp cát sẽ chạy mã đó (tức là trình thực thi).

Quy trình như sau:

  1. Trình thực thi khởi động Sandboxee từ đường dẫn tệp bằng ::sandbox2::GetDataDependencyFilePath().
  2. Trình thực thi gửi dữ liệu đầu vào đến Sandboxee qua kênh giao tiếp Comms bằng SendBytes().
  3. Sandboxee tính toán CRC4 và gửi phản hồi của nó trở lại trình thực thi qua kênh liên lạc Comms nhận phản hồi bằng RecvUint32().

Nếu chương trình thực hiện bất kỳ lệnh gọi hệ thống nào khác không phải là giao tiếp (read()write()), thì chương trình đó sẽ bị tắt do vi phạm chính sách.

tĩnh

Ví dụ tĩnh minh hoạ cách tạo hộp cát cho một tệp nhị phân được liên kết tĩnh, chẳng hạn như tệp nhị phân của bên thứ ba mà bạn không có nguồn, có nghĩa là tệp không biết rằng tệp này sẽ được tạo hộp cát.

  • static_bin.cc: Sandboxee là một tệp nhị phân C tĩnh chuyển đổi văn bản ASCII từ phương thức nhập chuẩn sang chữ hoa.
  • static_sandbox.cc: Trình thực thi có chính sách, giới hạn và sử dụng chỉ số mô tả tệp cho dữ liệu đầu vào của Sandboxee.

Quy trình như sau:

  1. Trình thực thi khởi động Sandboxee từ đường dẫn tệp bằng GetDataDependencyFilepath, giống như đối với CRC4.
  2. Hộp cát về quyền riêng tư thiết lập giới hạn, mở chỉ số mô tả tệp trên /proc/version và đánh dấu tệp đó cần được liên kết trong Sandboxee bằng MapFd.
  3. Chính sách này cho phép một số lệnh gọi hệ thống (open) trả về lỗi (ENOENT) thay vì bị tắt do vi phạm chính sách. Điều này có thể hữu ích khi tạo hộp cát cho một chương trình của bên thứ ba nơi chúng ta không thể sửa đổi lệnh gọi hệ thống nào được thực hiện, vì vậy, chúng ta có thể thiết lập không thành công cho các lệnh gọi đó một cách linh hoạt.

công cụ

Ví dụ về công cụ này vừa là một công cụ để phát triển chính sách của riêng bạn, vừa thử nghiệm các API Sandbox2, cũng như minh hoạ các tính năng của công cụ này.

  • sandbox2tool.cc: Trình thực thi minh hoạ:
    • cách chạy một hộp cát nhị phân khác,
    • cách thiết lập tính năng kiểm tra hệ thống tệp, và
    • cách bộ thực thi có thể chạy Sandboxee một cách không đồng bộ để đọc dần kết quả đầu ra của nó.

Hãy thử ngay:

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake + Ninja

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (Màu sáng)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

Cờ:

  • --sandbox2tool_resolve_and_add_libraries để giải quyết và gắn các thư viện cần thiết cho Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> để cung cấp các thư mục bổ sung cho Sandboxee
  • --sandbox2tool_keep_env để giữ lại các biến môi trường hiện tại
  • --sandbox2tool_redirect_fd1 để nhận Sandboxee STDOUT_FILENO (1) và xuất ra cục bộ đó
  • --sandbox2tool_cpu_timeout để đặt thời gian chờ của CPU tính bằng giây
  • --sandbox2tool_walltime_timeout để đặt thời gian chờ của thời gian chờ tính bằng giây
  • --sandbox2tool_file_size_creation_limit để đặt kích thước tối đa của tệp được tạo
  • --sandbox2tool_cwd để thiết lập thư mục đang hoạt động của hộp cát

custom_fork

Ví dụ custom_fork minh hoạ cách tạo hộp cát sẽ khởi chạy tệp nhị phân, sau đó chờ các yêu cầu fork() đến từ trình thực thi mẹ.

Chế độ này có thể giúp tăng hiệu suất tiềm năng liên quan đến các loại hộp cát khác, vì ở đây, việc tạo phiên bản mới của Sandboxees không yêu cầu thực thi các tệp nhị phân mới, chỉ cần phát triển các tệp nhị phân hiện có

  • custom_fork_bin.cc: Máy chủ phát triển nhánh tuỳ chỉnh, nhận yêu cầu đến fork() (thông qua Client::WaitAndFork) để tạo Sandboxees mới.
  • custom_fork_sandbox.cc: Trình thực thi, khởi động một máy chủ phát triển nhánh tuỳ chỉnh. Sau đó, ứng dụng sẽ gửi yêu cầu tới đó (thông qua các executor mới) để tạo (thông qua fork()) các Sandboxees mới.

mạng truyền hình

Không gian tên mạng (được bật theo mặc định) sẽ ngăn quy trình hộp cát kết nối với thế giới bên ngoài. Ví dụ này minh hoạ cách xử lý vấn đề này.

Kết nối được khởi tạo bên trong executor và ổ cắm kết quả được truyền qua ::sandbox2::Comms::SendFD(). Sandboxee nhận được ổ cắm bằng cách sử dụng ::sandbox2::Comms::RecvFD(), sau đó có thể sử dụng ổ cắm này để trao đổi dữ liệu như bình thường.

  • network_bin.cc: Chương trình mà chúng ta muốn tạo hộp cát (tức là Sandboxee).
  • network_sandbox.cc: Chương trình hộp cát sẽ chạy chương trình đó (tức là trình thực thi).

network_proxy

Ví dụ này minh hoạ một cách khác để xử lý không gian tên mạng. Về phía bên trong, API này hoạt động giống hệt như ví dụ trên, nhưng được hiển thị dưới dạng API tiện lợi hơn.

Sandboxee có thể thiết lập kết nối mạng theo 2 cách:

  • tự động – Bằng cách cài đặt một trình xử lý tự động rồi thực hiện các cuộc gọi kết nối thông thường.
  • thủ công – Bằng cách lấy NetworkProxyClient và trực tiếp sử dụng NetworkProxyClient::Connect.

Ví dụ này cho thấy cả hai phương pháp. Chế độ tự động được dùng khi cờ connect_with_handler được đặt, nếu không thì chế độ thủ công sẽ được sử dụng.

  • network_bin.cc: Chương trình mà chúng ta muốn tạo hộp cát (tức là Sandboxee).
  • network_sandbox.cc: Chương trình hộp cát sẽ chạy chương trình đó (trình thực thi).