ฉันใช้ชุดข้อความได้ไหม
ได้ ระบบรองรับชุดข้อความใน Sandbox2
ชุดข้อความทั้งหมดต้องอยู่ในแซนด์บ็อกซ์
เนื่องจากลักษณะการทำงานของ Linux ระบบจะใช้นโยบาย seccomp-bpf กับชุดข้อความปัจจุบันเท่านั้น ซึ่งหมายความว่าจะไม่ใช้นโยบายกับชุดข้อความอื่นๆ ที่มีอยู่ แต่ชุดข้อความในอนาคตจะรับช่วงนโยบาย
- หากคุณใช้ Sandbox2 ในโหมดแรก
ที่เปิดใช้แซนด์บ็อกซ์ก่อน
execve()ชุดข้อความทั้งหมดจะรับช่วง นโยบายและไม่มีปัญหา ซึ่งเป็นโหมดแซนด์บ็อกซ์ที่แนะนำ - หากคุณใช้โหมดที่ สอง
ซึ่ง Executor มี
set_enable_sandbox_before_exec(false)และ Sandboxee จะบอก Executor เมื่อต้องการอยู่ในแซนด์บ็อกซ์ด้วยSandboxMeHere()ให้ตรวจสอบว่าได้ใช้ตัวกรองกับชุดข้อความทั้งหมดแล้ว มิเช่นนั้นจะมีความเสี่ยงที่โค้ดที่เป็นอันตรายจะย้ายจากชุดข้อความที่อยู่ในแซนด์บ็อกซ์ไปยังชุดข้อความที่ไม่อยู่ในแซนด์บ็อกซ์
ฉันควรคอมไพล์ 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>