อธิบายเกี่ยวกับ API ที่ทําแซนด์บ็อกซ์

Sandboxed API (SAPI) สร้างขึ้นจากโปรเจ็กต์ Sandbox2 ที่ได้รับการยอมรับอย่างกว้างขวาง หน้านี้อธิบายสถาปัตยกรรมการออกแบบของ SAPI และแนวคิดหลัก

ภาพรวม

SAPI ได้รับการออกแบบมาเพื่อมอบเครื่องมือให้นักพัฒนาซอฟต์แวร์ในการเตรียมไลบรารี C/C++ สำหรับแซนด์บ็อกซ์ รวมถึง API ที่จำเป็นสำหรับการสื่อสารกับไลบรารี C/C++ เวอร์ชันแซนด์บ็อกซ์

แผนภาพนี้แสดงสถาปัตยกรรมของไลบรารี C/C++ แซนด์บ็อกซ์ของ SAPI

แผนภาพ SAPI

นอกจากนี้ SAPI ยังมี องค์ประกอบพื้นฐานสำหรับการซิงค์หน่วยความจำ (อาร์เรย์ โครงสร้าง) ระหว่างไลบรารี SAPI กับโค้ดโฮสต์ด้วยตนเองและ โดยอัตโนมัติ (อิงตามแอตทริบิวต์ตัวชี้ที่กำหนดเอง)

สุดท้ายนี้ API ธุรกรรมระดับสูงช่วยให้สามารถ ตรวจสอบไลบรารี SAPI และรีสตาร์ทไลบรารีหากล้มเหลว (เช่น เนื่องจากการละเมิด ความปลอดภัย การขัดข้อง หรือทรัพยากรหมด)

Sandbox2

โปรเจ็กต์โอเพนซอร์ส Sandbox2 ได้รับการพัฒนาและ ดูแลโดยวิศวกรด้านความปลอดภัยของ Google และเป็นเทคโนโลยีแซนด์บ็อกซ์หลัก ที่ SAPI ใช้ Sandbox2 มีคอมโพเนนต์หลัก 3 รายการ ได้แก่ Sandbox Policy, the Executor, and the Sandboxee.

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

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

โดยค่าเริ่มต้น คลาสแซนด์บ็อกซ์ SAPI ที่สร้างขึ้นจะเริ่มต้นโดยใช้ DefaultConfig (sapi::SandboxConfig::DefaultConfig()) DefaultConfig() จะกำหนดค่า แซนด์บ็อกซ์ด้วยสิ่งต่อไปนี้

  • นโยบาย Sandbox2 เริ่มต้นที่สร้างด้วย sapi::Sandbox2Config::DefaultPolicyBuilder()
  • ขีดจำกัดทรัพยากรและเวลาเริ่มต้นจาก sapi::Sandbox2Config::DefaultLimits()
  • เปิดใช้การสื่อสารหน่วยความจำที่แชร์ (จับคู่กับสิทธิ์หน่วยความจำที่แชร์ใน DefaultPolicyBuilder())
  • แฟล็กบรรทัดคำสั่งเริ่มต้น (sapi::SandboxConfig::DefaultFlags()) และตัวแปรสภาพแวดล้อม (sapi::SandboxConfig::DefaultEnvironmentVariables()) ซึ่งกำหนดค่าการบันทึกพื้นฐานและลักษณะการทำงานรันไทม์ใน Sandboxee

หากต้องการปรับแต่งนโยบายหรือการกำหนดค่าแซนด์บ็อกซ์ ให้เริ่มต้นจาก sapi::SandboxConfig::DefaultConfig() แก้ไข sapi::SandboxConfig ที่แสดงผล และส่งไปยังตัวสร้างแซนด์บ็อกซ์ที่สร้างขึ้น (หรือ กำหนดคลาสย่อยแซนด์บ็อกซ์ที่กำหนดเองในไฟล์ส่วนหัว sandbox.h ที่ส่งไปยังกฎการสร้าง sapi_library ) ตัวอย่างเช่น คุณสามารถสร้างนโยบายโดยเริ่มต้นจาก sapi::Sandbox2Config::DefaultPolicyBuilder() และเชื่อมโยงกฎเพิ่มเติม (หรือ สร้าง PolicyBuilder โดยตรงเมื่อจำเป็นต้องมีการกำหนดค่าที่จำกัดมากขึ้น) และเมื่อเพิ่ม แฟล็กหรือตัวแปรสภาพแวดล้อม ให้เริ่มต้นจาก sapi::SandboxConfig::DefaultFlags() หรือ sapi::SandboxConfig::DefaultEnvironmentVariables() เพื่อให้ระบบเก็บการตั้งค่าพื้นฐานไว้

ไลบรารีแซนด์บ็อกซ์

นี่คือไลบรารี C/C++ แซนด์บ็อกซ์ที่จะดำเนินการในสภาพแวดล้อมแซนด์บ็อกซ์ที่จำกัดซึ่ง Sandbox2 จัดเตรียมไว้ โดยรวมแล้ว ไลบรารีแซนด์บ็อกซ์ จะแสดงฟังก์ชันการทำงานที่จำเป็นซึ่งโค้ด โฮสต์ใช้ได้

ไลบรารีแซนด์บ็อกซ์สร้างขึ้นด้วยกฎการสร้าง sapi_library ซึ่งคุณสามารถระบุนโยบายแซนด์บ็อกซ์ที่กำหนดเองซึ่งกำหนดสภาพแวดล้อมการดำเนินการที่จำกัดได้ คุณอาจต้องเขียนโค้ด Wrapper หรือ Stub (ดูlibcurl) ทั้งนี้ขึ้นอยู่กับไลบรารี แต่ระบบจะไม่คาดหวังให้คุณเปลี่ยนซอร์สโค้ดของไลบรารี C/C++ ขณะเตรียมเวอร์ชัน SAPI

ออบเจ็กต์ SAPI และ Stub RPC

ออบเจ็กต์ SAPI เป็นออบเจ็กต์ C++ ที่แสดง API ของไลบรารีแซนด์บ็อกซ์ โดยจะส่งต่อการเรียกจากโค้ดโฮสต์ไปยัง Stub RPC ซึ่งฝังอยู่ในไลบรารี SAPI พร้อมกับไลบรารีแซนด์บ็อกซ์

ระบบการสร้างจะสร้างองค์ประกอบทั้ง 2 นี้โดยอัตโนมัติโดยใช้กฎการสร้าง sapi_library() SAPI รองรับระบบการสร้าง 2 ระบบ ได้แก่ Bazel ของ Google และ CMake

โค้ดโฮสต์

โค้ดโฮสต์คือสิ่งที่ใช้ตรรกะที่ไลบรารี SAPI จัดเตรียมไว้ ซึ่งเป็นสิ่งที่ใช้ไลบรารี C/C++ เวอร์ชันที่ไม่ได้อยู่ในแซนด์บ็อกซ์ ดังนั้น โค้ดโฮสต์จึงเรียกใช้ฟังก์ชันที่ไลบรารี SAPI ส่งออก โดยส่งและรับข้อมูลจากแซนด์บ็อกซ์

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

แนวคิด

กฎการสร้าง Bazel

โปรเจ็กต์ SAPI มีกฎการสร้าง Bazel 2 ข้อสำหรับการแซนด์บ็อกซ์ไลบรารี C/C++

  • sapi_library() – สร้างเอาต์พุตทั้งหมดที่จำเป็นเพื่อให้ไลบรารี C/C++ อยู่ในแซนด์บ็อกซ์เป็น Sandboxee ของ Sandbox2 คุณสามารถใช้เอาต์พุตการสร้างเป็นทรัพยากร Dependency สำหรับกฎ cc_binary() ที่ใช้สร้างไบนารีโค้ดโฮสต์
  • sapi_interface() – สร้างส่วนหัวโดยอัตโนมัติซึ่งรวมอยู่ในไบนารีโค้ดโฮสต์ได้

ดูคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับกฎการสร้างได้ที่Build Rules

ตัวแปร

SAPI มีประเภทพิเศษหลายประเภทที่เรียกว่า SAPI ประเภท ซึ่งเราแนะนำ ให้ใช้ใน โค้ดโฮสต์ เหตุผลหลักที่ต้องใช้ประเภท SAPI คือเนื่องจากกระบวนการและการแยกหน่วยความจำระหว่างโค้ดโฮสต์กับไลบรารีแซนด์บ็อกซ์

ดูคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้และภาพรวมของประเภท SAPI ที่ใช้กันโดยทั่วไปบางประเภท ได้ที่ ตัวแปร

ธุรกรรม

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

ดูคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับหัวข้อนี้ได้ที่ ธุรกรรม

เริ่มต้นใช้งาน

อ่านหน้า เริ่มต้นใช้งาน เพื่อตั้งค่าโปรเจ็กต์ Sandboxed API แรก