หมวดหมู่ OWASP: MASVS-PLATFORM: การโต้ตอบกับแพลตฟอร์ม
ภาพรวม
PendingIntent
เป็นการอ้างอิงถึงโทเค็นที่ระบบดูแลรักษา แอปพลิเคชัน ก สามารถส่ง PendingIntent ไปยังแอปพลิเคชัน ข เพื่อให้แอปพลิเคชัน ข ดำเนินการที่กําหนดไว้ล่วงหน้าในนามของแอปพลิเคชัน ก ไม่ว่าแอปพลิเคชัน ก จะยังคงทํางานอยู่หรือไม่ก็ตาม
ความเสี่ยง: Intent ที่รอดำเนินการซึ่งเปลี่ยนแปลงได้
PendingIntent เปลี่ยนแปลงได้ ซึ่งหมายความว่าแอปพลิเคชัน ข. จะอัปเดต Intent ภายในที่ระบุการดำเนินการได้ตามตรรกะที่อธิบายไว้ในเอกสารประกอบของ fillIn()
กล่าวคือ แอปที่เป็นอันตรายสามารถแก้ไขช่องที่ยังไม่ได้กรอกของ PendingIntent และอนุญาตให้เข้าถึงคอมโพเนนต์ที่ไม่ได้ส่งออกของแอปพลิเคชันที่มีช่องโหว่
ผลกระทบ
ผลกระทบของช่องโหว่นี้แตกต่างกันไปตามการใช้งานฟังก์ชันการทำงานที่ไม่ได้ส่งออกซึ่งกำหนดเป้าหมายของแอป
การลดปัญหา
ทั่วไป
ตรวจสอบว่าได้ตั้งค่าการดำเนินการ คอมโพเนนต์ และแพ็กเกจเพื่อหลีกเลี่ยงช่องโหว่ที่เลวร้ายที่สุด ดังนี้
Kotlin
val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
)
Java
Intent intent = new Intent(intentAction);
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
intent, /* flags= */ 0);
Flag IMMUTABLE
หากแอปกำหนดเป้าหมายเป็น Android 6 (API ระดับ 23) ขึ้นไป ให้ระบุการเปลี่ยนแปลง เช่น คุณสามารถดำเนินการนี้โดยใช้ FLAG_IMMUTABLE
เพื่อป้องกันไม่ให้แอปพลิเคชันที่เป็นอันตรายกรอกข้อมูลในช่องที่ยังไม่ได้กรอก
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
ใน Android 11 (API ระดับ 30) ขึ้นไป คุณต้องระบุช่องที่จะทําให้เปลี่ยนแปลงได้ ซึ่งจะช่วยลดช่องโหว่ประเภทนี้ที่เกิดขึ้นโดยไม่ตั้งใจ
แหล่งข้อมูล
ความเสี่ยง: การเล่น Intent ที่รอดําเนินการซ้ำ
PendingIntent สามารถเล่นซ้ำได้ เว้นแต่จะมีการตั้งค่า Flag FLAG_ONE_SHOT คุณควรใช้ FLAG_ONE_SHOT เพื่อหลีกเลี่ยงการโจมตีแบบเล่นซ้ำ (การดำเนินการที่ไม่ควรทำซ้ำ)
ผลกระทบ
ผลกระทบของช่องโหว่นี้แตกต่างกันไปตามการใช้งานปลายทางที่รับ Intent แอปที่เป็นอันตรายซึ่งใช้ประโยชน์จาก PendingIntent ที่สร้างขึ้นโดยไม่ตั้งค่า Flag FLAG_ONE_SHOT อาจบันทึกและนํา Intent มาใช้ซ้ำเพื่อดําเนินการซ้ำซึ่งควรทําได้เพียงครั้งเดียว
การลดปัญหา
Intent ที่รอดำเนินการซึ่งไม่ได้มีไว้เพื่อเรียกใช้หลายครั้งควรใช้ Flag FLAG_ONE_SHOT เพื่อหลีกเลี่ยงการโจมตีแบบเล่นซ้ำ
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
แหล่งข้อมูล
แหล่งข้อมูล
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- การเปลี่ยนเส้นทาง Intent