Intent ที่รอดำเนินการ
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
หมวดหมู่ 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);
แหล่งข้อมูล
แหล่งข้อมูล
แนะนำสำหรับคุณ
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-26 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 2025-07-26 UTC"],[],[],null,["# Pending intents\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-PLATFORM: Platform Interaction](https://mas.owasp.org/MASVS/09-MASVS-PLATFORM)\n\n\nOverview\n--------\n\nA [`PendingIntent`](/reference/android/app/PendingIntent) is a reference to a token maintained by the system. Application A can pass a PendingIntent to application B in order to allow application B to execute predefined actions on behalf of application A; regardless of whether application A is still alive.\n\nRisk: Mutable Pending Intents\n-----------------------------\n\nA PendingIntent can be mutable, which means that the inner intent that specifies the action can be updated by application B following the logic described in the [`fillIn()`](/reference/android/content/Intent#fillIn(android.content.Intent,%20int)) documentation. In other words, the unfilled fields of a PendingIntent can be modified by a malicious app and allow access to otherwise non-exported components of the vulnerable application.\n\n### Impact\n\nThe impact of this vulnerability varies depending on the implementation of the targeted unexported functionality of the app.\n\n### Mitigations\n\n#### General\n\nMake sure action, component, and package are set to avoid the worst vulnerabilities: \n\n### Kotlin\n\n val intent = Intent(intentAction)\n\n // Or other component setting APIs e.g. setComponent, setClass\n intent.setClassName(packageName, className)\n\n PendingIntent pendingIntent =\n PendingIntent.getActivity(\n context,\n /* requestCode = */ 0,\n intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE\n )\n\n### Java\n\n Intent intent = new Intent(intentAction);\n\n // Or other component setting APIs e.g. setComponent, setClass\n intent.setClassName(packageName, className);\n\n PendingIntent pendingIntent =\n PendingIntent.getActivity(\n getContext(),\n /* requestCode= */ 0,\n intent, /* flags= */ 0);\n\n#### Flag IMMUTABLE\n\nIf your app targets Android 6 (API level 23) or higher, [specify mutability](/guide/components/intents-filters#DeclareMutabilityPendingIntent). For example, this can be done by using [`FLAG_IMMUTABLE`](/reference/android/app/PendingIntent#FLAG_IMMUTABLE) to prevent unfilled fields from being filled in by a malicious application: \n\n### Kotlin\n\n val pendingIntent =\n PendingIntent.getActivity(\n context,\n /* requestCode = */ 0,\n Intent(intentAction),\n PendingIntent.FLAG_IMMUTABLE)\n\n### Java\n\n PendingIntent pendingIntent =\n PendingIntent.getActivity(\n getContext(),\n /* requestCode= */ 0,\n new Intent(intentAction),\n PendingIntent.FLAG_IMMUTABLE);\n\nOn Android 11 (API level 30) and higher, you have to specify which fields to make mutable, which mitigates accidental vulnerabilities of this type.\n\n### Resources\n\n- [Remediation of PendingIntent vulnerability](https://support.google.com/faqs/answer/9267555)\n\n- [Blog post about the vulnerability](https://valsamaras.medium.com/pending-intents-a-pentesters-view-92f305960f03)\n\n*** ** * ** ***\n\nRisk: Replaying Pending Intents\n-------------------------------\n\nA PendingIntent can be replayed unless the [FLAG_ONE_SHOT](/reference/android/app/PendingIntent#FLAG_ONE_SHOT) flag is set. It is important to use FLAG_ONE_SHOT to avoid replay attacks (performing actions that should not be repeatable).\n\n### Impact\n\nThe impact of this vulnerability varies depending on the implementation of the receiving end of the intent. A malicious app exploiting a PendingIntent that was created without setting the FLAG_ONE_SHOT flag could capture and re-use the intent to repeat actions that should only be able to be done once.\n\n### Mitigations\n\nPending Intents not intended to be fired multiple times should use the [FLAG_ONE_SHOT](/reference/android/app/PendingIntent#FLAG_ONE_SHOT) flag to avoid replay attacks. \n\n### Kotlin\n\n val pendingIntent =\n PendingIntent.getActivity(\n context,\n /* requestCode = */ 0,\n Intent(intentAction),\n PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)\n\n### Java\n\n PendingIntent pendingIntent =\n PendingIntent.getActivity(\n getContext(),\n /* requestCode= */ 0,\n new Intent(intentAction),\n PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);\n\n### Resources\n\n- [PendingIntent.FLAG_ONE_SHOT](/reference/android/app/PendingIntent#FLAG_ONE_SHOT)\n\n*** ** * ** ***\n\nResources\n---------\n\n- [PendingIntent documentation](/reference/android/app/PendingIntent)\n\n- [PendingIntent and intent filters](/guide/components/intents-filters#PendingIntent)\n\nRecommended for you\n-------------------\n\n- Note: link text is displayed when JavaScript is off\n- [Intent redirection](/topic/security/risks/intent-redirection)"]]