Tôi có thể sử dụng chuỗi tin nhắn không?
Có, Sandbox2 có hỗ trợ các luồng.
Tất cả các luồng đều phải được cách ly
Do cách Linux hoạt động, chính sách seccomp-bpf chỉ được áp dụng cho luồng hiện tại: điều này có nghĩa là chính sách không được áp dụng cho các luồng hiện có khác, nhưng các luồng trong tương lai sẽ kế thừa chính sách này:
- Nếu bạn đang sử dụng Sandbox2 ở chế độ đầu tiên, trong đó tính năng tạo hộp cát được bật trước
execve()
, tất cả các luồng sẽ kế thừa chính sách và không có vấn đề gì. Đây là chế độ ưu tiên để tạo hộp cát. - Nếu bạn đang sử dụng chế độ thứ hai, trong đó trình thực thi có
set_enable_sandbox_before_exec(false)
và Sandboxee cho trình thực thi biết thời điểm muốn được đưa vào hộp cát bằngSandboxMeHere()
, hãy đảm bảo bộ lọc được áp dụng cho tất cả các luồng. Nếu không, sẽ có nguy cơ xảy ra trường hợp thoát khỏi hộp cát: mã độc có thể di chuyển từ một luồng được đưa vào hộp cát sang một luồng không được đưa vào hộp cát.
Tôi nên biên dịch Sandboxee như thế nào?
So với một tệp thực thi được liên kết tĩnh, việc biên dịch sandboxee thành một tệp thực thi được liên kết động sẽ dẫn đến sự gia tăng đáng kể về các lệnh gọi hệ thống (ví dụ: open
/openat
, mmap
, v.v.) cần được đưa vào danh sách cho phép. Tất cả các lệnh gọi hệ thống bổ sung này đều bắt buộc do lệnh gọi trình liên kết động trong thời gian chạy để tải các thư viện dùng chung.
Tuy nhiên, khi xem xét các sandboxee được liên kết tĩnh: Mặc dù cần ít syscall hơn để đưa vào danh sách cho phép, nhưng cũng có những tác động đến bảo mật; entropy heap ASLR giảm (từ 30 bit xuống 8 bit), điều này khiến các lỗ hổng bảo mật dễ bị khai thác hơn.
Đây là một tình huống khó xử mà về cơ bản có thể được rút gọn thành:
- Động: ASLR heap tốt, có thể khó thực thi mã ban đầu hơn nhưng phải trả giá bằng chính sách hộp cát kém hiệu quả hơn, có thể dễ dàng thoát ra hơn.
- Tĩnh: ASLR heap kém, có thể dễ dàng thực thi mã ban đầu hơn nhưng chính sách hộp cát hiệu quả hơn, có thể khó thoát ra hơn.
Trước đây, các tệp nhị phân được liên kết tĩnh không hỗ trợ mã độc lập với vị trí (pie
). Ngoài ra, Bazel đã thêm pie
theo mặc định. Để có thể xác định một bộ lọc syscall chặt chẽ, bạn phải ghi đè giá trị mặc định của Bazel.
Trình biên dịch đã được cải thiện qua nhiều năm và hiện hỗ trợ lựa chọn static-pie
.
Với lựa chọn này, trình biên dịch được hướng dẫn tạo mã độc lập với vị trí, nhưng so với pie
, lựa chọn này hiện cũng bao gồm tất cả các thư viện được liên kết tĩnh. Về mặt bảo mật, static-pie
vẫn làm giảm entropy ASLR (từ 30 bit xuống 14 bit), nhưng đây là một điểm cải tiến so với tình huống trước đó mà không có pie
.
Vì Bazel thêm pie
theo mặc định và tĩnh không tương thích với pie
, hãy cân nhắc sử dụng cờ lựa chọn của trình liên kết để truyền cờ trình liên kết -static-pie
đến quy tắc cc_binary và ghi đè giá trị mặc định:
linkstatic = 1,
linkopts=["-static-pie"],
Để xem ví dụ về các lựa chọn này, hãy xem ví dụ tĩnh BUILD: static_bin.cc được liên kết tĩnh với static-pie
, nhờ đó có thể có một chính sách syscall rất chặt chẽ. Điều này cũng rất hữu ích cho việc tạo hộp cát cho các tệp nhị phân của bên thứ ba.
Tôi có thể tạo hộp cát cho tệp nhị phân x86 32 bit không?
Sandbox2 chỉ có thể tạo hộp cát cho cùng một cấu trúc mà nó được biên dịch.
Ngoài ra, tính năng hỗ trợ x86 32 bit đã bị xoá khỏi Sandbox2. Nếu bạn cố gắng sử dụng trình thực thi x86 64 bit để tạo hộp cát cho tệp nhị phân x86 32 bit hoặc tệp nhị phân x86 64 bit thực hiện lệnh gọi hệ thống 32 bit (thông qua int 0x80), cả hai sẽ tạo ra một lỗi vi phạm hộp cát mà bạn có thể xác định bằng nhãn kiến trúc [X86-32].
Lý do dẫn đến hành vi này là do số lượng lệnh gọi hệ thống khác nhau giữa các cấu trúc và vì chính sách lệnh gọi hệ thống được viết trong cấu trúc của trình thực thi, nên sẽ rất nguy hiểm nếu cho phép một cấu trúc khác cho Sandboxee. Thật vậy, điều này có thể dẫn đến việc cho phép một lệnh gọi hệ thống có vẻ vô hại, nhưng trên thực tế, điều đó có nghĩa là một lệnh gọi hệ thống khác có hại hơn có thể mở hộp cát để thoát.
Có giới hạn nào về số lượng hộp cát mà quy trình thực thi có thể yêu cầu không?
Đối với mỗi phiên bản Sandboxee (quy trình mới được tạo từ forkserver), một luồng mới sẽ được tạo – đó là nơi có giới hạn.
Người thực thi có thể yêu cầu tạo nhiều Sandbox không?
Không. Có mối quan hệ 1:1 – một phiên bản Executor lưu trữ PID của Sandboxee, quản lý phiên bản Comms cho phiên bản Sandbox, v.v.
Tại sao tôi nhận được thông báo "Function not implemented" (Chức năng chưa được triển khai) trong forkserver.cc?
Sandbox2 chỉ hỗ trợ chạy trên các nhân tương đối mới. Ngưỡng hiện tại của chúng tôi là nhân 3.19, mặc dù ngưỡng này có thể thay đổi trong tương lai. Lý do là vì chúng tôi đang sử dụng các tính năng tương đối mới của nhân, bao gồm cả không gian tên người dùng và seccomp có cờ TSYNC.
Nếu bạn đang chạy trên prod, thì đây không phải là vấn đề, vì hầu hết toàn bộ nhóm đều đang chạy một nhân hệ điều hành đủ mới. Nếu bạn gặp vấn đề về việc này, vui lòng liên hệ với chúng tôi.
Nếu bạn đang chạy trên Debian hoặc Ubuntu, thì việc cập nhật nhân cũng dễ dàng như chạy:
sudo apt-get install linux-image-<RECENT_VERSION>