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

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

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

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

เนมสเปซของ Linux

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

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

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

IPC

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

Seccomp-BPF

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

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

Ptrace

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

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

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

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

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

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

นโยบาย syscall แบบขยาย

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

ในกรณีส่วนใหญ่ คุณควรเริ่มต้นด้วย DefaultPolicyBuilder (sapi::Sandbox2Config::DefaultPolicyBuilder()) ซึ่งจะแสดงผล PolicyBuilder ที่กำหนดค่าไว้ล่วงหน้าด้วยนโยบายพื้นฐานสำหรับไลบรารี แบบ Single-Thread ทั่วไป และสามารถปรับแต่งเพิ่มเติมด้วยกฎเพิ่มเติม (เช่น .AllowDynamicStartup() และ .AddLibrariesForBinary() เมื่อใช้แซนด์บ็อกซ์กับ ไบนารี) ใน Sandboxed API (SAPI) DefaultPolicyBuilder() จะใช้โดย sapi::SandboxConfig::DefaultConfig() ร่วมกับ sapi::SandboxConfig::DefaultFlags(), sapi::SandboxConfig::DefaultEnvironmentVariables() และ sapi::Sandbox2Config::DefaultLimits() ควรใช้การสร้าง PolicyBuilder โดยตรง เฉพาะในกรณีที่ไม่สามารถใช้ DefaultPolicyBuilder() หรือเมื่อต้องมีการกำหนดค่าที่ แม่นยำ

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

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

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

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

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

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

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

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Sandbox Executor

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

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

Sandboxee

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