Câu hỏi thường gặp

Tôi có thể sử dụng luồng không?

Có, các luồng được hỗ trợ trong Sandbox2.

Tất cả các chuỗi đều phải được tạo hộp cát

Do cách hoạt động của Linux, chính sách seccomp-bpf chỉ được áp dụng cho chuỗi hiện tại: điều này có nghĩa là chính sách này không được áp dụng cho các chuỗi hiện có khác, nhưng các chuỗi sau này sẽ kế thừa chính sách này:

  • Nếu bạn đang sử dụng Sandbox2 ở chế độ đầu tiên (hộp cát được bật trước execve()), thì tất cả các luồng sẽ kế thừa chính sách này và không có vấn đề gì. Đây là chế độ hộp cát ưu tiên.
  • 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 sẽ thông báo cho trình thực thi này khi muốn được tạo hộp cát bằng SandboxMeHere(), hãy đảm bảo bộ lọc được áp dụng cho tất cả các luồng. Nếu không, có nguy cơ thoát hộp cát: mã độc hại có thể di chuyển từ một luồng có hộp cát sang một luồng không có hộp cát.

Tôi nên biên soạn Sandboxee của mình như thế nào?

Nếu không cẩn thận, bạn sẽ dễ bị kế thừa nhiều phần phụ thuộc và hiệu ứng phụ (syscall thêm, quyền truy cập vào tệp hoặc thậm chí là kết nối mạng) khiến hộp cát trở nên khó khăn hơn (theo dõi tất cả tác dụng phụ) và kém an toàn hơn (vì chính sách syscall và tệp rộng hơn). Một số tuỳ chọn biên dịch có thể giúp giảm thiểu các vấn đề như vậy:

  • Biên dịch tĩnh tệp nhị phân Sandboxee để tránh hoạt động liên kết động, việc này sử dụng nhiều hệ thống (open/openat, mmap, v.v.).
  • Vì Bazel thêm pie theo mặc định nhưng tĩnh không tương thích với hàm này, hãy cân nhắc sử dụng cờ tính năng để buộc tắt thông qua các tuỳ chọn sau trong quy tắc cc_binary:

    linkstatic = 1,
    features = [
        "fully_static_link",  # link libc statically
        "-pie",
    ],
    

Tuy nhiên: Việc sử dụng phương thức tĩnh có nhược điểm là giảm entropy vùng nhớ khối xếp ASLR (từ 30 bit xuống 8 bit), giúp khai thác dễ dàng hơn. Quyết định cẩn thận lựa chọn ưu tiên tuỳ thuộc vào việc triển khai hộp cát và chính sách của bạn:

  • không tĩnh: ASLR của vùng nhớ khối xếp hiệu quả, có thể khó thực thi mã ban đầu hơn, nhưng với điều kiện là chính sách hộp cát kém hiệu quả, có thể dễ bị thoát hơn.
  • static: ASLR của vùng nhớ khối xếp không hợp lệ, có thể dễ dàng thực thi mã ban đầu hơn nhưng có chính sách hộp cát hiệu quả hơn, có thể khó thoát ra hơn.

Đây là một lựa chọn không may khi thực hiện vì trình biên dịch không hỗ trợ PIE tĩnh (Position Independent Executables). PIE được triển khai bằng cách đặt tệp nhị phân là đối tượng động và trình tải động sẽ ánh xạ tệp nhị phân này tại một vị trí ngẫu nhiên trước khi thực thi. Sau đó, vì theo truyền thống, vùng nhớ khối xếp được đặt ở một độ lệch ngẫu nhiên sau địa chỉ cơ sở của tệp nhị phân (và được mở rộng bằng brk syscall), điều này có nghĩa là đối với các tệp nhị phân tĩnh, entropy của vùng nhớ khối xếp ASLR chỉ là độ lệch này vì không có PIE.

Để tham khảo ví dụ về các tuỳ chọn biên dịch này, hãy xem ví dụ tĩnh về BUILD.bazel: static_bin.cc được biên dịch tĩnh, điều này cho phép chúng ta có chính sách syscall rất chặt chẽ. Tính năng này cũng hoạt động tốt cho tệp nhị phân của bên thứ ba trong hộp cát.

Tôi có thể tạo hộp cát cho tệp nhị phân 32 bit x86 không?

Sandbox2 chỉ có thể tạo hộp cát cùng một cấu trúc như được biên dịch.

Ngoài ra, Sandbox2 cũng không còn hỗ trợ phiên bản 32 bit x86. Nếu bạn cố gắng sử dụng bộ thực thi 64 bit x86 để 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 tạo syscall 32 bit (thông qua int 0x80), cả hai sẽ tạo ra một lỗi vi phạm hộp cát có thể được xác định bằng nhãn kiến trúc [X86-32].

Lý do đằng sau hành vi này là số syscall khác nhau giữa các kiến trúc và vì chính sách syscall được viết trong kiến trúc của trình thực thi, việc cho phép một kiến trúc khác cho Sandboxee sẽ nguy hiểm. Trên thực tế, việc này có thể dẫn đến việc cho phép một syscall dường như vô hại, nhưng thực tế lại có nghĩa là một syscall có hại khác có thể mở ra hộp cát để tìm lối thoát.

Có giới hạn nào về số lượng hộp cát mà một quy trình thực thi có thể yêu cầu không?

Đối với mỗi thực thể Sandboxee (quy trình mới được tạo từ máy chủ forkserver), một luồng mới sẽ được tạo – đó là nơi có giới hạn.

Trình thực thi có thể yêu cầu tạo nhiều Hộp cát không?

Không. Có mối quan hệ 1:1 – một thực thể Executor lưu trữ PID của Sandboxee, quản lý thực thể Comms (Giao tiếp) cho thực thể Sandbox, v.v.

Tại sao tôi nhận được thông báo "Function notđược triển khai" bên trong forkserver.cc?

Sandbox2 chỉ hỗ trợ chạy trên các nhân mới hợp lý. Hạn chót hiện tại của chúng tôi là kernel 3.19, mặc dù có thể thay đổi trong tương lai. Lý do là chúng tôi đang sử dụng các tính năng hạt nhân tương đối mới, bao gồm không gian tên người dùng và seccomp với cờ TSYNC.

Nếu bạn đang chạy chế độ chính thức, thì vấn đề này sẽ không đáng kể vì gần như toàn bộ nhóm thiết bị đều đang chạy một hạt nhân đủ mới. Nếu bạn gặp vấn đề với thao tá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, việc cập nhật kernel cũng đơn giản như sau:

sudo apt-get install linux-image-<RECENT_VERSION>