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

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

ใช่ ชุดข้อความได้รับการสนับสนุนใน Sandbox2

เทรดทั้งหมดต้องแซนด์บ็อกซ์

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

  • หากคุณใช้ Sandbox2 ในโหมดแรกที่เปิดใช้แซนด์บ็อกซ์ก่อน execve() เทรดทั้งหมดจะรับค่านโยบายและไม่มีปัญหา โหมดนี้เป็นโหมดแซนด์บ็อกซ์ที่แนะนำ
  • หากคุณใช้โหมดที่ 2 ซึ่งผู้ดำเนินการมี set_enable_sandbox_before_exec(false) และแซนด์บ็อกซ์จะบอกผู้ดำเนินการเมื่อต้องการแซนด์บ็อกซ์ด้วย SandboxMeHere() โปรดตรวจสอบว่าได้ใช้ตัวกรองกับเทรดทั้งหมด มิเช่นนั้น มีความเสี่ยงที่จะออกจากแซนด์บ็อกซ์ โค้ดที่เป็นอันตรายอาจย้ายจากเทรดที่ทำแซนด์บ็อกซ์ไปยังเทรดที่ไม่ได้แซนด์บ็อกซ์

ฉันควรคอมไพล์แซนด์บ็อกซ์อย่างไร

หากคุณไม่ระมัดระวัง การรับทรัพยากร Dependency และผลข้างเคียงจำนวนมากมาได้ง่ายๆ (เช่น Syscall, การเข้าถึงไฟล์ หรือแม้แต่การเชื่อมต่อเครือข่าย) ทำให้การทำแซนด์บ็อกซ์ทำได้ยากขึ้น (ติดตามผลข้างเคียงทั้งหมด) และมีความปลอดภัยน้อยลง (เนื่องจากนโยบาย syscall และไฟล์กว้างกว่า) ตัวเลือกคอมไพล์บางตัวเลือกช่วยลดปัญหาดังกล่าวได้

  • คอมไพล์ไบนารีแซนด์บ็อกซ์แบบคงที่เพื่อหลีกเลี่ยงการลิงก์แบบไดนามิกที่ใช้ syscalls จำนวนมาก (open/openat, mmap ฯลฯ)
  • เนื่องจาก Bazel เพิ่ม pie โดยค่าเริ่มต้น แต่แบบคงที่ใช้ร่วมกันไม่ได้ โปรดพิจารณาใช้การติดธงฟีเจอร์เพื่อบังคับปิดฟีเจอร์ด้วยตัวเลือกต่อไปนี้ในกฎ cc_binary

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

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

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

น่าเสียดายมาก เนื่องจากคอมไพเลอร์ไม่รองรับ PIE (Position Independent Executables) แบบคงที่ PIE ติดตั้งใช้งานโดยกำหนดให้ไบนารีเป็นออบเจ็กต์แบบไดนามิก และตัวโหลดแบบไดนามิกจะจับคู่ PIE ในตำแหน่งแบบสุ่มก่อนที่จะเรียกใช้ จากนั้น เนื่องจากโดยปกติแล้ว ฮีปจะวางอยู่ในออฟเซ็ตแบบสุ่มหลังที่อยู่ฐานของไบนารี (และขยายด้วย brk syscall) หมายความว่าสำหรับไบนารีแบบคงที่ เอนโทรปี ASLR ของฮีปจึงเป็นเพียงออฟเซ็ตนี้เท่านั้นเนื่องจากไม่มี PIE

สำหรับตัวอย่างของตัวเลือกการคอมไพล์เหล่านี้ ให้ดูตัวอย่างแบบคงที่ BUILD.bazel เนื่องจาก static_bin.cc มีการคอมไพล์แบบคงที่ ซึ่งทำให้เรามีนโยบาย syscall ที่ตายตัว วิธีนี้ยังทำงานได้ดีสำหรับการทำแซนด์บ็อกซ์ไบนารีของบุคคลที่สามด้วย

ฉันจะใช้ไบนารี 32 บิต x86 ในแซนด์บ็อกซ์ได้ไหม

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

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

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

มีการจำกัดจำนวนแซนด์บ็อกซ์ที่กระบวนการของการดำเนินการขอหรือไม่

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

ผู้ดำเนินการจะขอสร้างแซนด์บ็อกซ์มากกว่า 1 รายการได้ไหม

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

ทำไมฉันจึงได้รับ “ฟังก์ชันไม่ทำงาน” ใน forkserver.cc

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

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

หากคุณใช้งานบน Debian หรือ Ubuntu การอัปเดตเคอร์เนลของคุณเป็นเรื่องง่ายเหมือนกับเรียกใช้:

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