ข้อมูลนี้มีไว้สำหรับนักพัฒนาแอปที่มีแอปซึ่งมีช่องโหว่ PendingIntent แบบไม่เจาะจงปลายทาง
สิ่งที่จะเกิดขึ้น
แอปของคุณอย่างน้อย 1 แอปมีปัญหา PendingIntent แบบไม่เจาะจงปลายทาง ซึ่งอาจก่อให้เกิดภัยคุกคามความปลอดภัยในรูปของการปฏิเสธการให้บริการ การขโมยข้อมูลส่วนตัว และการโจมตีเพื่อยกระดับสิทธิ์ได้ โปรดอ่านขั้นตอนโดยละเอียดด้านล่างเพื่อแก้ปัญหาที่เกิดขึ้นกับแอป คุณดูตําแหน่งการใช้งาน PendingIntent แบบไม่เจาะจงปลายทางในแอปได้ที่การแจ้งเตือนของ Play Console สำหรับแอปนั้นๆ หากตําแหน่งใดตำแหน่งหนึ่งลงท้ายด้วย "(ในโค้ดที่โหลดแบบไดนามิก)" แสดงว่าตําแหน่งนั้นอยู่ในโค้ดที่แอปหรือไลบรารีที่แอปใช้โหลดมาแบบไดนามิก ปกติแล้วแอปพลิเคชันมักจะใช้โค้ดที่โหลดแบบไดนามิกผ่านการนําส่งฟีเจอร์แบบออนดีมานด์ แม้ว่าจะมีเทคนิคที่ไม่แนะนําอื่นๆ อยู่ก็ตาม (เทคนิคที่ไม่แนะนําบางเทคนิคถือเป็นการละเมิดนโยบายของ Google Play และไม่ควรนำมาใช้) นอกจากนี้ เครื่องมือสร้างแพ็กเกจยังเปลี่ยนรูปแบบโค้ดของแอปพลิเคชันให้เป็นโค้ดที่โหลดแบบไดนามิกได้ด้วย
ถึงแม้เราจะไม่ได้บังคับ แต่ก็ขอแนะนำให้แก้ไขปัญหานี้ สถานะการเผยแพร่แอปจะไม่ได้รับผลกระทบจากปัญหาที่เกิดขึ้นนี้
รายละเอียดเพิ่มเติม
แอป Android ส่งข้อความระหว่างคอมโพเนนต์โดยใช้ Intent Intent สามารถระบุคอมโพเนนต์เป้าหมาย (Intent แบบเจาะจงปลายทาง) หรือแสดงรายการการดำเนินการทั่วไปและให้ระบบปฏิบัติการนำส่ง Intent ไปยังคอมโพเนนต์ใดๆ ในอุปกรณ์ที่ลงทะเบียนตัวกรอง Intent ตรงกับการดำเนินการดังกล่าว (Intent แบบไม่เจาะจงปลายทาง)
PendingIntent คือ Intent ที่มอบสิทธิ์ให้กับแอปอื่นเพื่อให้นำส่งในอนาคต การสร้าง Intent แบบไม่เจาะจงปลายทางรวมไว้ใต้ PendingIntent เป็นช่องโหว่ด้านความปลอดภัยที่อาจส่งผลให้เกิดการปฏิเสธการให้บริการ การขโมยข้อมูลส่วนตัว และการโจมตีเพื่อยกระดับสิทธิ์ได้
ขั้นตอนถัดไป
1. อัปเดตแอปและแก้ไขการแจ้งเตือน "PendingIntent แบบไม่เจาะจงปลายทาง" โดยใช้ขั้นตอนที่ไฮไลต์ไว้ด้านล่าง
ตรวจสอบตำแหน่งที่มีการสร้าง PendingIntent ในแอป ตัวอย่างเช่น โค้ดต่อไปนี้สร้าง PendingIntent ที่รวม Intent แบบไม่เจาะจงปลายทางเอาไว้
// Create an implicit base Intent and wrap it in a PendingIntent
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, 0);
Google ขอแนะนำให้นักพัฒนาแอปแก้ไขช่องโหว่ดังกล่าวโดยใช้วิธีการต่อไปนี้ (หากใช้ทุกวิธีได้ก็จะยิ่งดี)
- ตรวจสอบว่ามีการตั้งค่าช่องการดำเนินการ แพ็กเกจ และคอมโพเนนต์ของ Intent พื้นฐาน
- ตรวจสอบว่า PendingIntent นำส่งเฉพาะคอมโพเนนต์ที่เชื่อถือได้
- ใช้ FLAG_IMMUTABLE (เพิ่มเข้ามาใน SDK 23) เพื่อสร้าง PendingIntent วิธีนี้ช่วยป้องกันไม่ให้แอปที่ได้รับ PendingIntent ทำการเติมพร็อพเพอร์ตี้ที่ไม่ได้สร้างไว้ ในกรณีที่แอปทำงานบนอุปกรณ์ที่ใช้ SDK 22 หรือเก่ากว่านั้นด้วย เราขอแนะนำให้นักพัฒนาแอปใช้ตัวเลือกก่อนหน้าขณะที่เพิ่มประสิทธิภาพการสร้าง PendingIntent ด้วยรูปแบบต่อไปนี้
if (android.os.Build.VERSION.SDK_INT >= 23) {
// Create a PendingIntent using FLAG_IMMUTABLE
} else {
// Existing code that creates a PendingIntent
}
2. ส่ง APK ที่อัปเดตแล้ว
วิธีส่ง App Bundle หรือ APK ที่อัปเดตแล้ว
- ไปที่ Play Console
- เลือกแอป
- ไปที่ App Bundle Explorer
- เลือกเวอร์ชันแอปของ APK/App Bundle ที่ไม่เป็นไปตามนโยบายจากเมนูแบบเลื่อนลงที่ด้านขวาบน แล้วจดบันทึกไว้ว่ารายการดังกล่าวอยู่ในรุ่นใด
- ไปยังแทร็กที่มีปัญหาด้านนโยบาย ซึ่งจะเป็นหนึ่งใน 4 หน้าต่อไปนี้ ได้แก่ การทดสอบภายใน การทดสอบแบบปิด การทดสอบแบบเปิด หรือเวอร์ชันที่ใช้งานจริง
- ที่บริเวณด้านขวาบนของหน้า ให้คลิกสร้างรุ่นใหม่ (คุณอาจต้องคลิก "จัดการแทร็ก" ก่อน)
- หากรุ่นที่มี APK ที่ละเมิดนโยบายอยู่ในสถานะฉบับร่าง ให้ทิ้งรุ่นดังกล่าว
- เพิ่ม App Bundle หรือ APK เวอร์ชันที่เป็นไปตามนโยบาย
- ตรวจสอบว่า App Bundle หรือ APK เวอร์ชันที่ไม่เป็นไปตามนโยบายอยู่ในส่วนไม่รวมอยู่ด้วยของรุ่นนี้ ดูคำแนะนำเพิ่มเติมได้ที่ส่วน "ไม่รวมอยู่ด้วย (App Bundle และ APK)" ในบทความช่วยเหลือของ Play Console บทความนี้
- หากต้องการบันทึกการเปลี่ยนแปลงรุ่น ให้เลือกบันทึก
- เมื่อเตรียมรุ่นเรียบร้อยแล้ว ให้เลือกตรวจสอบรุ่น
หากมีการเผยแพร่ APK ที่ไม่เป็นไปตามนโยบายในหลายๆ แทร็ก ให้ทำตามขั้นตอนที่ 5-9 อีกครั้งในแต่ละแทร็ก
ระหว่างนี้แอปใหม่หรืออัปเดตของแอปจะมีสถานะอยู่ระหว่างการตรวจสอบจนกว่าจะมีการตรวจสอบคำขอ คุณจะยังคงเห็นคำเตือนหากยังไม่ได้อัปเดตแอปให้ถูกต้อง
เราพร้อมช่วยเหลือคุณ
หากมีคำถามทางเทคนิคเกี่ยวกับช่องโหว่ คุณโพสต์ถามได้ที่ Stack Overflow โดยใช้แท็ก android-security หากต้องการคำชี้แจงเกี่ยวกับขั้นตอนที่ต้องดำเนินการเพื่อแก้ไขปัญหานี้ โปรดติดต่อทีมสนับสนุนของเรา