หมวดหมู่ 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