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

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

ภาพรวม

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

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

แผนภาพ SAPI

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

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

Sandbox2

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

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

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

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

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

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

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

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

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

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

รหัสโฮสต์

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

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

แนวคิด

กฎการสร้างของ Bazel

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

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

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

ตัวแปร

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

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

ธุรกรรม

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

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

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

อ่านข้อมูลในหน้าเริ่มต้นใช้งานเพื่อสร้างโปรเจ็กต์ API ที่แซนด์บ็อกซ์เป็นครั้งแรก