แพลตฟอร์ม Android ใช้ประโยชน์จากการป้องกันตามผู้ใช้ Linux เพื่อระบุและแยกทรัพยากรของแอป ซึ่งจะแยกแอปออกจากกันและปกป้องแอปและระบบจากแอปที่เป็นอันตราย ในการดำเนินการนี้ Android จะกำหนด ID ผู้ใช้ที่ไม่ซ้ำกัน (UID) ให้กับแอปพลิเคชัน Android แต่ละตัวและเรียกใช้ในกระบวนการของตัวเอง
Android ใช้ UID เพื่อตั้งค่า Application Sandbox ระดับเคอร์เนล เคอร์เนลบังคับใช้ความปลอดภัยระหว่างแอพและระบบในระดับกระบวนการผ่านสิ่งอำนวยความสะดวกมาตรฐานของ Linux เช่น ID ผู้ใช้และกลุ่มที่กำหนดให้กับแอพ ตามค่าเริ่มต้น แอปไม่สามารถโต้ตอบกันและมีสิทธิ์เข้าถึงระบบปฏิบัติการอย่างจำกัด หากแอป A พยายามทำสิ่งที่เป็นอันตราย เช่น อ่านข้อมูลของแอปพลิเคชัน B หรือกดโทรศัพท์โดยไม่ได้รับอนุญาต แอปนั้นจะถูกป้องกันไม่ให้ทำเช่นนั้นเนื่องจากไม่มีสิทธิ์ผู้ใช้เริ่มต้นที่เหมาะสม แซนด์บ็อกซ์นั้นเรียบง่าย ตรวจสอบได้ และอิงตามการแยกกระบวนการและการอนุญาตไฟล์แบบผู้ใช้สไตล์ UNIX ที่มีอายุหลายสิบปี
เนื่องจาก Application Sandbox อยู่ในเคอร์เนล โมเดลการรักษาความปลอดภัยนี้จึงขยายไปยังทั้งโค้ดเนทีฟและแอปพลิเคชันระบบปฏิบัติการ ซอฟต์แวร์ทั้งหมดที่อยู่เหนือเคอร์เนล เช่น ไลบรารี OS, กรอบงานแอปพลิเคชัน, รันไทม์ของแอปพลิเคชัน และแอปพลิเคชันทั้งหมด ทำงานภายใน Application Sandbox ในบางแพลตฟอร์ม นักพัฒนาถูกจำกัดให้ใช้เฟรมเวิร์กการพัฒนา ชุด API หรือภาษาเฉพาะ บน Android ไม่มีข้อจำกัดเกี่ยวกับวิธีการเขียนแอปพลิเคชันที่จำเป็นในการบังคับใช้ความปลอดภัย ในแง่นี้ โค้ดเนทีฟจะถูกแซนด์บ็อกซ์เหมือนกับโค้ดที่ตีความ
การป้องกัน
โดยทั่วไป หากต้องการแยก Application Sandbox ออกจากอุปกรณ์ที่มีการกำหนดค่าอย่างเหมาะสม จะต้องลดความปลอดภัยของเคอร์เนล 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
ซึ่งจำกัด syscalls ที่แอปได้รับอนุญาตให้ใช้ ซึ่งจะช่วยเสริมความแข็งแกร่งให้กับขอบเขตของแอป/เคอร์เนล - ใน Android 9 แอปที่ไม่ได้รับสิทธิ์ทั้งหมดที่มี
targetSdkVersion >= 28
จะต้องทำงานในแซนด์บ็อกซ์ SELinux แต่ละรายการ โดยจัดให้มี MAC เป็นรายแอป การป้องกันนี้ปรับปรุงการแยกแอป ป้องกันการแทนที่ค่าเริ่มต้นที่ปลอดภัย และ (ที่สำคัญที่สุด) ป้องกันแอปไม่ให้เข้าถึงโลกข้อมูลของตนได้ - ในแอป Android 10 มีมุมมองดิบของระบบไฟล์ที่จำกัด โดยไม่มีการเข้าถึงโดยตรงไปยังเส้นทางเช่น /sdcard/DCIM อย่างไรก็ตาม แอปยังคงเข้าถึงเส้นทางเฉพาะแพ็กเกจโดยสมบูรณ์ ตามที่ส่งคืนโดยวิธีการที่เกี่ยวข้อง เช่น Context.getExternalFilesDir()
คำแนะนำในการแชร์ไฟล์
การตั้งค่าข้อมูลแอปให้เข้าถึงได้ทั่วโลกถือเป็นแนวทางปฏิบัติด้านความปลอดภัยที่ไม่ดี ให้สิทธิ์การเข้าถึงแก่ทุกคน และไม่สามารถจำกัดการเข้าถึงเฉพาะผู้รับที่ต้องการได้ แนวทางปฏิบัตินี้ได้นำไปสู่การรั่วไหลของข้อมูลและช่องโหว่รองที่สับสน และเป็นเป้าหมายยอดนิยมสำหรับมัลแวร์ที่กำหนดเป้าหมายแอปที่มีข้อมูลที่ละเอียดอ่อน (เช่น ไคลเอนต์อีเมล) ใน Android 9 และสูงกว่า การแชร์ไฟล์ด้วยวิธีนี้ไม่ได้รับอนุญาตอย่างชัดเจนสำหรับแอปที่มี targetSdkVersion>=28
แทนที่จะทำให้ข้อมูลแอปเข้าถึงได้ทั่วโลก ให้ใช้แนวทางต่อไปนี้เมื่อแชร์ไฟล์:
- หากแอพของคุณต้องการแชร์ไฟล์กับแอพอื่น ให้ใช้ ผู้ให้บริการเนื้อหา ผู้ให้บริการเนื้อหาแบ่งปันข้อมูลด้วยรายละเอียดที่เหมาะสมและไม่มีข้อเสียหลายประการของสิทธิ์ UNIX ที่สามารถเข้าถึงได้ทั่วโลก (สำหรับรายละเอียด โปรดดูที่ ข้อมูลพื้นฐานของผู้ให้บริการเนื้อหา )
- หากแอปของคุณมีไฟล์ที่คนทั่วโลกควรสามารถเข้าถึงได้ (เช่น รูปภาพ) ไฟล์เหล่านั้นจะต้องเป็นสื่อเฉพาะ (รูปภาพ วิดีโอ และไฟล์เสียงเท่านั้น) และจัดเก็บโดยใช้คลาส MediaStore (สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีเพิ่มรายการสื่อ โปรดดู ที่ เข้าถึงไฟล์สื่อจากที่จัดเก็บข้อมูลที่ใช้ร่วมกัน )
สิทธิ์รันไทม์ ของ Storage จะควบคุมการเข้าถึงคอลเลกชันที่พิมพ์อย่างยิ่งผ่าน MediaStore สำหรับการเข้าถึงไฟล์ที่พิมพ์ไม่ชัดเจน เช่น PDF และคลาส MediaStore.Downloads แอปต้องใช้ Intent เช่น ACTION_OPEN_DOCUMENT Intent
หากต้องการเปิดใช้งานลักษณะการทำงานของ Android 10 ให้ใช้แอตทริบิวต์รายการ requestLegacyExternalStorage
และปฏิบัติตาม แนวทางปฏิบัติที่ดีที่สุดสำหรับการอนุญาตของแอป
- ค่าเริ่มต้นแฟล็กรายการจะเป็น
true
สำหรับแอปที่กำหนดเป้าหมายเป็น Android 9 (และต่ำกว่า) - ค่าเริ่มต้นเป็นเท็จสำหรับแอปที่กำหนดเป้าหมายเป็น Android 10 หากต้องการเลือกไม่ใช้มุมมองพื้นที่เก็บข้อมูลที่กรองชั่วคราวในแอปที่กำหนดเป้าหมายเป็น Android 10 ให้ตั้งค่าของแฟล็กรายการเป็น
true
- ด้วยการใช้สิทธิ์ที่จำกัด โปรแกรมติดตั้งจะอนุญาตแอพที่อนุญาตสำหรับพื้นที่เก็บข้อมูลที่ไม่ใช่แซนด์บ็อกซ์ แอปที่ไม่อยู่ในรายการที่อนุญาตพิเศษจะถูกแซนด์บ็อกซ์