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

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

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

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

เนมสเปซ Linux

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

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

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

IPC

Sandbox2 ช่วยให้แลกเปลี่ยนข้อมูลที่กำหนดเองระหว่างผู้ดำเนินการ Sandbox กับแซนด์บ็อกซ์ที่ไม่น่าเชื่อถือ โดยจะรองรับข้อความ Type-Length-Value (TLV), การส่งข้อบ่งชี้ไฟล์ และการแลกเปลี่ยนข้อมูลเข้าสู่ระบบผ่านโทเค็นและแฮนเดิล

Seccomp-BPF

Sandbox2 ใช้ seccomp-bpf ซึ่งเป็นส่วนขยายของ Secure Computing Mode (seccomp) ที่อนุญาตให้ใช้กฎ Berkeley Packet Filter (BPF) เพื่อกรอง Sycalls

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

เทรซ

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

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

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

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

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

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

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

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

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

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

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

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

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

แฟล็กบรรทัดคำสั่ง

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

ผู้ดำเนินการแซนด์บ็อกซ์

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

Sandbox2 อนุญาตให้มีโหมดการดำเนินการ 3 โหมด ได้แก่ โหมดสแตนด์อโลน, Sandbox2 Forkserver และ Custom Forkserver หากคุณใช้ Forkserver ระบบจะสร้างแซนด์บ็อกซ์ขึ้นเป็นกระบวนการย่อยของไฟล์ปฏิบัติการแซนด์บ็อกซ์ โหมดเหล่านี้จะอธิบายรายละเอียดที่นี่

แซนด์บ็อกซ์

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