ตัวอย่าง

ภาพรวม

เราได้เตรียมตัวอย่าง 2-3 ตัวอย่างเพื่อแสดงวิธีใช้ Sandbox2 ในสถานการณ์ต่างๆ และวิธีเขียนนโยบาย

คุณดูตัวอย่างได้ใน //sandboxed_api/sandbox2/examples ดูคำอธิบายโดยละเอียดได้ที่ด้านล่าง

CRC4

ตัวอย่าง CRC4 เป็นการคำนวณผลรวมตรวจสอบ CRC4 ที่มีข้อบกพร่องโดยจงใจ ซึ่งแสดงให้เห็นวิธีแซนด์บ็อกซ์โปรแกรมอื่นและวิธีสื่อสารกับโปรแกรมนั้น

  • crc4bin.cc: โปรแกรมที่เราต้องการแซนด์บ็อกซ์ (เช่น Sandboxee)
  • crc4sandbox.cc: โปรแกรมแซนด์บ็อกซ์ที่จะเรียกใช้ (เช่น ตัวดำเนินการ)

วิธีการทำงาน

  1. โปรแกรมเรียกใช้จะเริ่ม Sandboxee จากเส้นทางไฟล์โดยใช้ ::sandbox2::GetDataDependencyFilePath()
  2. โปรแกรมเรียกใช้จะส่งอินพุตไปยัง Sandboxee ผ่านช่องทางการสื่อสาร Comms โดยใช้ SendBytes()
  3. Sandboxee จะคำนวณ CRC4 และส่งคำตอบกลับไปยังผู้ดำเนินการผ่านช่องทางการสื่อสาร Comms ซึ่งจะรับคำตอบด้วย RecvUint32()

หากโปรแกรมเรียกใช้ syscall อื่นนอกเหนือจากการสื่อสาร (read() และ write()) ระบบจะปิดโปรแกรมเนื่องจากมีการละเมิดนโยบาย

คงที่

ตัวอย่างแบบคงที่แสดงวิธีแซนด์บ็อกซ์ไบนารีที่ลิงก์แบบคงที่ เช่น ไบนารีของบุคคลที่สามที่คุณไม่มีแหล่งที่มา ซึ่งหมายความว่าไบนารีนั้นไม่ทราบว่าจะมีการแซนด์บ็อกซ์

  • static_bin.cc: Sandboxee เป็นไบนารี C แบบคงที่ที่แปลงข้อความ ASCII จากอินพุตมาตรฐานเป็นตัวพิมพ์ใหญ่
  • static_sandbox.cc: ตัวดำเนินการที่มีนโยบาย ขีดจำกัด และการใช้ตัวอธิบายไฟล์สำหรับอินพุต Sandboxee

วิธีการทำงาน

  1. โปรแกรมเรียกใช้จะเริ่ม Sandboxee จากเส้นทางของไฟล์โดยใช้ GetDataDependencyFilepath เช่นเดียวกับ CRC4
  2. โดยจะตั้งค่าขีดจำกัด เปิดตัวอธิบายไฟล์ใน /proc/version และทำเครื่องหมายเพื่อแมปใน Sandboxee ด้วย MapFd
  3. นโยบายนี้อนุญาตให้ Syscall บางรายการ (open) แสดงข้อผิดพลาด (ENOENT) แทนที่จะถูกปิดเนื่องจากการละเมิดนโยบาย ซึ่งจะเป็นประโยชน์เมื่อแซนด์บ็อกซ์โปรแกรมของบุคคลที่สามที่เราไม่สามารถแก้ไขได้ว่ามีการเรียกใช้ syscall ใดบ้าง ดังนั้นเราจึงทำให้การเรียกใช้เหล่านั้นล้มเหลวอย่างราบรื่นแทน

เครื่องมือ

ตัวอย่างเครื่องมือนี้เป็นทั้งเครื่องมือในการพัฒนานโยบายของคุณเองและทดสอบ Sandbox2 API รวมถึงการสาธิตฟีเจอร์ต่างๆ

  • sandbox2tool.cc: ตัวดำเนินการที่แสดงให้เห็นถึงสิ่งต่อไปนี้
    • วิธีเรียกใช้ไบนารีอื่นในแซนด์บ็อกซ์
    • วิธีตั้งค่าการตรวจสอบระบบไฟล์ และ
    • วิธีที่ตัวดำเนินการสามารถเรียกใช้ Sandboxee แบบไม่พร้อมกันเพื่ออ่านเอาต์พุตได้อย่างต่อเนื่อง

ลองใช้งานด้วยตัวเองในเรื่องต่อไปนี้

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake + Ninja

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3 (Blaze)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

ข้อควรพิจารณา:

  • --sandbox2tool_resolve_and_add_libraries เพื่อแก้ไขและติดตั้งไลบรารีที่จำเป็นสำหรับ Sandboxee
  • --sandbox2tool_additional_bind_mounts <PATHS> เพื่อให้ไดเรกทอรีเพิ่มเติมพร้อมใช้งานใน Sandboxee
  • --sandbox2tool_keep_env เพื่อเก็บตัวแปรสภาพแวดล้อมปัจจุบันไว้
  • --sandbox2tool_redirect_fd1 เพื่อรับ Sandboxee STDOUT_FILENO (1) และส่งออกในเครื่อง
  • --sandbox2tool_cpu_timeout เพื่อตั้งค่าระยะหมดเวลาของ CPU เป็นวินาที
  • --sandbox2tool_walltime_timeout เพื่อตั้งค่าการหมดเวลาของเวลาจริงเป็นวินาที
  • --sandbox2tool_file_size_creation_limit เพื่อกำหนดขนาดสูงสุดของไฟล์ที่สร้างขึ้น
  • --sandbox2tool_cwd เพื่อตั้งค่าไดเรกทอรีที่ใช้งานปัจจุบันของแซนด์บ็อกซ์

custom_fork

custom_fork ตัวอย่างแสดงวิธีสร้างแซนด์บ็อกซ์ที่จะเริ่มต้นไบนารี จากนั้นรอfork()คำขอที่มาจากผู้ดำเนินการหลัก

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

  • custom_fork_bin.cc: เซิร์ฟเวอร์ Fork ที่กำหนดเองซึ่งรับคำขอไปยัง fork() (ผ่าน Client::WaitAndFork) เพื่อสร้าง Sandboxee ใหม่
  • custom_fork_sandbox.cc: ตัวดำเนินการที่เริ่มเซิร์ฟเวอร์การแยกที่กำหนดเอง จากนั้นจะส่งคำขอไปยังเซิร์ฟเวอร์ (ผ่านตัวดำเนินการใหม่) เพื่อสร้าง (ผ่าน fork()) Sandboxee ใหม่

เครือข่าย

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

การเชื่อมต่อจะเริ่มต้นภายในตัวดำเนินการและส่งซ็อกเก็ตที่ได้ผ่าน ::sandbox2::Comms::SendFD() Sandboxee จะรับซ็อกเก็ตโดยใช้ ::sandbox2::Comms::RecvFD() จากนั้นจะใช้ซ็อกเก็ตนี้เพื่อแลกเปลี่ยนข้อมูลได้ตามปกติ

  • network_bin.cc: โปรแกรมที่เราต้องการแซนด์บ็อกซ์ (เช่น Sandboxee)
  • network_sandbox.cc: โปรแกรมแซนด์บ็อกซ์ที่จะเรียกใช้ (เช่น ตัวดำเนินการ)

network_proxy

ตัวอย่างนี้แสดงวิธีอื่นในการจัดการเนมสเปซเครือข่าย ภายในแล้วฟีเจอร์นี้ทำงานในลักษณะเดียวกับตัวอย่างด้านบน แต่จะแสดงเป็น API ที่สะดวกกว่า

Sandboxee สามารถสร้างการเชื่อมต่อเครือข่ายได้ 2 วิธี ดังนี้

  • อัตโนมัติ - โดยการติดตั้งตัวแฮนเดิลอัตโนมัติแล้วโทรออกเพื่อเชื่อมต่อเป็นประจำ
  • ด้วยตนเอง - โดยการขอรับ NetworkProxyClient และใช้ NetworkProxyClient::Connect โดยตรง

ตัวอย่างนี้แสดงทั้ง 2 วิธี ระบบจะใช้โหมดอัตโนมัติเมื่อตั้งค่าฟีเจอร์connect_with_handlerไว้ ไม่เช่นนั้นระบบจะใช้โหมดด้วยตนเอง

  • network_bin.cc: โปรแกรมที่เราต้องการแซนด์บ็อกซ์ (เช่น Sandboxee)
  • network_sandbox.cc: โปรแกรมแซนด์บ็อกซ์ที่จะเรียกใช้ (ตัวดำเนินการ)