การลักลอบใช้ Intent แบบไม่เจาะจงปลายทาง

หมวดหมู่ OWASP: MASVS-PLATFORM: การโต้ตอบกับแพลตฟอร์ม

ภาพรวม

ช่องโหว่การลักลอบใช้Intent ที่ไม่ชัดแจ้งจะเกิดขึ้นเมื่อแอปพลิเคชันไม่ได้ระบุชื่อคลาสหรือแพ็กเกจคอมโพเนนต์ที่สมบูรณ์เมื่อเรียกใช้ Intent ซึ่งทำให้แอปพลิเคชันที่เป็นอันตรายสามารถลงทะเบียนตัวกรอง Intent เพื่อขัดขวาง Intent แทนแอปพลิเคชันที่ต้องการ

ผู้โจมตีอาจอ่านหรือแก้ไขข้อมูลที่ละเอียดอ่อน หรือโต้ตอบกับออบเจ็กต์ที่เปลี่ยนแปลงได้ เช่น ออบเจ็กต์ที่เปลี่ยนแปลงได้ PendingIntent หรือ Binder ทั้งนี้ขึ้นอยู่กับเนื้อหาของ Intent

การลักลอบใช้ Intent ที่ไม่ชัดแจ้งยังช่วยให้ผู้โจมตีดําเนินการต่างๆ ได้ตามต้องการ เช่น การเปิดตัวคอมโพเนนต์ที่ผู้โจมตีควบคุม

ผลกระทบ

หาก Intent ที่ไม่ชัดซึ่งจัดการข้อมูลที่ละเอียดอ่อนส่งโทเค็นเซสชันภายในสตริง URL เพิ่มเติมเพื่อเปิด WebView แอปพลิเคชันใดก็ตามที่ระบุตัวกรอง Intent ที่เหมาะสมจะอ่านโทเค็นนี้ได้ ซึ่งอาจทำให้แอปพลิเคชันที่กําหนดค่าอย่างถูกต้องในอุปกรณ์สามารถดักจับ Intent และอ่านข้อมูลที่ละเอียดอ่อนภายในได้ ซึ่งจะทําให้ผู้โจมตีสามารถลักลอบนำข้อมูล เช่น PII หรือโทเค็นเซสชัน ออกไปได้

การลดปัญหา

ระบุ Intent อย่างชัดเจนโดยเรียกใช้ setPackage() เว้นแต่แอปพลิเคชันจะกำหนดไว้ ซึ่งช่วยให้คอมโพเนนต์ที่เฉพาะเจาะจง (ในแอปหรือจากแอปพลิเคชันอื่นๆ) เท่านั้นที่ตีความ Intent ได้ ซึ่งจะช่วยป้องกันไม่ให้แอปพลิเคชันที่ไม่น่าเชื่อถือดักรับข้อมูลที่ส่งไปพร้อมกับ Intent ข้อมูลโค้ดต่อไปนี้แสดงวิธีทำให้ Intent ชัดเจน

Kotlin

val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
    addCategory("android.intent.category.OPENABLE")
    setPackage("com.some.packagename")
    setType("*/*")
    putExtra("android.intent.extra.LOCAL_ONLY", true)
    putExtra("android.intent.extra.TITLE", "Some Title")
}
startActivity(intent)

Java

Intent intent = new Intent("android.intent.action.CREATE_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setPackage("com.some.packagename");
intent.setType("*/*");
intent.putExtra("android.intent.extra.LOCAL_ONLY", true);
intent.putExtra("android.intent.extra.TITLE", "Some Title");
startActivity(intent);

หากจำเป็นต้องใช้ Intent ที่ไม่ชัดแจ้ง ให้ละเว้นข้อมูลที่ละเอียดอ่อนหรือออบเจ็กต์ที่เปลี่ยนแปลงได้ซึ่งไม่ต้องการเปิดเผย คุณอาจต้องใช้ Intent ที่ไม่ชัดเมื่อแอปไม่มีความรู้ที่แน่นอนว่าแอปใดจะดำเนินการ (เช่น เขียนอีเมล ถ่ายภาพ ฯลฯ)

แหล่งข้อมูล