前言
国外研究人员披露了Android漏洞(CVE-2018-9489)的信息。Android系统的内部广播机制会暴露敏感的用户和设备信息,手机上安装的应用可在用户不知情或未经许可的情况下访问获取这些信息。
Android系统的内部广播机制泄露的数据包括:Wi-Fi网络名称、Wi-Fi网络BSSID,本地IP地址、DNS服务器信息和设备的MAC地址等详细信息。部分信息(如Mac地址)在Android 6版本以上无法通过这个漏洞获取,但是剩下的依然可以通过监听广播来绕过权限检查和其他防范措施。
背景
Android是谷歌开发的用于手机和平板电脑的开源操作系统,保守估计全球有超过20亿台设备运行Android。Android上的应用程序通常与系统隔离,但是通过几种机制仍然可以实现应用程序的进程与操作系统间的交互。
比如说这次问题的源头。Android提供了“ Intent ”作为进程间的通信方式之一,该机制允许应用程序或系统发送可由其他应用程序收听的消息。尽管开发人员可以选择关闭或限制这个机制,但是在实践过程中工程师往往疏于部署限制机制或屏蔽敏感数据。这就导致了上文中的Android漏洞,手机上的恶意软件可以监听并捕获其他应用程序广播的消息。
安卓系统提供的最常见的安全机制是权限控制,旨在保护用户的隐私信息不受侵害。应用程序必须通过应用程序清单(“ AndroidManifest.xml ”)中的特殊“ uses-permission ”标记明确请求访问某些信息或功能。根据许可的类型(如“正常”、“危险”等),系统可以在应用安装期间向用户显示授权信息,或者在运行期间再次提示。某些权限只能由系统应用程序使用,并且不向第三方开发人员开放。
Google Play和运行时的应用程序权限截图:
漏洞详情
Android系统通过“ Intent ”机制广播有关Wi-Fi连接和Wi-Fi网络接口的信息:
WifiManager的NETWORK_STATE_CHANGED_ACTION
WifiP2pManager的WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
这些信息包括设备的MAC地址、Wi-Fi接入点的BSSID、网络名称以及本地IP、网关IP和DNS服务器地址等信息。此信息可供用户设备上运行的所有应用程序使用。
虽然应用程序也可以通过WifiManager访问此信息,但这样的话需要应用程序清单中的“ ACCESS_WIFI_STATE ”权限。通过Wi-Fi进行地理定位通常需要“ ACCESS_FINE_LOCATION ”或“ ACCESS_COARSE_LOCATION ”权限。此外,在Android版本6.0及更高版本中,设备的实际MAC地址不再通过API提供,并始终返回地址“02:00:00:00:00:00”。然而,监听系统广播的应用程序不需要这些权限,因此允许在不知道用户的情况下捕获该信息,并且甚至在Android 6或更高版本上捕获真实MAC地址。
尝试在Android 7.0中获取MAC地址的应用截图:
研究人员使用多款硬件和不同Android版本进行了测试,结果显示所有测试设备和Android版本都可以复现这个问题,尽管某些设备未在“ NETWORK_STATE_CHANGED_ACTION ”Intent中显示实际MAC地址,但它们仍在“ WIFI_P2P_THIS_DEVICE_CHANGED_ACTION ”Intent内。同时由于MAC地址是固定且与硬件绑定,所以哪怕设备的MAC地址是随机化的,也可以用它来识别和跟踪任何Android设备。而针对网络名称和BSSID信息,可通过查询BSSID数据库(如WiGLE或SkyHook)来定位用户。恶意软件可以使用这些网络信息来进一步试探和攻击本地Wi-Fi网络。研究人员表示所有版本的Android系统均会受到影响,包括各种分支,如亚马逊的Kindle FireOS。谷歌在Android P/9中修复了这个问题,但不会为旧版本的系统提供更新,建议用户升级到Android最新版本。
问题复现
通过应用程序
对于Android设备用户,可以按如下方式复制这些问题:
1. 安装Vilius Kraujutis开发的“Internal Broadcasts Monitor”应用。
2. 打开应用,然后点击“Start”开始监控广播信息。
3. 观察系统广播信息,特别是“android.net.wifi.STATE_CHANGE”和“android.net.wifi.p2p.THIS_DEVICE_CHANGED”这两条。
示例:
通过代码
使用代码复现,需要创建一个广播接收器并注册以接收这些信息:
android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION
android.net.wifi.WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
示例代码如下所示:
public class MainActivity extends Activity {
IntentFilter filter = new IntentFilter();
filter.addAction(
android.net.wifi.WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(
android.net.wifi.WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
registerReceiver(receiver, filter);
}
BroadcastReceiver receiver = new BroadcastReceiver() {
Log.d(intent.toString());
….
}
};
后续
因为这是一个重大的API变更,谷歌仅在Android P/9中修复了这个问题,旧版的Android系统不会得到更新,建议用户升级到Android P/9或更高版本。