ภาพรวม
เราได้เตรียมตัวอย่าง 2-3 ตัวอย่างเพื่อแสดงวิธีใช้ Sandbox2 ในสถานการณ์ต่างๆ และวิธีเขียนนโยบาย
คุณดูตัวอย่างได้ใน //sandboxed_api/sandbox2/examples ดูคำอธิบายโดยละเอียดได้ที่ด้านล่าง
CRC4
ตัวอย่าง CRC4 เป็นการคำนวณผลรวมตรวจสอบ CRC4 ที่มีข้อบกพร่องโดยจงใจ ซึ่งแสดงให้เห็นวิธีแซนด์บ็อกซ์โปรแกรมอื่นและวิธีสื่อสารกับโปรแกรมนั้น
- crc4bin.cc: โปรแกรมที่เราต้องการแซนด์บ็อกซ์ (เช่น Sandboxee)
- crc4sandbox.cc: โปรแกรมแซนด์บ็อกซ์ที่จะเรียกใช้ (เช่น ตัวดำเนินการ)
วิธีการทำงาน
- โปรแกรมเรียกใช้จะเริ่ม Sandboxee จากเส้นทางไฟล์โดยใช้
::sandbox2::GetDataDependencyFilePath()
- โปรแกรมเรียกใช้จะส่งอินพุตไปยัง Sandboxee ผ่านช่องทางการสื่อสาร
Comms
โดยใช้SendBytes()
- Sandboxee จะคำนวณ CRC4 และส่งคำตอบกลับไปยังผู้ดำเนินการผ่านช่องทางการสื่อสาร
Comms
ซึ่งจะรับคำตอบด้วยRecvUint32()
หากโปรแกรมเรียกใช้ syscall อื่นนอกเหนือจากการสื่อสาร (read()
และ write()
) ระบบจะปิดโปรแกรมเนื่องจากมีการละเมิดนโยบาย
คงที่
ตัวอย่างแบบคงที่แสดงวิธีแซนด์บ็อกซ์ไบนารีที่ลิงก์แบบคงที่ เช่น ไบนารีของบุคคลที่สามที่คุณไม่มีแหล่งที่มา ซึ่งหมายความว่าไบนารีนั้นไม่ทราบว่าจะมีการแซนด์บ็อกซ์
- static_bin.cc: Sandboxee เป็นไบนารี C แบบคงที่ที่แปลงข้อความ ASCII จากอินพุตมาตรฐานเป็นตัวพิมพ์ใหญ่
- static_sandbox.cc: ตัวดำเนินการที่มีนโยบาย ขีดจำกัด และการใช้ตัวอธิบายไฟล์สำหรับอินพุต Sandboxee
วิธีการทำงาน
- โปรแกรมเรียกใช้จะเริ่ม Sandboxee จากเส้นทางของไฟล์โดยใช้
GetDataDependencyFilepath
เช่นเดียวกับ CRC4 - โดยจะตั้งค่าขีดจำกัด เปิดตัวอธิบายไฟล์ใน
/proc/version
และทำเครื่องหมายเพื่อแมปใน Sandboxee ด้วยMapFd
- นโยบายนี้อนุญาตให้ 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
เพื่อรับ SandboxeeSTDOUT_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: โปรแกรมแซนด์บ็อกซ์ที่จะเรียกใช้ (ตัวดำเนินการ)