หมวดหมู่ OWASP: MASVS-CODE: คุณภาพโค้ด
ภาพรวม
public abstract Context createPackageContext (String packageName, int flags)
วิธีการ createPackageContext ใช้เมื่อนักพัฒนาแอปต้องการสร้างบริบทสําหรับแอปพลิเคชันอื่นในแอปพลิเคชันของตนเอง
ตัวอย่างเช่น หากนักพัฒนาแอปต้องการรับทรัพยากรจากแอปพลิเคชันของบุคคลที่สามหรือเรียกใช้เมธอดจากแอปพลิเคชันดังกล่าว ก็ต้องใช้ createPackageContext
อย่างไรก็ตาม หากแอปพลิเคชันเรียกใช้ createPackageContext ด้วย Flag CONTEXT_IGNORE_SECURITY และ CONTEXT_INCLUDE_CODE แล้วเรียกใช้ getClassLoader() อาจส่งผลให้แอปพลิเคชันมีช่องโหว่ในการเรียกใช้โค้ดโดยแอปพลิเคชันที่เป็นอันตราย กรณีนี้อาจเกิดขึ้นได้ เช่น เมื่อผู้โจมตีแอบอ้างเป็นชื่อแพ็กเกจที่ยังไม่ได้อ้างสิทธิ์ (การแย่งชิงชื่อแพ็กเกจ) ซึ่งนักพัฒนาแอปคาดหวังว่าจะมีอยู่ในอุปกรณ์ของผู้ใช้
สรุปเกณฑ์ที่ต้องปฏิบัติตามเพื่อให้แอปพลิเคชันมีช่องโหว่ต่อการโจมตีประเภทนี้
แอปที่มีช่องโหว่:
- โทรหา
createPackageContextด้วยCONTEXT_IGNORE_SECURITYและCONTEXT_INCLUDE_CODE - เรียก
getClassLoader()ในบริบทที่ดึงข้อมูล
แอปที่เป็นอันตราย
- อ้างสิทธิ์ชื่อแพ็กเกจที่แอปที่มีช่องโหว่ส่งให้กับ
createPackageContextได้ - ส่งออก android:appComponentFactory
ผลกระทบ
เมื่อแอปพลิเคชันใช้ createPackageContext ในลักษณะที่ไม่ปลอดภัย อาจทําให้แอปพลิเคชันที่เป็นอันตรายสามารถเรียกใช้โค้ดโดยไม่มีกฎเกณฑ์ในบริบทของแอปพลิเคชันที่ยังมีช่องโหว่
การลดปัญหา
อย่าเรียก createPackageContext ด้วย CONTEXT_IGNORE_SECURITY และ CONTEXT_INCLUDE_CODE เว้นแต่จำเป็นจริงๆ
ในกรณีที่หลีกเลี่ยงไม่ได้ ให้ใช้กลไกเพื่อยืนยันตัวตนของแพ็กเกจที่คุณกำลังเรียกใช้ createPackageContext (เช่น โดยการยืนยันลายเซ็นของแพ็กเกจ)
แหล่งข้อมูล
- เอกสารประกอบเกี่ยวกับ createPackageContext
- OverSecured blog post on createPackageContext code execution