หมวดหมู่ OWASP: MASVS-PLATFORM: การโต้ตอบกับแพลตฟอร์ม
ภาพรวม
การลักลอบดักจับการแตะ (Tapjacking) เป็นแอป Android ที่เทียบเท่ากับช่องโหว่ของเว็บในการลักลอบดักจับการคลิก (Clickjacking): แอปที่เป็นอันตรายจะหลอกลวงผู้ใช้ให้คลิกการควบคุมที่เกี่ยวข้องกับความปลอดภัย (ปุ่มยืนยัน ฯลฯ) โดยการบดบัง UI ด้วยการวางซ้อนหรือด้วยวิธีอื่นๆ ในหน้านี้ เราจะแยกความแตกต่างของการโจมตี 2 รูปแบบ ได้แก่ การบดบังทั้งหมดและการบดบังบางส่วน ในการบดบังแบบเต็ม ผู้โจมตีจะวางซ้อนพื้นที่การแตะ ส่วนในการบดบังบางส่วน พื้นที่การแตะจะยังคงไม่ถูกบดบัง
ผลกระทบ
การโจมตีแบบ Tapjacking ใช้เพื่อหลอกลวงให้ผู้ใช้ดำเนินการบางอย่าง ผลกระทบจะขึ้นอยู่กับการดำเนินการที่ผู้โจมตีกำหนดเป้าหมายไว้
ความเสี่ยง: การบดบังทั้งหมด
ในการบดบังแบบเต็ม ผู้โจมตีจะวางซ้อนพื้นที่การสัมผัสเพื่อลักลอบใช้การโต้ตอบแบบสัมผัส

การผ่อนปรนชั่วคราว
การบดบังทั้งหมดจะป้องกันได้โดยการตั้งค่า View.setFilterTouchesWhenObscured(true) ในโค้ด การดำเนินการนี้จะบล็อกการแตะที่ส่งผ่านการวางซ้อน หากต้องการใช้แนวทางแบบประกาศ คุณยังสามารถเพิ่ม android:filterTouchesWhenObscured="true" ในไฟล์เลย์เอาต์สำหรับออบเจ็กต์ View ที่ต้องการปกป้องได้ด้วย
ความเสี่ยง: การบดบังบางส่วน
ในการโจมตีแบบบดบังบางส่วน พื้นที่การสัมผัสจะยังคงไม่ถูกบดบัง ดังนี้

การผ่อนปรนชั่วคราว
คุณสามารถลดการบดบังบางส่วนได้โดยละเว้นการโต้ตอบแบบสัมผัสที่มีแฟล็ก FLAG_WINDOW_IS_PARTIALLY_OBSCURED ด้วยตนเอง ไม่มีการป้องกันเริ่มต้นสำหรับสถานการณ์นี้
Android 14 และ accessibilityDataSensitive: ใน Android 14 (ระดับ API 34) ขึ้นไป คุณสามารถใช้แฟล็ก accessibilityDataSensitive เพื่อปกป้องข้อมูลที่ละเอียดอ่อนจากบริการการช่วยเหลือพิเศษที่เป็นอันตรายได้ เมื่อคุณตั้งค่าแฟล็กนี้ในมุมมองที่มีความละเอียดอ่อน เช่น หน้าจอเข้าสู่ระบบหรือหน้าจอยืนยันธุรกรรม จะมีเฉพาะบริการที่ประกาศ android:isAccessibilityTool="true" เท่านั้นที่สามารถอ่านข้อมูลของมุมมองหรือดำเนินการด้านการช่วยเหลือพิเศษในมุมมองนั้นได้ ใน Android 16 (ระดับ API 36) ขึ้นไป accessibilityDataSensitive จะบล็อกท่าทางสัมผัสที่จำลองขึ้นซึ่งแทรกด้วย AccessibilityService.dispatchGesture โดยบริการที่ไม่ได้ประกาศ android:isAccessibilityTool="true" ด้วย ซึ่งจะช่วยป้องกันการดักฟังและการโจมตีแบบแทรกโค้ดในระดับระบบ ซึ่งเป็นลักษณะเฉพาะของสถานการณ์การบดบังบางส่วน คุณสามารถเปิดใช้ accessibilityDataSensitive โดยนัยได้โดยระบุ android:filterTouchesWhenObscured="true" ในไฟล์เลย์เอาต์
ความเสี่ยงที่เฉพาะเจาะจง
ส่วนนี้จะรวบรวมความเสี่ยงที่ต้องใช้กลยุทธ์การลดความเสี่ยงที่ไม่ได้มาตรฐานหรือได้รับการลดความเสี่ยงในระดับ SDK บางระดับ และแสดงไว้ที่นี่เพื่อความสมบูรณ์
ความเสี่ยง: android.Manifest.permission.SYSTEM_ALERT_WINDOW
สิทธิ์ SYSTEM_ALERT_WINDOW อนุญาตให้แอปสร้างหน้าต่างที่แสดงด้านบนของแอปทั้งหมด
การผ่อนปรนชั่วคราว
Android เวอร์ชันใหม่ๆ ได้เปิดตัวการลดความเสี่ยงหลายอย่าง ซึ่งรวมถึงสิ่งต่อไปนี้
- ใน Android 6 (ระดับ API 23) ขึ้นไป ผู้ใช้ต้องให้สิทธิ์อย่างชัดแจ้งเพื่อให้แอปสร้างหน้าต่างวางซ้อนได้
- ใน Android 12 (API ระดับ 31) ขึ้นไป แอปสามารถส่ง
trueไปยังWindow.setHideOverlayWindows()ได้
ความเสี่ยง: ข้อความ Toast ที่กำหนดเอง
ผู้โจมตีสามารถใช้ Toast.setView() เพื่อปรับแต่งลักษณะที่ปรากฏของข้อความ Toast ได้ ใน Android 10 (ระดับ API 29) และต่ำกว่า แอปที่เป็นอันตรายอาจเปิดข้อความโทสต์ดังกล่าวจากเบื้องหลังได้
การผ่อนปรนชั่วคราว
หากแอปกำหนดเป้าหมายเป็น Android 11 (ระดับ API 30) ขึ้นไป ระบบจะบล็อกข้อความ Toast ที่กำหนดเองในเบื้องหลัง อย่างไรก็ตาม การลดความเสี่ยงนี้อาจหลบเลี่ยงได้ในบางสถานการณ์โดยใช้ Toast burst ซึ่งผู้โจมตีจะจัดคิวข้อความโทสต์หลายรายการขณะอยู่ในเบื้องหน้า และข้อความเหล่านั้นจะยังคงเปิดขึ้นแม้ว่าแอปจะไปอยู่ที่เบื้องหลังแล้วก็ตาม
การโจมตีด้วยข้อความโทสต์ในเบื้องหลังและการโจมตีด้วยข้อความโทสต์จำนวนมากได้รับการบรรเทาอย่างเต็มรูปแบบตั้งแต่ Android 12 (ระดับ API 31) เป็นต้นไป
ความเสี่ยง: กิจกรรมที่น่าสงสัย
หากแอปที่เป็นอันตรายสามารถโน้มน้าวให้ผู้ใช้เปิดแอปได้ แอปนั้นจะยังคงเปิดกิจกรรมจากแอปที่เป็นเหยื่อได้ และวางซ้อนกิจกรรมของตนเองในภายหลัง ซึ่งจะทำให้เกิดกิจกรรมแซนด์วิชและการโจมตีแบบบดบังบางส่วน
การผ่อนปรนชั่วคราว
ดูการลดความเสี่ยงทั่วไปสำหรับการบดบังบางส่วน สำหรับการป้องกันหลายชั้น โปรดตรวจสอบว่าคุณไม่ได้ส่งออกกิจกรรมที่ไม่จำเป็นต้องส่งออกเพื่อป้องกันไม่ให้ผู้โจมตีแทรกแซงกิจกรรมเหล่านั้น
แหล่งข้อมูล
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- android:exported
- # การจัดการคีย์ {:#key-management}
- เรียกใช้โค้ด DEX ที่ฝังไว้จาก APK โดยตรง