概述

在2018年秋季,我们在BSides DE上发表了关于3个Android漏洞的报告,分别是CVE-2018-9489、CVE-2018-9581和CVE-2018-15835,这三个漏洞具有相同的漏洞原因。

在Android操作系统的系统广播中,可以暴露出WiFi信号强度信息(RSSI),设备上的任何应用程序都可以在不需要额外权限的前提下获取此信息。一些恶意应用程序可能会将此信息用于室内定位,从而根据附近的WiFi路由器来定位或跟踪用户。同样的问题也存在于底层Android API,但它需要额外的权限。

我们相信,所有版本的Android都受到该漏洞的影响。目前,厂商Google尚未完全修复此漏洞。但在Android 9/P上,两种广播类型的其中一种,已经不再显示敏感数据,这是CVE-2018-9489修复工作的一部分。厂商为该漏洞分配了编号CVE-2018-9581。我们建议,还需要进行进一步研究,以确认该漏洞是否在野外被实际利用。

 

背景

Android是Google开发的开源操作系统,被广泛应用于手机和平板电脑上。据统计,全球有超过20亿台设备在运行Android系统。Android上的应用程序通常被操作系统彼此隔离,当然,它们也与操作系统之间相互隔离。但是,仍然存在一些机制,可以实现进程之间的通信,以及进程与操作系统的交互。

特别地,Android提供了“Intents”,作为进程间通信方式之一。使用“Intent”的广播允许应用程序或操作系统在全系统范围内发送可由其他应用程序监听的消息。尽管已经存在限制允许特定应用阅读某类消息的功能,但应用程序的开发人员往往没能正确实施此类限制,忽略了屏蔽敏感数据。这将导致Android应用程序产生常见的漏洞,其中在同一设备上运行的恶意应用程序可以监听并捕获由其他应用程序广播的消息。

Android使用的另一种安全机制是权限,这是一个旨在保护用户隐私的安全措施。应用程序必须通过应用程序清单(“AndroidManifest.xml”)中的特殊“uses-permission”标记明确请求访问某些信息或功能。根据许可的类型(例如“正常”、“危险”等),操作系统可以在安装期间向用户询问是否授权,或者在运行期间再次提示。另外,也有某些权限只能由系统应用程序使用,并且不能由常规开发人员使用。

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

 

漏洞详情

Android操作系统定期会在全系统范围内广播WiFi强度值(RSSI),访问此信息无需特殊权限。RSSI值表示设备接收信号的相对强度(数值越大代表信号越强),但不与实际物理信号强度(dBm)直接相关。该内容是通过两个单独的Intents公开的,分别为android.net.wifi.STATE_CHANGE(Android 9之前)和android.net.wifi.RSSI_CHANGED(所有Android版本)。

尽管应用程序也可以通过WifiManager访问此信息,但根据规范,要访问此信息需要“ACCESS_WIFI_STATE”权限。针对Android 9中新增的WiFi RTT功能,需要“ACCESS_FINE_LOCATION”权限。然而,在监听系统广播时,并不需要这样的权限,所以应用程序可能会在用户不知情的情况下捕获该信息。
综上所述,存在两个单独的安全问题,具体如下:

1、RSSI值可以通过广播获得,绕过通常所需的权限检查(ACCESS_WIFI_STATE);

2、通过广播或WifiManager所获取的RSSI值,可以用于室内定位,无需特殊位置许可。

 

普通用户复现过程

针对Android设备用户,可以按照如下方式来复现此漏洞:

1、安装由Vilius Kraujutis开发,上线到Google Play的“Internal Broadcasts Monitor”(内部广播监控)应用程序。

2、打开应用程序,点击“Start”(开始)来监控广播。

3、观察系统广播,特别是android.net.wifi.STATE_CHANGE(Android 9之前)和android.net.wifi.RSSI_CHANGED(所有Android版本)。

截图如下:

 

开发者复现过程(代码实现)

如果需要通过代码进行复现,可以创建一个广播接收器,并将其注册,以接收android.net.wifi.STATE_CHANGE(仅限8.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());
….
}
};

 

测试方法

我们的测试过程,使用了以下设备:

Pixel 2,Android 8.1.0系统,补丁更新至2018年7月;

Nexus 6P,Android 8.1.0系统,补丁更新至2018年7月;

Moto G4,Android 7.0系统,补丁更新至2018年4月;

Kindle Fire HD第八代,Fire OS 5.6.10系统(由Android 5.1.1分叉),补丁更新至2018年4月;

路由器使用华硕RT-N56U,运行最新版本固件。

实际测试表明,Kindle Fire所使用的Android分支版本系统继承了相应的功能。

执行步骤如下:

1、安装Broadcast Monitor应用程序;

2、将手机置为飞行模式;

3、走入房间;

4、关闭飞行模式(触发RSSI广播);

5、从以下广播中获取RSSI值:

(1) android.net.wifi.RSSI_CHANGE – newRssi值,

(2) android.net.wifi.STATE_CHANGE – networkInfo / RSSI;

6、针对每个房间,都重复步骤3-4。

测试结果表明,在每个房间使用特定设备时,都具有不同的RSSI值范围。

测试期间收集的值范围如下:

 

厂商响应及缓解措施

厂商Google将该漏洞定级为中等,并指定了CVE编号CVE-2018-9581。目前该漏洞尚未修复,但在Android 9/P上,两种广播类型之中的一种(android.net.wifi.STATE_CHANGE)已经不再显示敏感数据。目前尚不清楚该漏洞是否在野外被利用。

 

参考内容

Android ID#111698366

CVE ID:CVE-2018-9581( https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-15835

Google Bug#111662293

GitHub:Internal Broadcasts Monitor( https://github.com/ViliusKraujutis/AndroidBroadcastsMonitor

在BSide DE上的演讲:https://wwws.nightwatchcybersecurity.com/2018/11/05/speaking-bsidesde-this-friday-on-android-privacy-bugs-cve-2018-9489-cve-2018-9581-and-cve-2018-15835/

 

致谢

感谢Vilius Kraujutis开发内部广播监控器应用程序,并在GitHub中提供源代码。

然后,还要感谢多位学术研究人员,他们曾发表过通过RSSI值进行用户定位的相关研究,包括如下论文:

[1] “Algorithms for Location Estimation Based on RSSI Sampling.” (2008); Papamanthou C., Preparata F.P., Tamassia R.; In: Fekete S.P. (eds) Algorithmic Aspects of Wireless Sensor Networks. ALGOSENSORS 2008. Lecture Notes in Computer Science, vol 5389. Springer, Berlin, Heidelberg

[2] “Comparison of RSSI techniques in Wireless Indoor Geolocation,” (2012); G. A. Naik, M. P. Khedekar, M. Krishnamoorthy, S. D. Patil and R. N. Deshmukh,; 2012 NATIONAL CONFERENCE ON COMPUTING AND COMMUNICATION SYSTEMS, Durgapur, 2012, pp. 1-5.

[3] “Theoretical facts on RSSI-based geolocation,”; (2012) J. S. Picard and A. J. Weiss; 2012 IEEE 27th Convention of Electrical and Electronics Engineers in Israel, Eilat, 2012, pp. 1-5.

[4] “Adversarial WiFi Sensing” (2018); Yanzi Zhu, et al; arXiv:1810.10109;

 

时间节点

2018-03-28:将关于CVE-2018-9489的原始报告提供给厂商
2018-07-19:根据厂商请求,针对此漏洞编写单独的报告,并提供测试结果
2018-07-20:收到厂商回复,正在对此漏洞进行分析
2018-08-09:提供Android 9测试结果
2018-08-14:提供复现建议
2018-08-28:询问是否能够披露
2018-09-14:厂商反馈已经收到,仍需等待
2018-09-19:询问厂商
2018-09-21:厂商反馈已经收到,正在分析中
2018-10-14:关于即将举行的演讲,通知厂商
2018-10-15:厂商反馈已经收到,正在对该漏洞进行研究
2018-10-25:要求为该漏洞分配CVE
2018-10-30:再次询问CVE情况
2018-11-01:询问MITERCVE分配情况
2018-11-05:厂商为该漏洞指定CVE,并通知MITER
2018-11-06:将幻灯片提供给厂商进行审核
2018-11-09:在BSides DE演讲中公开披露
2018-11-11:公开发布此文章

文章原文链接:https://www.anquanke.com/post/id/164186