Android通过RSSI广播泄漏敏感数据漏洞披露(CVE-2018-9581)
概述
在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);
概述
在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上的应用程序通常被操作系统彼此隔离,当然,它们也与操作系统之间相互隔离。但是,仍然存在一些机制,可以实现进程之间的通信,以及进程与操作系统的交互。 www.wnhack.com
特别地,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);
本文来自无奈人生安全网