Android OS的系统广播会将关于用户设备的信息向所有正在设备上运行的app公开。包括WIFI 网络名称,BSSID,本地 IP 地址,DNS 服务器信息,MAC 地址。其中一些信息(像 MAC 地址)在 Android 6及之后的版本不再通过 API提供,而其他的信息通常来说都访问权限。然而,通过监听广播,任何设备上的应用都可以获取到这些信息,直接绕过了权限检查和防范手段。
因为 MAC 地址不会变,而且是和硬件绑定的,因此即便使用 MAC 随机化,它还是可以用来唯一标识和追踪任何 Android设备。网络名称和 BSSID 可用于通过查找 BSSID 数据库(比如WiGLE和SkyHook)来定位用户的物理位置。其他的网络信息可以被恶意软件用于在本地 WIFI 网络中进行探索甚至进行攻击
所有设备上运行的所有Android版本都被认为会受到影响,包括一些分支(例如亚马逊的Kindle FireOS)。厂商(Google)修复了Android P / 9的 bug,但是并不打算修复旧版本的问题,GOOGLE鼓励用户更新到Android P / 9或更新的版本。GOOGLE 已指定CVE-2018-9489来跟踪此问题,并建议进一步研究以确定其是否会被在野利用。
Android是一个由Google开发的、开源的、用于手机和平板的操作系统。据估计,全球大概有20亿设备运行 Android。Android 上的应用被系统分隔开,同时也和系统隔离。但是,通过某些机制仍然可以实现进程和/或OS之间的交互。
特别的,Android提供“Intents”作为进程间通信的的一种方式。使用“Intent”的广播允许应用或者操作系统在系统范围内发送可被其他应用接收到的消息。虽然存在限制使用者读取这些信息的策略,但是开发者通常不会正确的实现限制策略或者敏感数据脱敏。这就导致了 Android 应用的公共漏洞,恶意软件可以监测和截获其他应用广播的信息。
Android 的另一个安全机制是权限。这是为了保护用户隐私而设计的。应用程序必须通过应用程序清单(“ AndroidManifest.xml ”)中的特殊“ uses-permission ”标记明确请求访问某些信息或功能。根据权限的类型(“normal”,“dangerous”, 等等),系统可能会在用户安装程序时显示权限信息,也有可能在程序运行时再次提示。一些权限只能被系统使用,普通的开发者是不可使用的。
Google Play 和程序运行时的权限截图:
Android OS使用两个 intent 定期广播关于 WIFI 连接和 WIFI 网络接口的信息:WifiManager的NETWORK_STATE_CHANGED_ACTION和WifiP2pManager的WIFI_P2P_THIS_DEVICE_CHANGED_ACTION。信息包括设备MAC 地址,WIFI 接入点的BSSID和网络名称,以及各种网络信息,比如本地IP 地址范围网关 IP 和 DNS 服务器地址**。这些信息可以被任何运行在设备上的 app 使用。
虽然 app 也可以通过WifiManager获取这些信息,但通常需要在应用清单里添加“ACCESS_WIFI_STATE”权限。通过 WIFI 获取地理位置通常需要“ACCESS_FINE_LOCATION”或“ACCESS_COARSE_LOCATION”权限。在Android 6.0或更高版本中,不再通过API提供真实的 MAC 地址,并且总是返回“02:00:00:00:00:00”。然而,一个监听系统广播的应用并不需要这些权限,因此可以在用户不知情的情况下获取这些信息,并且在Android 6或更高版本中获取到这些信息。
一个 APP 在 Android 7.0上尝试获取 MAC地址时的截图:
我们使用不同硬件和不同Android版本的设备在 test farm进行了实验。所有的硬件和所有的 Android 版本都确认了这个行为,即使有的设备不会在“NETWORK_STATE_CHANGED_ACTION”intent 中展示真实的 MAC 地址,但在“WIFI_P2P_THIS_DEVICE_CHANGED_ACTION”intent 中一样会展示出来。我们也测试了至少一个分支(Kindle 使用的Amazon FireOS),这些设备展示了同样的信息。
对于 Android 设备用户,你可以通过以下步骤来复现:
样例截图:
为了使用代码复现,创建一个广播监听器,然后将其注册以监听这些活动:
样例代码如下:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle state) {
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() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(intent.toString());
….
}
};
厂商(Google)在 Android P/9 中修复了这些问题。因为修改 API 将会是一项重大的更新,所以厂商并不打算修补之前的 Android 版本。建议用户升级到 Android P/9 或更新版本。
亚马逊已就其Android分支(FireOS)做出如下回应:
我们计划在设备过渡到新版Fire OS时解决此问题
Android ID#77286245
CVE ID:CVE-2018-9489
Google Bug#77236217
GitHub:内部广播监视器
我们要感谢Vilius Kraujutis开发内部广播监视器app并在GitHub中提供源代码。
该通报由Yakov Shafranovich撰写。