คำถามที่พบบ่อย

ฉันใช้ชุดข้อความได้ไหม

ได้ ระบบรองรับชุดข้อความใน Sandbox2

ชุดข้อความทั้งหมดต้องอยู่ในแซนด์บ็อกซ์

เนื่องจากลักษณะการทำงานของ Linux ระบบจะใช้นโยบาย seccomp-bpf กับชุดข้อความปัจจุบันเท่านั้น ซึ่งหมายความว่าจะไม่ใช้นโยบายกับชุดข้อความอื่นๆ ที่มีอยู่ แต่ชุดข้อความในอนาคตจะรับช่วงนโยบาย

ฉันควรคอมไพล์ Sandboxee อย่างไร

เมื่อเทียบกับไฟล์ปฏิบัติการที่ลิงก์แบบคงที่ การคอมไพล์ Sandboxee เป็นไฟล์ปฏิบัติการที่ ลิงก์แบบไดนามิกจะส่งผลให้มีการเรียกใช้ระบบ (Syscall) เพิ่มขึ้นอย่างมาก (เช่น open/openat, mmap, ฯลฯ) ซึ่งต้องเพิ่มลงในรายการที่อนุญาต การเรียกใช้ระบบเพิ่มเติมทั้งหมดนี้จำเป็นเนื่องจากการเรียกใช้ตัวลิงก์แบบไดนามิกในรันไทม์เพื่อโหลดไลบรารีที่แชร์

อย่างไรก็ตาม เมื่อดูที่ Sandboxee ที่ลิงก์แบบคงที่ แม้ว่าคุณจะต้องเพิ่มการเรียกใช้ระบบลงในรายการที่อนุญาตน้อยลง แต่ก็มีผลกระทบด้านความปลอดภัยด้วย เนื่องจาก Entropy ของฮีป ASLR ลดลง (จาก 30 บิตเป็น 8 บิต) ซึ่งทำให้การใช้ประโยชน์จากช่องโหว่ทำได้ง่ายขึ้น

นี่คือภาวะที่กลืนไม่เข้าคายไม่ออกซึ่งสรุปได้ดังนี้

  • ไดนามิก: ASLR ฮีปดี อาจทำให้การดำเนินการโค้ดเริ่มต้นทำได้ยากขึ้น แต่ต้องแลกมาด้วยนโยบายแซนด์บ็อกซ์ที่มีประสิทธิภาพน้อยลงและอาจหลุดออกจากแซนด์บ็อกซ์ได้ง่ายขึ้น
  • คงที่: ASLR ฮีปไม่ดี อาจทำให้การเรียกใช้โค้ดเริ่มต้นทำได้ง่ายขึ้น แต่มีนโยบายแซนด์บ็อกซ์ที่มีประสิทธิภาพมากขึ้นและอาจหลุดออกจากแซนด์บ็อกซ์ได้ยากขึ้น

ในอดีต ไบนารีที่ลิงก์แบบคงที่ไม่รองรับโค้ดที่ไม่ขึ้นกับตำแหน่ง (pie) นอกจากนี้ Bazel ยังเพิ่ม pie เป็นค่าเริ่มต้น คุณต้องเขียนทับค่าเริ่มต้นของ Bazel เพื่อกำหนดตัวกรองการเรียกใช้ระบบที่เข้มงวด

คอมไพเลอร์ได้รับการปรับปรุงในช่วงหลายปีที่ผ่านมาและตอนนี้รองรับตัวเลือก static-pie แล้ว ตัวเลือกนี้จะสั่งให้คอมไพเลอร์สร้างโค้ดที่ไม่ขึ้นกับตำแหน่ง แต่เมื่อเทียบกับ pie ตัวเลือกนี้จะรวมไลบรารีที่ลิงก์แบบคงที่ทั้งหมดด้วย จากมุมมองด้านความปลอดภัย static-pie ยังคงลด Entropy ของ ASLR (จาก 30 บิตเป็น 14 บิต) แต่ก็ดีกว่าสถานการณ์ก่อนหน้านี้ ที่ไม่มี pie

เนื่องจาก Bazel เพิ่ม pie เป็นค่าเริ่มต้นและ static เข้ากันไม่ได้กับค่าเริ่มต้น ให้พิจารณา ใช้แฟล็กตัวเลือกตัวลิงก์เพื่อส่งแฟล็กตัวลิงก์ -static-pie ไปยัง cc_binary กฎและเขียนทับค่าเริ่มต้น:

  linkstatic = 1,
  linkopts=["-static-pie"],

ดูตัวอย่างตัวเลือกเหล่านี้ได้ที่ BUILD ตัวอย่างแบบ คงที่: static_bin.cc จะลิงก์แบบคงที่กับ static-pie ซึ่งทำให้สามารถ ใช้นโยบายการเรียกใช้ระบบที่เข้มงวดมากได้ นอกจากนี้ยังใช้ได้ดีกับการทำแซนด์บ็อกซ์ไบนารีของบุคคลที่สาม

ฉันทำแซนด์บ็อกซ์ไบนารี x86 32 บิตได้ไหม

Sandbox2 ทำแซนด์บ็อกซ์ได้เฉพาะสถาปัตยกรรมเดียวกับที่ใช้คอมไพล์เท่านั้น

นอกจากนี้ ระบบยังนำการรองรับ x86 32 บิตออกจาก Sandbox2 แล้ว หากคุณพยายามใช้ Executor x86 64 บิตเพื่อทำแซนด์บ็อกซ์ไบนารี x86 32 บิต หรือไบนารี x86 64 บิตที่ทำการเรียกใช้ระบบ 32 บิต (ผ่าน int 0x80) ทั้ง 2 อย่างจะสร้างการละเมิดแซนด์บ็อกซ์ที่ระบุได้ด้วยป้ายกำกับสถาปัตยกรรม [X86-32]

เหตุผลที่อยู่เบื้องหลังลักษณะการทำงานนี้คือหมายเลขการเรียกใช้ระบบจะแตกต่างกันไปในแต่ละสถาปัตยกรรม และเนื่องจากนโยบายการเรียกใช้ระบบเขียนขึ้นในสถาปัตยกรรมของ Executor จึงอาจเป็นอันตรายหากอนุญาตให้ Sandboxee ใช้สถาปัตยกรรมอื่น เนื่องจากอาจนำไปสู่การอนุญาตการเรียกใช้ระบบที่ดูเหมือนไม่มีอันตราย แต่ในความเป็นจริงแล้วหมายถึงการเรียกใช้ระบบอื่นที่อันตรายกว่า ซึ่งอาจทำให้แซนด์บ็อกซ์เปิดโอกาสให้หลุดออกจากแซนด์บ็อกซ์ได้

กระบวนการ Executor ขอแซนด์บ็อกซ์ได้แบบจำกัดจำนวนไหม

ระบบจะสร้างชุดข้อความใหม่สำหรับอินสแตนซ์ Sandboxee แต่ละรายการ (กระบวนการใหม่ที่สร้างขึ้นจาก Forkserver) ซึ่งเป็นข้อจำกัด

Executor ขอสร้างแซนด์บ็อกซ์ได้มากกว่า 1 รายการไหม

ไม่ได้ ความสัมพันธ์เป็นแบบ 1:1 โดยอินสแตนซ์ Executor จะจัดเก็บ PID ของ Sandboxee, จัดการอินสแตนซ์ Comms ไปยังอินสแตนซ์ Sandbox ฯลฯ

เหตุใดฉันจึงได้รับข้อความ "Function not implemented" ภายใน forkserver.cc

Sandbox2 รองรับการทำงานในเคอร์เนลใหม่พอสมควรเท่านั้น ปัจจุบันเราใช้เคอร์เนล 3.19 เป็นเกณฑ์ แต่เกณฑ์นี้อาจมีการเปลี่ยนแปลงในอนาคต เหตุผลก็คือเราใช้ฟีเจอร์เคอร์เนลใหม่พอสมควร ซึ่งรวมถึงเนมสเปซของผู้ใช้และ seccomp ที่มีแฟล็ก TSYNC

หากคุณกำลังทำงานในสภาพแวดล้อมจริง ปัญหานี้ไม่ควรเกิดขึ้น เนื่องจากเครื่องส่วนใหญ่กำลังทำงานในเคอร์เนลที่ใหม่พอ หากพบปัญหา โปรดติดต่อเรา

หากคุณกำลังทำงานใน Debian หรือ Ubuntu การอัปเดตเคอร์เนลทำได้ง่ายๆ เพียงเรียกใช้คำสั่งต่อไปนี้

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