ทำไม Accessibility Service ถึงเป็น Feature ที่น่ากลัวสำหรับคนใช้ Android มาดูกัน :)
Accessibility Service เป็น feature พิเศษที่ช่วยให้ user ที่มีความบกพร่องอย่างเช่นการมองเห็น หรือผู้ที่อาจไม่สามารถโต้ตอบกับอุปกรณ์ได้อย่างสมบูรณ์ ให้สามารถใช้งานแอปพลิเคชันได้ โดย user จะต้อง allow สิทธิ์ที่สามารถควบคุมเครื่องให้กับแอปพลิเคชันนั้นๆ เช่น อนุญาตให้แอปฯ ที่ได้สิทธิ์ Accessibility อ่านข้อความบนแอปฯ ของ user ให้เป็นเสียงออกมาสำหรับคนที่ตาบอด
.
เมื่อเราอนุญาตให้สิทธิ์ Accessibility Service กับแอปพลิเคชันแล้ว แอปฯ ที่ได้สิทธิ์นั้นสามารถทำอะไรกับ Android ของเราได้บ้าง ตัวอย่างเช่น การ capture หน้าจอ, การดัก key เมื่อมีการกดบน soft keyboard, การสั่งกดปุ่มต่างๆ ในแอปฯ, การอ่าน text ในแอปฯ, การสร้าง view ขึ้นมา overlay หน้าจอ เป็นต้น
.
บทความนี้จะมาลองเล่นการอ่านค่า text ต่างๆ ในแอปฯ และการดักการกด key บน soft keyboard กัน โดยจะนำ source code มาแสดงให้เห็นเป็นบางส่วนเท่านั้น
การอ่านค่า Text ต่างๆ ในแอปฯ (คนอื่น)
- เริ่มจากสร้างแอปฯ ที่ใช้ในการขอสิทธิ์ Accessibility Service ขึ้นมา โดยจากตัวอย่างเราจะตั้งเป็นแอปฯ ที่ชื่อ “Accessibility” และ package เป็น “com.example.accessibility”
- ขอ permission Accessibility Service ให้เรียบร้อย
- ทำการ implement AccessibilityService ให้กับ class และเพิ่ม override onAccessibilityEvent() method เพื่อใช้สำหรับการดัก event ต่างๆ ที่เกิดขึ้น
จากตัวอย่างด้านบน findTextViewNode() method นี้สร้างขึ้นมาใช้สำหรับหา TextView ทั้งหมดที่แสดงบนหน้าจอ พร้อมกับ print log ค่าของ TextView นั้นๆ ออกมา
- สร้างอีกแอปฯ ขึ้นมาเพื่อใช้เป็นแอปฯ ที่ถูกอ่านข้อมูล โดยตัวอย่างจะตั้งชื่อเป็น “Example Login” และ package เป็น “com.example.examplelogin”
- ทดสอบการอ่านค่าของ TextView ในแอปฯ “Example Login” จากแอปฯ “Accessibility”
จากคลิปด้านบนเมื่อเปิดแอปฯ “Accessibility” ขึ้นมา และได้มีการขอ permission Accessibility เมื่อได้สิทธิ์นั้นแล้ว ทดสอบเปิดแอปฯ “Example Login” ซึ่งมี TextView อยู่สองจุด และถูกอ่านค่าได้คือ title “Example Login” กับ “Login”
การดัก Key เมื่อมีการกดบน Soft Keyboard
- เพิ่ม code ในส่วนของการดัก Text Changed เข้าไปใน onAccessibilityEvent() และทดลอง print log ของ key ที่กด
- ทดสอบกด keyboard จะสังเกตได้ว่าทุกครั้งที่กด จะมีการ print log ของ key นั้นออกมา
จะเห็นได้ว่าเพียงแค่ allow สิทธิ์ Accessibility ให้กับแอปฯ ใดๆ แอปฯ นั้นจะสามารถเข้าถึงข้อมูลส่วนตัวของเราในแอปฯ ต่างๆ ที่เราใช้ได้
การป้องกันสำหรับ User
หาก user ไม่ได้ต้องการใช้ feature นี้จริงๆ ให้ทำการปิดสิทธิ์นี้ให้หมดทุกแอปฯ (แต่ละ brand หรือ model ของมือถือ Android อาจจะมีการตั้งค่าที่แตกต่างกัน)
- เข้าเมนู Settings ของเครื่อง
- เลือก Accessibility
- ตรง Downloaded apps จะเป็นรายการของแอปฯ ที่มีการขอ permission Accessibility ให้เลือกแอปฯ ที่ต้องการจะยกเลิกสิทธิ์
- กด disable ที่ accessibility service name เป็นอันเสร็จสิ้น
Reference: https://developer.android.com/reference/android/accessibilityservice/AccessibilityService