共享平板的两个人,A在前台刷视频,B在后台收短信。B的银行验证码弹出来,A的屏幕朗读器突然念出了这串数字。
这不是科幻场景。2022年,Android系统的一个漏洞让这种事真实发生过。Google为此支付了5000美元赏金,修复代码只有三行。
![]()
多用户模式的隐患
Android支持多用户共享设备,每台平板可以创建多个独立账户,各自拥有应用和数据空间。这个功能在平板常见,部分手机也内置了相关代码。
但多用户架构与无障碍服务存在天然张力。屏幕朗读器需要高权限才能遍历界面元素、读取文本内容。这种"看穿一切"的能力,理论上应当被限制在当前用户空间内。
TalkBack是Google官方的Android屏幕朗读器。它通常只朗读用户当前聚焦的界面元素,但系统提供了两种强制触发朗读的机制:一是已废弃的announceForAccessibility()方法,二是"实时区域"(live regions)——当界面某部分自动更新时,系统会发送无障碍事件广播,朗读器捕获后读出内容。状态栏通知就是典型的实时区域。
漏洞核心:漏掉的用户校验
问题出在NotificationManagerService。当系统分发通知相关的无障碍事件时,代码没有验证该通知是否属于当前前台用户。
具体攻击路径如下:设备存在用户Alice(前台活跃)和用户Bob(后台驻留)。Bob收到含验证码的短信,系统生成通知并触发无障碍事件,事件携带完整文本内容。Alice会话中的TalkBack收到广播,直接朗读"Your verification code is 3291"。
风险不止于屏幕朗读器。Android的无障碍事件会广播给所有已注册的无障碍服务——Tasker等自动化工具、通知记录类应用都能截获这些数据。
修复:一个条件判断
Google的修复极其简洁。在事件分发逻辑中增加一行用户归属校验:
&& isNotificationForCurrentUser(record)
该方法仅在通知所有者与前台用户一致时返回true,后台用户的通知不再触发无障碍广播。配合单元测试防止回归,漏洞编号CVE-2022-20448,定级高危。
漏洞于2022年6月29日报告,11月安全补丁修复。5000美元赏金相对于漏洞影响范围显得克制——它暴露了Android权限模型中一个基础假设的失效:高权限服务与多用户隔离的边界,比想象中更脆弱。
这个案例的启示在于,系统级安全往往崩溃于单个条件判断的缺失。当无障碍服务被设计为"跨越界面边界"时,谁来为它划定用户边界,需要更严格的代码审计。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.