ส่วนนี้มีคำแนะนำเพื่อให้มั่นใจในความปลอดภัยของแอปบน อุปกรณ์ Android
การตรวจสอบซอร์สโค้ด
การตรวจสอบซอร์สโค้ดสามารถตรวจหาปัญหาด้านความปลอดภัยได้หลากหลาย รวมถึงปัญหาที่ระบุไว้ในเอกสารนี้ Android ขอแนะนำให้ตรวจสอบซอร์สโค้ดทั้งด้วยตนเอง และโดยอัตโนมัติ
- ปฏิบัติตามคำแนะนำด้านความปลอดภัยที่ครอบคลุมเมื่อทำการตรวจสอบเพื่อให้มั่นใจถึง ความครอบคลุม ใช้มาตรฐานภายในหรือภายนอกที่เกี่ยวข้องเพื่อให้มั่นใจว่า รีวิวมีความสอดคล้องกันและครบถ้วน
- เรียกใช้โปรแกรมตรวจสอบโค้ด เช่น Android Studio linter ในโค้ดแอปทั้งหมดที่ใช้ Android SDK และแก้ไขปัญหาที่พบ
- วิเคราะห์โค้ดเนทีฟโดยใช้เครื่องมืออัตโนมัติที่ตรวจหาปัญหาการจัดการหน่วยความจำได้ เช่น บัฟเฟอร์ล้นและข้อผิดพลาดแบบออฟบายวัน
- ระบบบิลด์ของ Android รองรับ Sanitizer ของ LLVM หลายรายการ เช่น AddressSanitizer และ UndefinedBehaviorSanitizer ซึ่งใช้ในการวิเคราะห์ปัญหาที่เกี่ยวข้องกับหน่วยความจำในรันไทม์ได้ เมื่อใช้ร่วมกับ การฟัซ ซึ่งรองรับใน Android ผ่าน libFuzzer ตัวทำความสะอาดจะ ค้นพบกรณีขอบที่ผิดปกติซึ่งต้องมีการตรวจสอบเพิ่มเติม
- ผู้ประเมินด้านความปลอดภัยที่มีความรู้ควรตรวจสอบโค้ดที่มีความเสี่ยงสูงกว่า เช่น การเข้ารหัส การประมวลผลการชำระเงิน และการประมวลผล PII
การทดสอบอัตโนมัติ
การทดสอบอัตโนมัติช่วยตรวจหาปัญหาด้านความปลอดภัยได้หลากหลาย และควรดำเนินการเป็นประจำ
- เรียกใช้ CTS เวอร์ชันล่าสุดเป็นประจำ ตลอดกระบวนการพัฒนาเพื่อตรวจหาปัญหาตั้งแต่เนิ่นๆ และลดเวลา ในการแก้ไข Android ใช้ CTS เป็นส่วนหนึ่งของการผสานรวมอย่างต่อเนื่องในกระบวนการบิลด์อัตโนมัติของเรา ซึ่งจะบิลด์หลายครั้งต่อวัน
- ทำให้การทดสอบความปลอดภัยของอินเทอร์เฟซเป็นแบบอัตโนมัติ รวมถึงการทดสอบด้วยอินพุตที่ผิดรูปแบบ (การทดสอบแบบฟัซ) ระบบบิลด์ของ Android รองรับ libFuzzer สำหรับการเขียนการทดสอบแบบฟัซ
การสแกนช่องโหว่
การสแกนช่องโหว่ช่วยให้มั่นใจได้ว่าแอปที่ติดตั้งไว้ล่วงหน้าจะไม่มี ช่องโหว่ด้านความปลอดภัยที่ทราบ การตรวจหาขั้นสูงช่วยลดเวลาและ ค่าใช้จ่ายที่ต้องใช้ในการจัดการช่องโหว่เหล่านี้และป้องกันความเสี่ยงต่อ ผู้ใช้และอุปกรณ์
- สแกนแอปที่ติดตั้งไว้ล่วงหน้าทั้งหมดโดยใช้เครื่องมือสแกนช่องโหว่ของแอปที่ได้รับการยอมรับในอุตสาหกรรม และแก้ไขช่องโหว่ที่ตรวจพบ
แอปพลิเคชันที่อาจเป็นอันตราย
คุณควรตรวจสอบว่าแอปที่ติดตั้งไว้ล่วงหน้าในอุปกรณ์ไม่ใช่แอปพลิเคชันที่อาจเป็นอันตราย (PHA) คุณมีหน้าที่รับผิดชอบต่อลักษณะการทำงานของแอปทั้งหมด ที่รวมอยู่ในอุปกรณ์ ก่อนเปิดตัวอุปกรณ์ ให้สแกนแอปที่โหลดไว้ล่วงหน้าทั้งหมดเพื่อหาช่องโหว่
ดูข้อมูลเพิ่มเติมเกี่ยวกับแอปที่อาจเป็นอันตรายและวิธีที่ Google ต่อสู้กับแอปเหล่านี้ใน Play Store ได้ที่เอกสารประกอบสำหรับนักพัฒนาแอปของ Google Play Protect
การติดตั้งและสิทธิ์ของแอป
สิทธิ์ที่มากเกินไปสำหรับแอปที่ติดตั้งไว้ล่วงหน้าอาจก่อให้เกิดความเสี่ยงด้านความปลอดภัย จำกัดสิทธิ์ของแอปที่ติดตั้งไว้ล่วงหน้าให้มีสิทธิ์ขั้นต่ำที่จำเป็น และตรวจสอบว่าแอปเหล่านั้นไม่มีสิทธิ์เข้าถึงสิทธิ์หรือสิทธิพิเศษที่ไม่จำเป็น สิทธิ์ของแอปจะ อธิบายไว้ใน AndroidManifest.xml
- อย่าให้สิทธิ์หรือสิทธิ์ที่ไม่จำเป็นแก่แอปที่ติดตั้งไว้ล่วงหน้า ตรวจสอบแอปที่มีสิทธิ์ระดับระบบอย่างละเอียด เนื่องจากแอปเหล่านี้อาจมีสิทธิ์ที่ละเอียดอ่อนมาก
- ตรวจสอบว่าสิทธิ์ทั้งหมดที่ขอมีความเกี่ยวข้องและจำเป็นต่อ ฟังก์ชันการทำงานของแอปนั้นๆ
- ตรวจสอบว่ามีการเปิดเผยข้อมูลผู้ใช้สำหรับแอปที่ติดตั้งไว้ล่วงหน้าทั้งหมดที่ใช้สิทธิ์
INSTALL_PACKAGES - ตรวจสอบว่านักพัฒนาแอปมีภาระหน้าที่ตามสัญญาที่จะไม่ติดตั้งแอปใดๆ ในฐานะ UID 0
- ประเมินสิทธิ์ที่ประกาศไว้ในไฟล์ Manifest ของแอปทั้งหมดที่จะติดตั้ง ผ่านเครือข่ายของนักพัฒนาแอป
- ตรวจสอบว่านักพัฒนาแอปมีภาระหน้าที่ตามสัญญาในการสแกน URL การดาวน์โหลดทั้งหมด ของแอปอัปเดตและแอปติดตั้งอัตโนมัติด้วย Google Safe Browsing API ก่อนที่จะแสดงแอปในอุปกรณ์
การลงนามแอป
ลายเซ็นของแอปมีบทบาทสำคัญในความปลอดภัยของอุปกรณ์และใช้สำหรับการตรวจสอบสิทธิ์และการอัปเดตซอฟต์แวร์ เมื่อเลือกคีย์ที่จะใช้สำหรับ การลงนามในแอป สิ่งสำคัญที่ต้องพิจารณาคือแอปพร้อมใช้งาน ในอุปกรณ์เครื่องเดียวหรือใช้ร่วมกันในอุปกรณ์หลายเครื่อง
- ตรวจสอบว่าแอปไม่ได้ลงนามด้วยคีย์ที่ทราบกันโดยทั่วไป เช่น คีย์นักพัฒนาแอป AOSP
- ตรวจสอบว่าคีย์ที่ใช้ลงนามในแอปได้รับการจัดการในลักษณะที่สอดคล้อง กับแนวทางปฏิบัติที่เป็นมาตรฐานอุตสาหกรรมสำหรับการจัดการคีย์ที่ละเอียดอ่อน ซึ่งรวมถึง โมดูลความปลอดภัยฮาร์ดแวร์ (HSM) ที่ให้สิทธิ์เข้าถึงแบบจำกัดและตรวจสอบได้
- ตรวจสอบว่าแอปไม่ได้ลงนามด้วยคีย์แพลตฟอร์ม การดำเนินการดังกล่าวจะให้ สิทธิ์เข้าถึงสิทธิ์ลายเซ็นของแพลตฟอร์มแก่แอป ซึ่งมีประสิทธิภาพสูงและ มีไว้สำหรับใช้โดยคอมโพเนนต์ของระบบปฏิบัติการเท่านั้น แอปของระบบ ควรใช้สิทธิ์ที่มีสิทธิ์
- ตรวจสอบว่าแอปที่มีชื่อแพ็กเกจเดียวกันไม่ได้ลงนามด้วยคีย์ที่แตกต่างกัน ปัญหานี้มักเกิดขึ้นเมื่อสร้างแอปสำหรับอุปกรณ์ต่างๆ โดยเฉพาะเมื่อใช้คีย์แพลตฟอร์ม หากแอปไม่ขึ้นอยู่กับอุปกรณ์ ให้ใช้คีย์เดียวกันในอุปกรณ์ต่างๆ หากแอปเจาะจงอุปกรณ์ ให้สร้าง ชื่อแพ็กเกจและคีย์ที่ไม่ซ้ำกันต่ออุปกรณ์
แยกแอปและกระบวนการ
โมเดลแซนด์บ็อกซ์ของ Android ช่วยเพิ่มความปลอดภัยให้กับแอปและกระบวนการต่างๆ เมื่อใช้อย่างถูกต้อง
แยกกระบวนการรูท
กระบวนการรูทเป็นเป้าหมายที่พบบ่อยที่สุดของการโจมตีเพื่อยกระดับสิทธิ์ การลดจำนวนกระบวนการรูทจะช่วยลดความเสี่ยงของการยกระดับสิทธิ์
- ตรวจสอบว่าอุปกรณ์เรียกใช้โค้ดที่จำเป็นขั้นต่ำในฐานะรูท หากเป็นไปได้ ให้ใช้กระบวนการ Android ปกติแทนกระบวนการรูท หากต้องเรียกใช้กระบวนการในฐานะรูทในอุปกรณ์ ให้บันทึกกระบวนการในคำขอฟีเจอร์ AOSP เพื่อให้ตรวจสอบได้แบบสาธารณะ
- หากเป็นไปได้ ควรแยกโค้ดรูทออกจากข้อมูลที่ไม่น่าเชื่อถือและ เข้าถึงผ่านการสื่อสารระหว่างกระบวนการ (IPC) เช่น ลดฟังก์ชันการทำงานของรูท ให้เหลือเพียงบริการขนาดเล็กที่เข้าถึงได้ผ่าน Binder และเปิดเผย บริการที่มีสิทธิ์เข้าถึงลายเซ็นให้กับแอปที่มีสิทธิ์ต่ำหรือไม่มีสิทธิ์ ในการจัดการการรับส่งข้อมูลในเครือข่าย
- กระบวนการรูทต้องไม่รับฟังในซ็อกเก็ตเครือข่าย
- กระบวนการรูทต้องไม่มีรันไทม์อเนกประสงค์ เช่น Java VM
แยกแอประบบ
โดยทั่วไป แอปที่ติดตั้งไว้ล่วงหน้าไม่ควรทำงานด้วยตัวระบุที่ไม่ซ้ำกันของระบบที่แชร์ (UID) หากแอปจำเป็นต้องใช้ UID ที่แชร์ของระบบหรือบริการที่มีสิทธิ์อื่น (เช่น โทรศัพท์) แอปไม่ควรส่งออกบริการ ตัวรับสัญญาณออกอากาศ หรือผู้ให้บริการเนื้อหาใดๆ ที่แอปของบุคคลที่สามซึ่งผู้ใช้ติดตั้งสามารถเข้าถึงได้
- ตรวจสอบว่าอุปกรณ์เรียกใช้โค้ดที่จำเป็นขั้นต่ำในฐานะระบบ หากเป็นไปได้ ให้ใช้กระบวนการ Android ที่มี UID ของตัวเองแทนที่จะใช้ UID ของระบบซ้ำ
- หากเป็นไปได้ ควรแยกโค้ดของระบบออกจากข้อมูลที่ไม่น่าเชื่อถือ และ แสดง IPC เฉพาะต่อกระบวนการอื่นๆ ที่เชื่อถือได้
- กระบวนการของระบบต้องไม่รับฟังในซ็อกเก็ตเครือข่าย นี่เป็นข้อกำหนดของ CTS
แยกกระบวนการ
แซนด์บ็อกซ์แอปพลิเคชัน Android ช่วยให้แอปคาดหวังได้ถึง การแยกจากกระบวนการอื่นๆ ในระบบ ซึ่งรวมถึงกระบวนการรูทและ ดีบักเกอร์ เว้นแต่แอปและผู้ใช้จะเปิดใช้การแก้ไขข้อบกพร่องโดยเฉพาะ ไม่มีแอปใดควรละเมิดความคาดหวังดังกล่าว
- ตรวจสอบว่ากระบวนการรูทไม่ได้เข้าถึงข้อมูลภายในโฟลเดอร์ข้อมูลแอปแต่ละรายการ เว้นแต่จะใช้วิธีการแก้ไขข้อบกพร่องของ Android ที่มีการบันทึกไว้
- ตรวจสอบว่ากระบวนการรูทไม่ได้เข้าถึงหน่วยความจำของแอป เว้นแต่จะใช้ วิธีการแก้ไขข้อบกพร่องของ Android ที่มีการบันทึกไว้
- ตรวจสอบว่าอุปกรณ์ไม่มีแอปที่เข้าถึงข้อมูลหรือหน่วยความจำของ แอปหรือกระบวนการอื่นๆ