top of page
Search
Writer's pictureIYP

Android 系统中通过 RSSI 广播泄漏敏感数据的漏洞详情披露 (CVE-2018-9581)

本文所分析的 CVE-2018-9581 漏洞,和前段时间​所分析的 CVE-2018-9489 和 CVE-2018-15835 属于同一漏洞系列,这三个漏洞具有相同的发生机理。


前言

CVE-2018-9581 允许进程间通信,导致信息泄漏。虽然 Android 系统上的应用程序通常由操作系统彼此隔离,同时各应用与操作系统本身隔离,但在需要时在它们之间仍然存在共享信息的机制,如 intent,Android 使用两种不同的 intent 定期广播有关 WiFi 连接的信息。

而 CVE-2018-9489 能将有关用户设备的信息暴露给设备上运行的所有应用程序,包括 WiFi 网络名称、BSSID、本机 IP 地址、DNS 服务器信息和 MAC 地址。它使恶意应用程序得以绕过权限检查和现有的防护,访问系统广播信息。根据该通报,安全漏洞 CVE-2018-9489 不太可能得到任何修复。

这一漏洞能影响安卓 9.0 Pie 以前的所有安卓版本。有了这些信息,攻击者可能会带来各种类型的攻击,比如进一步嗅探和攻击本地WiFi网络。此外,由于 MAC 地址是硬编码的,所以即使使用 MAC 地址随机化,它们也可用于唯一地识别和跟踪任何 Android 目标。

至于 CVE-2018-15835,来自 Android 操作系统的 intent 消息会泄露了有关电池的详细信息,攻击者可在没有特殊权限的情况下,利用这些 intent 消息识别和跟踪用户。目前可以确定的是,Android 5.0 会受到影响,但 Google 似乎不打算修复将其归类为安全漏洞

这3个漏洞都是由于在 Android 操作系统的系统广播暴露了 WiFi 接收的信号强度指示(RSSI),利用该漏洞,攻击者可以在不需要额外权限的情况下,利用恶意软件获取此信息。它允许与 WiFi 路由器物理接近的攻击者跟踪路由器范围内用户的位置,从而根据附近的 WiFi 路由器来定位或跟踪用户(靠近 WiFi 路由器的手机将接收到更强的信号)。同样的问题也适用于底层 Android API,但需要额外的权限。

目前所有的 Android 版本都受到该漏洞的影响,且 Google 尚未计划修复此漏洞。但在 Android 9.0 Pie 或更高版本中,CVE-2018-9489 漏洞已经得到了修复,系统广播已经不再显示敏感数据。研究人员表示,他们不确定这种漏洞是否已在野外被开发利用。

CVE-2018-9581 的漏洞利用原理

据估计,目前全球有超过20亿台设备在运行 Android。 Android 上的应用程序通常被操作系统彼此隔离,当然,它们也与操作系统之间相互隔离。但是,仍然存在一些机制(比如 Intent),可以实现进程之间的通信,以及进程与操作系统的交互。Intent(Intent)主要是解决Android应用的各项组件之间的通讯。Intent 负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android 则根据此 Intent 的描述,负责找到对应的组件,将 Intent 传递给被调用的组件,并完成组件的调用。因此,Intent 在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

虽然存在限制阅读此类消息的权限,但应用程序开发人员通常忽略正确实施这些权限或屏蔽敏感数据。这导致 Android 应用程序中的常见漏洞,其中在同一设备上运行的恶意应用程序可以监视并捕获由其他应用程序广播的消息。

Android 中存在的另一种安全机制是权限的设定,它们都是保护用户隐私的安全措施。应用程序必须通过应用程序列表(“AndroidManifest.xml”)中的特殊“uses-permission”标记明确请求访问某些信息或功能。Intent 解析机制主要是通过查找已注册在 AndroidManifest.xml 中的所有 IntentFilter 及其中定义的 Intent,最终找到匹配的 Intent。在这个解析过程中,Android 是通过 Intent 的 action、type、category 这三个属性来进行判断的。根据许可的类型(“正常”、“危险”等),Android 系统可以在安装期间向用户显示相应的许可信息,或者可以在运行期间再次提示。不过某些权限只能由系统应用程序使用,并且不能由常规开发人员使用。

Google Play 安装期间和应用程序运行期间的权限提示如下所示:

CVE-2018-9581 的漏洞详细信息

Android 系统会定期在系统范围内广播WiFi强度值(RSSI),无需特殊权限就可以访问此信息。 RSSI值表示设备接收的信号的相对强度,但不与实际物理信号强度(dBm)直接相关。这是通过两个独立的 Intent(Android 9之前的“android.net.wifi.STATE_CHANGE” ;以及所有Android版本中的 “android.net.wifi.RSSI_CHANGED”)发布的。

虽然应用程序也可以通过WifiManager访问此信息,但根据规范,还需要应用程序列表中的“ACCESS_WIFI_STATE”权限。而在Android 9及以上的版本中,新增的WiFi RTT功能还需要“ACCESS_FINE_LOCATION”权限,才能捕获用户的WiFi位置。但是,如果攻击者在监听系统广播时,则不需要这样的权限,恶意应用程序在用户不知情的情况下捕获此信息。

这样,就会产生两个单独的安全漏洞:

1.只要绕过通常所需的权限检查(“ACCESS_WIFI_STATE”),RSSI值就可通过广播信息获得; 2.通过广播或WifiManager所获取的RSSI值,可以用于室内定位,无需特殊位置许可;

漏洞复现

普通用户可以按照如下步骤来复现此漏洞

1.从Google Play中下载“Internal Broadcasts Monitor”(内部广播监控)应用程序(由Vilius Kraujutis开发的); 2.打开应用程序,然后点击“开始”监控广播; 3.观察捕获的系统广播信息,注意Android 9以及之前版本的信息是 android.net.wifi.STATE_CHANGE”, 而“android.net.wifi.RSSI_CHANGED” 信息存在于所有Android 版本中。 观察的系统广播的截图:



通过代码的方式实现漏洞复现

要通过代码的方式实现漏洞复现,就需要由专门的软件研发人员来实现。首先是创建一个广播接收器,并将其进行注册,注册完了后,才能接收“android.net.wifi.STATE_CHANGE”(仅限 Android v8.1 及以下版本)和“android.net.wifi.RSSI_CHANGED”。


示例代码如下所示:

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle state) {
    IntentFilter filter = new IntentFilter();        
    filter.addAction(android.net.wifi.STATE_CHANGE);
    filter.addAction(android.net.wifi.RSSI_CHANGED);
    registerReceiver(receiver, filter);
}
    
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
    Log.d(intent.toString());
    ….
}
};

本文的漏洞测试方法


设备配置

本文的研究人员在测试过程,使用了以下设备: 1.Pixel 2,Android 8.1.0系统,补丁更新至2018年7月; 2.Nexus 6P,Android 8.1.0系统,补丁更新至2018年7月; 3.Moto G4,Android 7.0系统,补丁更新至2018年4月; 4.Kindle Fire HD第八代,Fire OS 5.6.10系统,补丁更新至2018年4月; 5.路由器使用华硕RT-N56U,运行最新版本固件。 经过测试,Kindle Fire所使用的Android版本系统都存在以上漏洞。

测试步骤

测试步骤如下: 1.安装Broadcast Monitor应用程序; 2.将手机置为飞行模式; 3.开始Broadcast Monitor应用程序; 4.关闭飞行模式(触发RSSI广播); 5.从广播中获取的两个RSSI值有: android.net.wifi.RSSI_CHANGE – newRssi 值和android.net.wifi.STATE_CHANGE – networkInfo / RSSI 6.在每个测试设备上,重复步骤 3-4。 测试结果清除显示每个设备都具有独特的RSSI值范围,测试期间收集的RSSI值的列表如下。



Google 的反应和缓解措施

Google 已经将此漏洞划分在中等危险,并命名为 CVE-2018-9581。目前 Google 尚未修复 CVE-2018-9581,但在 Android 9/P 上,“android.net.wifi.STATE_CHANGE”将不再显示敏感数据,因为该问题已经在CVE-2018-9489中被修复,目前尚不清楚这个漏洞是否在野外利用的情况。◾️

20 views0 comments

Comments


bottom of page