การออกแบบ 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 จากนั้นแซนด์บ็อกซ์จะนำนโยบายไปใช้ การละเมิดนโยบายจะส่งผลให้กระบวนการสิ้นสุดลง เว้นแต่จะกำหนดค่าเป็นอย่างอื่น (ดูนโยบายแซนด์บ็อกซ์)