ฉันจะใช้เธรดได้ไหม
ได้ Sandbox2 รองรับเธรด
ต้องแซนด์บ็อกซ์เธรดทั้งหมด
เนื่องจากลักษณะการทำงานของ Linux นโยบาย seccomp-bpf จึงมีผลกับเธรดปัจจุบันเท่านั้น ซึ่งหมายความว่านโยบายจะไม่มีผลกับเธรดอื่นๆ ที่มีอยู่ แต่เธรดในอนาคตจะรับช่วงนโยบายนี้
- หากคุณใช้ Sandbox2 ในโหมดแรก
ที่เปิดใช้แซนด์บ็อกซ์ก่อน
execve()
เธรดทั้งหมดจะรับช่วงนโยบายและไม่มีปัญหา ซึ่งเป็นโหมดแซนด์บ็อกซ์ที่แนะนำ - หากคุณใช้โหมดที่สอง
ซึ่งตัวดำเนินการมี
set_enable_sandbox_before_exec(false)
และ Sandboxee จะบอกตัวดำเนินการเมื่อต้องการแซนด์บ็อกซ์ด้วยSandboxMeHere()
โปรดตรวจสอบว่าได้ใช้ตัวกรองกับทุกเธรด มิฉะนั้น จะมีความเสี่ยงที่แซนด์บ็อกซ์จะหลุดพ้นได้ ซึ่งหมายความว่าโค้ดที่เป็นอันตรายอาจย้ายจาก เธรดที่อยู่ในแซนด์บ็อกซ์ไปยังเธรดที่ไม่อยู่ในแซนด์บ็อกซ์
ฉันควรคอมไพล์ Sandboxee อย่างไร
เมื่อเทียบกับไฟล์ที่ปฏิบัติการได้ซึ่งลิงก์แบบคงที่ การคอมไพล์แซนด์บ็อกซ์เป็นไฟล์ที่ปฏิบัติการได้ซึ่งลิงก์แบบไดนามิกจะส่งผลให้มีการเพิ่ม Syscall อย่างมาก
(เช่น open
/openat
, mmap
ฯลฯ) ซึ่งต้องอยู่ในรายการที่อนุญาต ต้องใช้ Syscall เพิ่มเติมทั้งหมดนี้เนื่องจากการเรียกใช้ลิงก์เกอร์แบบไดนามิกที่รันไทม์
เพื่อโหลดไลบรารีที่ใช้ร่วมกัน
อย่างไรก็ตาม เมื่อพิจารณาถึง Sandboxee ที่ลิงก์แบบคงที่ แม้ว่าจะต้องเพิ่มรายการที่อนุญาตสำหรับ Syscall น้อยลง แต่ก็มีผลกระทบด้านความปลอดภัยด้วยเช่นกัน Entropy ของฮีป ASLR จะลดลง (จาก 30 บิตเป็น 8 บิต) ซึ่งทำให้การหาช่องโหว่ทำได้ง่ายขึ้น
ซึ่งเป็นภาวะที่กลืนไม่เข้าคายไม่ออกที่สรุปได้ดังนี้
- ไดนามิก: ASLR ของฮีปดี อาจทำให้ได้โค้ดเริ่มต้นยากขึ้น แต่ต้องแลกมาด้วยนโยบายแซนด์บ็อกซ์ที่มีประสิทธิภาพน้อยลง ซึ่งอาจ ทำให้หลุดออกจากแซนด์บ็อกซ์ได้ง่ายขึ้น
- คงที่: ASLR ของฮีปไม่ดี อาจทำให้การเรียกใช้โค้ดครั้งแรกง่ายขึ้น แต่นโยบายแซนด์บ็อกซ์มีประสิทธิภาพมากขึ้น อาจทำให้หลุดออกจากแซนด์บ็อกซ์ได้ยากขึ้น
ในอดีต ไบนารีที่ลิงก์แบบคงที่ไม่ได้รองรับโค้ดที่ไม่ขึ้นกับตำแหน่ง (pie
) นอกจากนี้ Bazel ยังเพิ่ม pie
โดยค่าเริ่มต้นด้วย หากต้องการ
กำหนดตัวกรอง Syscall ที่เข้มงวด คุณต้องเขียนทับค่าเริ่มต้นของ Bazel
คอมไพเลอร์ได้รับการปรับปรุงมาหลายปีและตอนนี้รองรับตัวเลือก static-pie
แล้ว
ตัวเลือกนี้จะสั่งให้คอมไพเลอร์สร้างโค้ดที่ไม่ขึ้นกับตำแหน่ง
แต่เมื่อเทียบกับ pie
ตอนนี้ตัวเลือกนี้ยังรวมถึงไลบรารีที่ลิงก์แบบคงที่ทั้งหมดด้วย
ในแง่ของความปลอดภัย static-pie
ยังคงลดเอนโทรปี ASLR (จาก 30 บิตเป็น 14 บิต) แต่ถือว่าดีขึ้นกว่าสถานการณ์ก่อนหน้านี้ที่ไม่มี pie
เนื่องจาก Bazel เพิ่ม pie
โดยค่าเริ่มต้นและแบบคงที่เข้ากันไม่ได้กับ pie
ให้พิจารณา
ใช้แฟล็กตัวเลือกของลิงก์เกอร์เพื่อส่งแฟล็กลิงก์เกอร์ -static-pie
ไปยัง
กฎ cc_binary
และเขียนทับค่าเริ่มต้น
linkstatic = 1,
linkopts=["-static-pie"],
ดูตัวอย่างตัวเลือกเหล่านี้ได้ในตัวอย่างแบบคงที่
BUILD:
static_bin.cc เชื่อมโยงแบบคงที่กับ static-pie
ซึ่งทำให้
มีนโยบาย syscall ที่เข้มงวดมากได้ นอกจากนี้ยังใช้ได้ดีกับการแซนด์บ็อกซ์
ไบนารีของบุคคลที่สามด้วย
ฉันจะแซนด์บ็อกซ์ไบนารี x86 ขนาด 32 บิตได้ไหม
Sandbox2 จะแซนด์บ็อกซ์ได้เฉพาะสถาปัตยกรรมเดียวกันกับที่ใช้คอมไพล์เท่านั้น
นอกจากนี้ เรายังได้นำการรองรับ x86 32 บิตออกจาก Sandbox2 ด้วย หากคุณพยายามใช้ตัวดำเนินการ x86 64 บิตเพื่อแซนด์บ็อกซ์ไบนารี x86 32 บิต หรือไบนารี x86 64 บิตที่สร้าง Syscall 32 บิต (ผ่าน int 0x80) ทั้ง 2 อย่างจะสร้างการละเมิดแซนด์บ็อกซ์ที่ระบุได้ด้วยป้ายกำกับสถาปัตยกรรม [X86-32]
สาเหตุที่ทำให้เกิดลักษณะการทำงานนี้คือหมายเลข Syscall จะแตกต่างกันระหว่าง สถาปัตยกรรม และเนื่องจากนโยบาย Syscall เขียนขึ้นในสถาปัตยกรรมของ ตัวดำเนินการ การอนุญาตให้ใช้สถาปัตยกรรมอื่นสำหรับ Sandboxee จึงอาจเป็นอันตราย ซึ่งอาจนำไปสู่การอนุญาต syscall ที่ดูเหมือนไม่มีอันตราย แต่ในความเป็นจริงแล้วหมายความว่า syscall อื่นๆ ที่เป็นอันตรายมากกว่าอาจเปิดแซนด์บ็อกซ์ให้มีการหลบหนีได้
มีการจำกัดจำนวนแซนด์บ็อกซ์ที่กระบวนการดำเนินการขอได้ไหม
สำหรับอินสแตนซ์ Sandboxee แต่ละรายการ (กระบวนการใหม่ที่แยกจาก forkserver) ระบบจะสร้าง เธรดใหม่ ซึ่งเป็นที่มาของข้อจำกัด
ผู้ดำเนินการขอสร้าง Sandbox มากกว่า 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>