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

แพลตฟอร์ม 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

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

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

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

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