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

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

ภาพรวม

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

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

แผนภาพ SAPI

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

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

Sandbox2

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

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

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

SAPI จะใช้นโยบายเริ่มต้น หรือคุณจะใช้นโยบายแซนด์บ็อกซ์เฉพาะก็ได้ โดยการกำหนดไว้ในไฟล์ส่วนหัว sandbox.h และส่งเป็นอาร์กิวเมนต์ใน กฎการสร้าง sapi_library

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

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

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

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

ออบเจ็กต์ SAPI คือออบเจ็กต์ C++ ที่แสดง API ของไลบรารีที่อยู่ในแซนด์บ็อกซ์ โดยจะ ส่งต่อการเรียกจากโค้ดโฮสต์ไปยัง RPC Stub ซึ่งฝังอยู่ในไลบรารี 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() – สร้างส่วนหัวโดยอัตโนมัติซึ่งรวมอยู่ในไบนารีของโค้ดโฮสต์ได้

ดูคำอธิบายที่ครอบคลุมมากขึ้นเกี่ยวกับกฎการสร้างได้ที่กฎการสร้าง

ตัวแปร

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

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

ธุรกรรม

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

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

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

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