cve-2016-5348(利用大文件使gps crash)

描述

通过中间人攻击(MITM)构造一个gps相关的文件(由Qualcomm提供),可以使Android设备的gps服务崩溃,设备重启。问题出现在AOSP代码和由Quanlcomm实现的XTRA下载代码中。该漏洞还有可能影响所有的Qualcomm GPS芯片。

背景(GPS和gpsOneXtra)

大多数移动设备通过GPS(Global Positioning System)实现定位,它由美国的军事部门开发和维护,其他国家也有类似的定位系统,如俄罗斯的GLONASS,欧洲的Galileo,中国的北斗。

广播星历是定位卫星发出的无线电信号上载有预报一定时间内卫星根数的电文信息,通过星历接收者可以很快获得离自己最近的卫星,避免了依次去查找卫星。

Qualcomm开发了一套系统称为gpsOneXtra,通过它设备可以从高通的服务器上下载卫星数据(Xtra文件),该文件包含了当前的卫星位置数据以及未来7天卫星可能的位置,大多数的高通gps芯片都支持这项技术。

##背景2 -Android和gpsOneXtra文件

通过对Android设备的流量监控发现,每当设备连接到WiFi网络时,会向高通的服务器发起请求,获取gpsOneXtra文件。在Android相关的源码中,出现了以下url:

1
2
3
http://xtra1.gpsonextra.net/xtra.bin
http://xtra2.gpsonextra.net/xtra.bin
http://xtra3.gpsonextra.net/xtra.bin
1
2
3
http://xtrapath1.izatcloud.net/xtra2.bin
http://xtrapath2.izatcloud.net/xtra2.bin
http://xtrapath3.izatcloud.net/xtra2.bin

使用whois工具查询这些域名,发现gpsonextra.net和izatcloud.net都是高通的域名,进一步研究发现他们用的Amazon的云服务。

进一步查看Android源码发现,该请求由系统级别的Java代码发起GpsXtraDownloader.java,之后通过JNI传到native代码中com_android_server_location_GnssLocationProvider.cpp,最终交由高通的硬件来解析。

漏洞细节

Android设备在连接wifi时会自动下载XTRA文件,然而相关的代码并未检查XTRA文件的大小,如果一个XTRA文件大小超过了机器的最大内存,设备就会重启。攻击者通过MITM,将下载请求链接到自己伪造的XTRA大文件,从而造成远程拒绝服务攻击。

漏洞发生在以下代码中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#GpsXtraDownloader.java, lines 120-127
connection.connect();

int statusCode = connection.getResponseCode();

if (statusCode != HttpURLConnection.HTTP_OK) {

if (DEBUG) Log.d(TAG, “HTTP error downloading gps XTRA: “

+ statusCode);

return null;

}

return Streams.readFully(connection.getInputStream());

整个过程未检测文件的大小,且使用readFully会将整个文件读到内存中,因此会造成内存不足,设备重启。

漏洞复现

  1. 更改手机hosts文件(/etc/hosts),把相关域名指向攻击者控制的服务器;
  2. 服务器上放一个超过设备内存大小的文件
  3. 打开/关闭wifi,或者打开/关闭飞行模式

Note:由于缓存并非每次都会下载XTRA文件,此时需要重启手机或者参考http://stackoverflow.com/questions/14548707/android-how-to-reset-and-download-a-gps-data。也可以安装如GPS StatusToolboxGPS Status等工具.

漏洞修复

在Java层和native层增加了对XTRA文件大小的检查。