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