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 trường hợp và cách viết chính sách.
Bạn có thể tìm thấy các ví dụ này trong //sandboxed_api/sandbox2/examples. Hãy xem phần giải thích chi tiết bên dưới.
CRC4
Ví dụ về CRC4 là một phép tính có lỗi có chủ ý về tổng kiểm tra CRC4, 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 đưa vào hộp cát (tức là Sandboxee)
- crc4sandbox.cc: Chương trình hộp cát sẽ chạy chương trình này (tức là trình thực thi).
Cách hoạt động:
- Trình thực thi khởi động Sandboxee từ đường dẫn tệp của nó bằng cách sử dụng
::sandbox2::GetDataDependencyFilePath()
. - Trình thực thi gửi dữ liệu đầu vào đến Sandboxee qua kênh giao tiếp
Comms
bằng cách sử dụngSendBytes()
. - Sandboxee tính toán CRC4 và gửi các câu trả lời của mình trở lại trình thực thi qua kênh giao tiếp
Comms
nhận được câu trả lời đó bằngRecvUint32()
.
Nếu chương trình thực hiện bất kỳ lệnh gọi hệ thống nào khác ngoài việc giao tiếp (read()
và write()
), thì chương trình đó sẽ bị huỷ 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. Điều này có nghĩa là tệp nhị phân đó không biết rằng nó 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ừ đầu vào tiêu chuẩn thành chữ hoa.
- static_sandbox.cc: Trình thực thi có chính sách, hạn mức và sử dụng một bộ mô tả tệp cho đầu vào Sandboxee.
Cách hoạt động:
- Trình thực thi khởi động Sandboxee từ đường dẫn tệp bằng cách sử dụng
GetDataDependencyFilepath
, giống như đối với CRC4. - Thao tác này thiết lập các giới hạn, mở một bộ mô tả tệp trên
/proc/version
và đánh dấu bộ mô tả đó để được ánh xạ trong Sandboxee bằngMapFd
. - 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ị huỷ 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 mà chúng ta không thể sửa đổi các lệnh gọi hệ thống được thực hiện. Thay vào đó, chúng ta có thể khiến các lệnh gọi này thất bại một cách suôn sẻ.
công cụ
Ví dụ về công cụ này vừa là công cụ để phát triển các chính sách của riêng bạn và thử nghiệm với các API Sandbox2, vừa là bản minh hoạ các tính năng của công cụ.
- 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 các quy trình kiểm tra hệ thống tệp, và
- cách trình thực thi có thể chạy Sandboxee không đồng bộ để đọc đầu ra của Sandboxee một cách tăng dần.
Hãy tự mình trải nghiệm:
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 (Blaze)
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
để phân giải và gắn các thư viện bắt buộc cho Sandboxee--sandbox2tool_additional_bind_mounts <PATHS>
để cung cấp thêm các thư mục cho Sandboxee--sandbox2tool_keep_env
để giữ các biến môi trường hiện tại--sandbox2tool_redirect_fd1
để nhậnSTDOUT_FILENO (1)
Sandboxee và xuất ra cục bộ--sandbox2tool_cpu_timeout
để đặt thời gian chờ CPU tính bằng giây--sandbox2tool_walltime_timeout
để đặt thời gian chờ theo thời gian thực tính bằng giây--sandbox2tool_file_size_creation_limit
để đặt kích thước tối đa của các tệp được tạo--sandbox2tool_cwd
để đặt 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 một hộp cát sẽ khởi tạo tệp nhị phân, rồi chờ các yêu cầu fork()
đến từ trình thực thi chính.
Chế độ này có thể tăng hiệu suất so với các loại hộp cát khác, vì ở đây, việc tạo các phiên bản mới của Sandboxee không yêu cầu thực thi các tệp nhị phân mới, mà chỉ cần phân nhánh các tệp nhị phân hiện có
- custom_fork_bin.cc: Máy chủ phân nhánh tuỳ chỉnh, nhận các yêu cầu đến
fork()
(thông quaClient::WaitAndFork
) để tạo Sandboxee mới. - custom_fork_sandbox.cc: Trình thực thi, khởi động một máy chủ phân nhánh tuỳ chỉnh. Sau đó, nó sẽ gửi các yêu cầu đến đó (thông qua các trình thực thi mới) để tạo (thông qua
fork()
) các Sandboxee mới.
mạng
Không gian tên mạng (được bật theo mặc định) 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 giải quyết vấn đề này.
Một kết nối được khởi chạy bên trong trình thực thi và ổ cắm kết quả được truyền qua ::sandbox2::Comms::SendFD()
. Sandboxee nhận được socket bằng cách sử dụng ::sandbox2::Comms::RecvFD()
, sau đó có thể dùng socket 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 chạy trong môi trường 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 này (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ề nội bộ, nó hoạt động theo cách giống hệt như ví dụ trên, nhưng được hiển thị dưới dạng một API thuận tiện hơn.
Sandboxee có thể thiết lập kết nối mạng theo 2 cách:
- automatic – Bằng cách cài đặt một trình xử lý tự động rồi đưa ra các lệnh gọi kết nối thông thường.
- manual – Bằng cách lấy
NetworkProxyClient
và sử dụng trực tiếpNetworkProxyClient::Connect
.
Ví dụ này minh hoạ cả hai phương thức. Chế độ tự động được dùng khi cờ connect_with_handler
được đặt, nếu không, chế độ thủ công sẽ được dùng.
- network_bin.cc: Chương trình mà chúng ta muốn chạy trong môi trường 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 này (trình thực thi).