อธิบายเกี่ยวกับ Sandbox2

การออกแบบ Sandbox2 สร้างขึ้นจากเทคโนโลยีที่รู้จักกันดีและเป็นที่ยอมรับ กรอบนโยบาย และ 2 กระบวนการ ได้แก่ Sandbox Executor และ Sandboxee

เทคโนโลยีที่เกี่ยวข้อง

ส่วนต่อไปนี้จะครอบคลุมเทคโนโลยีที่สร้างเลเยอร์พื้นฐาน สำหรับ Sandbox2

เนมสเปซ Linux

เนมสเปซของ Linux เป็นความพยายามที่จะจัดเตรียมการจำลองเสมือนระดับระบบปฏิบัติการ แม้ว่าพื้นที่ผู้ใช้หลายรายการจะทำงานแยกกันอย่างอิสระ แต่ก็ใช้เคอร์เนลอินสแตนซ์เดียวกัน Sandbox2 ใช้เนมสเปซประเภทต่อไปนี้

  • IPC
  • เครือข่าย (เว้นแต่จะปิดใช้โดยชัดแจ้งด้วยการเรียกใช้ PolicyBuilder::AllowUnrestrictedNetworking())
  • เมานต์ (ใช้มุมมองที่กำหนดเองของแผนผังระบบไฟล์)
  • PID
  • ผู้ใช้
  • UTS

อ่านเพิ่มเติมเกี่ยวกับเนมสเปซของ Linux ได้ที่ Wikipedia หรือในหน้า man ที่เกี่ยวข้อง

IPC

Sandbox2 อนุญาตให้แลกเปลี่ยนข้อมูลที่กำหนดเองระหว่าง Sandbox Executor กับ Sandboxee ที่ไม่น่าเชื่อถือ โดยรองรับข้อความประเภทความยาวค่า (TLV) การส่งต่อตัวอธิบายไฟล์ และการแลกเปลี่ยนข้อมูลเข้าสู่ระบบผ่านโทเค็นและแฮนเดิล

Seccomp-BPF

Sandbox2 ใช้ seccomp-bpf ซึ่งเป็นส่วนขยายของโหมดการประมวลผลที่ปลอดภัย (seccomp) ที่อนุญาตให้ใช้กฎ Berkeley Packet Filter (BPF) เพื่อกรอง Syscall

seccomp เป็นฟีเจอร์ของเคอร์เนล Linux ที่จำกัดการเรียกใช้ระบบของกระบวนการให้exit, sigreturn, read และ write เท่านั้น หากกระบวนการพยายาม เรียกใช้ syscall อื่น ระบบจะสิ้นสุดกระบวนการนั้น ส่วนขยาย seccomp-bpf ช่วยให้มีความยืดหยุ่นมากกว่า seccomp แทนที่จะอนุญาตชุด syscall ที่คงที่ seccomp-bpf จะเรียกใช้โปรแกรม BPF ในข้อมูล syscall และขึ้นอยู่กับ ค่าที่โปรแกรมส่งคืน โปรแกรมจะเรียกใช้ syscall ข้าม syscall และส่งคืน ค่าจำลอง สิ้นสุดกระบวนการ สร้างสัญญาณ หรือแจ้งเตือนเครื่องมือติดตาม

Ptrace

Syscall ptrace (การติดตามกระบวนการ) มีฟังก์ชันที่ช่วยให้กระบวนการติดตาม สังเกตและควบคุมการดำเนินการของกระบวนการที่ถูกติดตามได้ กระบวนการ Tracer จะควบคุมกระบวนการ Tracee ได้อย่างเต็มที่เมื่อแนบแล้ว อ่านเพิ่มเติมเกี่ยวกับ ptrace ใน Wikipedia หรือในหน้า man ที่เกี่ยวข้อง

นโยบายแซนด์บ็อกซ์

นโยบาย Sandbox เป็นส่วนที่สำคัญที่สุดของ Sandbox เนื่องจากนโยบายนี้จะระบุการดำเนินการที่ Sandboxee ทำได้และทำไม่ได้ นโยบาย Sandbox มี 2 ส่วน ดังนี้

  • นโยบาย Syscall
  • การตั้งค่าเนมสเปซ

นโยบาย Syscall เริ่มต้น

นโยบายเริ่มต้นจะบล็อก Syscall ที่เป็นอันตรายเสมอและมีความสำคัญเหนือกว่านโยบายแบบขยายที่ผู้ใช้ระบุ

นโยบาย Syscall แบบขยาย

คุณสร้างนโยบาย Syscall แบบขยายได้โดยใช้คลาส PolicyBuilder คลาสนี้กำหนดกฎความสะดวกหลายอย่าง (เช่น AllowStaticStartup, AllowDynamicStartup, AllowOpen) ซึ่งใช้เพื่อ ปรับปรุงความสามารถในการอ่านนโยบายได้

หากต้องการจำกัด Syscall เพิ่มเติมหรือกำหนดกฎที่ซับซ้อนมากขึ้น คุณสามารถ ระบุมาโคร BPF ดิบด้วย AddPolicyOnSyscall และ AddPolicyOnSyscalls ตัวอย่าง crc4 ใช้กลไกนี้เพื่อจำกัดอาร์กิวเมนต์สำหรับ Syscall read, write และ close

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

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

การตั้งค่าเนมสเปซ

นอกจากนี้ยังใช้ออบเจ็กต์ PolicyBuilder เพื่อตั้งค่ามุมมองแต่ละรายการของ Sandboxee ในระบบไฟล์ด้วย คุณสามารถแมปไฟล์เดียว (AddFile / AddFileAt) ไดเรกทอรีทั้งหมด (AddDirectory / AddDirectoryAt) รวมถึงพื้นที่เก็บข้อมูลชั่วคราว (AddTmpfs) ลงในสภาพแวดล้อมของ Sandboxee ได้ นอกจากนี้ AddLibrariesForBinary ยังใช้เพื่อแมปไลบรารีทั้งหมดที่จำเป็นสำหรับไฟล์ปฏิบัติการที่ลิงก์แบบไดนามิกที่ระบุโดยอัตโนมัติได้ด้วย

Flag บรรทัดคำสั่ง

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Sandbox Executor

Sandbox Executor เป็นกระบวนการที่ไม่ได้อยู่ในแซนด์บ็อกซ์ ซึ่งเป็นกระบวนการติดตาม ptrace ที่ แนบกับ Sandboxee (กระบวนการติดตาม ptrace) นอกจากนี้ Sandbox Executor ยัง ตั้งค่าและเรียกใช้ อินสแตนซ์ Monitor ซึ่งติดตาม Sandboxee และให้ข้อมูลสถานะด้วย

Sandbox2 อนุญาตให้ใช้โหมดการดำเนินการ 3 โหมด ได้แก่ Stand-alone, Sandbox2 Forkserver และ Custom Forkserver หากคุณใช้ forkserver ระบบจะสร้าง Sandboxee เป็นกระบวนการย่อย ของ Sandbox Executor โดยจะอธิบายโหมดเหล่านี้อย่างละเอียดที่นี่

Sandboxee

Sandboxee คือกระบวนการที่ทำงานในสภาพแวดล้อมที่จำกัดและใช้แซนด์บ็อกซ์ ซึ่งกำหนดโดยนโยบายแซนด์บ็อกซ์ Sandbox Executor จะส่งนโยบาย ไปยัง Sandboxee ผ่าน IPC จากนั้น Sandboxee จะใช้นโยบาย การละเมิดนโยบายจะส่งผลให้กระบวนการสิ้นสุดลง เว้นแต่จะมีการกำหนดค่าเป็นอย่างอื่น (ดูนโยบายแซนด์บ็อกซ์)