แซนด์บ็อกซ์แอปพลิเคชัน

แพลตฟอร์ม Android ใช้ประโยชน์จากการปกป้องตามผู้ใช้ของ Linux เพื่อระบุและแยกทรัพยากรของแอป ซึ่งจะแยกแอปออกจากกัน และปกป้องแอปและระบบจากแอปที่เป็นอันตราย โดย Android จะกําหนดรหัสผู้ใช้ที่ไม่ซ้ำกัน (UID) ให้กับแอป Android แต่ละแอปและทํางานในแอปนั้นๆ ด้วยกระบวนการของตัวเอง

Android ใช้ UID เพื่อตั้งค่าแซนด์บ็อกซ์ระดับเคอร์เนลของแอปพลิเคชัน แกนหลักจะบังคับใช้ความปลอดภัยระหว่างแอปกับระบบที่ระดับกระบวนการผ่านสิ่งอํานวยความสะดวกมาตรฐานของ Linux เช่น รหัสผู้ใช้และกลุ่มที่กําหนดให้กับแอป โดยค่าเริ่มต้น แอปจะโต้ตอบกันไม่ได้และเข้าถึงระบบปฏิบัติการได้แบบจํากัด หากแอป ก พยายามทำสิ่งที่เป็นอันตราย เช่น อ่านข้อมูลของแอป ข หรือโทรออกโดยไม่ได้รับอนุญาต ระบบจะป้องกันไม่ให้แอปดังกล่าวดำเนินการดังกล่าวเนื่องจากไม่มีสิทธิ์เริ่มต้นที่เหมาะสมของผู้ใช้ Sandbox นั้นใช้งานง่าย ตรวจสอบได้ และอิงตามการแยกกระบวนการและสิทธิ์ของไฟล์ของผู้ใช้สไตล์ UNIX ที่ใช้กันมาหลายสิบปี

เนื่องจากแซนด์บ็อกซ์แอปพลิเคชันอยู่ในเคอร์เนล รูปแบบความปลอดภัยนี้จึงมีผลกับทั้งโค้ดเนทีฟและแอประบบปฏิบัติการ ซอฟต์แวร์ทั้งหมดที่อยู่เหนือเคอร์เนล เช่น ไลบรารีระบบปฏิบัติการ เฟรมเวิร์กแอป รันไทม์ของแอป และแอปทั้งหมดจะทำงานภายในแซนด์บ็อกซ์แอปพลิเคชัน ในบางแพลตฟอร์ม นักพัฒนาซอฟต์แวร์ต้องจำกัดตัวเองให้ใช้เฟรมเวิร์กการพัฒนา ชุด API หรือภาษาที่เจาะจง ใน Android ไม่มีข้อจำกัดเกี่ยวกับวิธีเขียนแอปที่จำเป็นต่อการบังคับใช้ความปลอดภัย ในแง่นี้ โค้ดเนทีฟจะอยู่ในแซนด์บ็อกซ์เช่นเดียวกับโค้ดที่ตีความ

การป้องกัน

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

Android ใช้การป้องกันหลายอย่างเพื่อบังคับใช้แซนด์บ็อกซ์ของแอป เราเริ่มใช้การบังคับใช้เหล่านี้เมื่อเวลาผ่านไป และทำให้แซนด์บ็อกซ์การควบคุมการเข้าถึงแบบมีสิทธิ์ (DAC) เดิมตาม UID แข็งแกร่งขึ้นอย่างมาก Android เวอร์ชันก่อนหน้ามีการป้องกันต่อไปนี้

  • ใน Android 5.0 SELinux ได้แยกการควบคุมการเข้าถึงแบบบังคับ (MAC) ระหว่างระบบกับแอป อย่างไรก็ตาม แอปของบุคคลที่สามทั้งหมดจะทำงานภายในบริบท SELinux เดียวกัน ดังนั้นการแยกระหว่างแอปจึงได้รับการบังคับใช้โดย UID DAC เป็นหลัก
  • ใน Android 6.0 เราได้ขยายแซนด์บ็อกซ์ SELinux เพื่อแยกแอปตามขอบเขตผู้ใช้จริง นอกจากนี้ Android ยังตั้งค่าเริ่มต้นที่ปลอดภัยยิ่งขึ้นสำหรับข้อมูลแอปด้วย โดยสำหรับแอปที่มี targetSdkVersion >= 24 สิทธิ์ DAC เริ่มต้นในไดเรกทอรีหลักของแอปจะเปลี่ยนจาก 751 เป็น 700 ซึ่งจะเป็นค่าเริ่มต้นที่ปลอดภัยยิ่งขึ้นสำหรับข้อมูลแอปส่วนตัว (แม้ว่าแอปจะลบล้างค่าเริ่มต้นเหล่านี้ได้ก็ตาม)
  • ใน Android 8.0 แอปทั้งหมดได้รับการตั้งค่าให้ทำงานด้วย seccomp-bpf
  • ใน Android 9 แอปที่ไม่มีสิทธิ์ทั้งหมดที่มี targetSdkVersion >= 28 ต้องทำงานในแซนด์บ็อกซ์ SELinux แต่ละรายการ โดยระบุ MAC ตามแอป การปกป้องนี้ช่วยปรับปรุงการแยกแอป ป้องกันการลบล้างค่าเริ่มต้นที่ปลอดภัย และ (สำคัญที่สุด) ป้องกันไม่ให้แอปทำให้ข้อมูลของตนเข้าถึงได้ทั่วโลก
  • ใน Android 10 แอปจะมีมุมมองไฟล์ระบบแบบไฟล์ดิบแบบจำกัด โดยไม่มีสิทธิ์เข้าถึงเส้นทางโดยตรง เช่น /sdcard/DCIM อย่างไรก็ตาม แอปจะยังคงมีสิทธิ์เข้าถึงแบบไฟล์ดิบอย่างเต็มรูปแบบไปยังเส้นทางเฉพาะแพ็กเกจตามที่แสดงผลโดยเมธอดที่เกี่ยวข้อง เช่น Context.getExternalFilesDir()

หลักเกณฑ์การแชร์ไฟล์

การตั้งค่าข้อมูลแอปให้เข้าถึงได้ทั่วโลกเป็นแนวทางปฏิบัติด้านความปลอดภัยที่ไม่เหมาะสม ระบบจะให้สิทธิ์เข้าถึงแก่ทุกคนและไม่สามารถจำกัดสิทธิ์เข้าถึงเฉพาะผู้รับที่ต้องการได้ แนวทางปฏิบัตินี้ทําให้เกิดการรั่วไหลของข้อมูลและการเปิดเผยช่องโหว่ของตัวแทนที่ทําให้สับสน และเป็นเป้าหมายที่มัลแวร์ชอบโจมตีแอปที่มีข้อมูลที่ละเอียดอ่อน (เช่น โปรแกรมรับส่งอีเมล) ใน Android 9 ขึ้นไป ระบบจะไม่อนุญาตให้แอปที่มีtargetSdkVersion>=28แชร์ไฟล์ด้วยวิธีนี้

โปรดใช้หลักเกณฑ์ต่อไปนี้เมื่อแชร์ไฟล์แทนที่จะทำให้ข้อมูลแอปเข้าถึงได้ทั่วโลก

สิทธิ์รันไทม์ Storage จะควบคุมการเข้าถึงคอลเล็กชันที่มีการระบุประเภทอย่างเข้มงวดผ่าน MediaStore สําหรับการเข้าถึงไฟล์ที่มีการจัดประเภทแบบไม่เข้มงวด เช่น PDF และคลาส MediaStore.Downloads แอปต้องใช้ Intent เช่น Intent ACTION_OPEN_DOCUMENT

หากต้องการเปิดใช้ลักษณะการทํางานของ Android 10 ให้ใช้แอตทริบิวต์ requestLegacyExternalStorage manifest และทําตามแนวทางปฏิบัติแนะนําเกี่ยวกับสิทธิ์ของแอป

  • ค่าเริ่มต้นของ Flag ไฟล์ Manifest คือ true สำหรับแอปที่กำหนดเป้าหมายเป็น Android 9 (และต่ำกว่า)
  • ค่าเริ่มต้นคือเท็จสำหรับแอปที่กำหนดเป้าหมายเป็น Android 10 หากต้องการเลือกไม่ใช้มุมมองพื้นที่เก็บข้อมูลที่กรองชั่วคราวในแอปที่กำหนดเป้าหมายเป็น Android 10 ให้ตั้งค่า Flag ของไฟล์ Manifest เป็น true
  • เมื่อใช้สิทธิ์ที่จํากัด โปรแกรมติดตั้งจะเพิ่มแอปที่อนุญาตสําหรับพื้นที่เก็บข้อมูลที่ไม่มีแซนด์บ็อกซ์ลงในรายการที่อนุญาต ระบบจะจัดเก็บแอปที่ไม่ใช่รายการที่อนุญาตไว้ในแซนด์บ็อกซ์