Loading
0

一探小米Analytics后门

根据 [The Hacker News](http://thehackernews.com/2016/09/xiaomi-android-backdoor.html) 的报道,小米手机定制的ROM中存在后门,可以使得小米在用户的手机上静默安装任意APP。这个后门存在于预装的Analytics应用中,其在后台24小时运行,即便用户删除后任然会再次出现。

刚好用的就是小米的手机,本着学习的态度,用了课余时间分析了一下,看看这个后门是咋回事。

二. 具体分析


通过小米手机的“设置”-> “其他应用管理”,在“全部 ”标签栏中可以查看系统中的全部应用,仔细找确实发现了名叫analytics的应用。

/Article/UploadPic/2016-10/2016105121513361.png

同时通过adb连接后,用ps命令也可以看到这个应用正在运行。

1
2
root@dior:/ # ps|grep "analytics"
u0_a75    1711  218   516248 39860 ffffffff 400d68b8 S com.miui.analytics

由于这个应用是预装的系统应用,然后通过`adb pull`将`/system/app`目录中的AnalyticsCore.apk拿出来,这样就可以反编译apk文件看看这个应用到底做了什么,是不是真的有后门?

由于apk文件也是一个zip结构的文件,我先用7zip打开看了一下,发现没有使用linux so文件,也就是都是java层的代码,没有native的。这样直接用JEB分析吧。

用JEB打开后看到,一些包中的类名和方法都是a,b,c这样的名字,应该经过了混淆处理。

/Article/UploadPic/2016-10/2016105121513857.png

然后看Manifest文件中的声明的权限和服务

/Article/UploadPic/2016-10/2016105121513640.png

其中有完全的网络访问权限,可以直接安装应用,获得手机状态等。还设置了receiver在手机启动和网络状态改变时获得通知。

然后我通过JEB中Strings一栏查找一些可疑的字符串。发现了一个线程,在runnable接口中定义的run函数中有发送手机信息到远程服务器的行为。这个后来被证明也是后门的关键。

/Article/UploadPic/2016-10/2016105121514965.png

从代码中看到获取了imei,mac,package等信息,发送到[http://sdkconfig.ad.xiaomi.com/api/checkupdate/lastusefulversion](http://sdkconfig.ad.xiaomi.com/api/checkupdate/lastusefulversion)。

/Article/UploadPic/2016-10/2016105121514373.png

返回的是一个json格式的信息。其中关键的有url和md5字段。

我们接下去看看代码是怎么处理这个url和md5的。

1
2
3
g.a(this.B, v0_5.optString("md5"));
g.b(this.B, v4);
g.c(this.B).execute(this.B.bg);

通过`g.a`,`g.b`分别将url和md5的值赋给`this.B`的成员变量,然后启动一个thread处理。

/Article/UploadPic/2016-10/2016105121518801.png

在这个thread中将上面的url去请求一个apk,将它下载到本地。本地保存的地址是自生的cache目录`/data/data/com.miui.analytics/cache/`。

/Article/UploadPic/2016-10/2016105121518874.png

在下载完后,还通过md5对下载的apk进行了校验。

/Article/UploadPic/2016-10/2016105121518605.png

但由于前面的请求是http,我们完全可以拦截改写url和md5的值,将url改写为自己服务器的地址,md5的值只要符合自己服务器中apk的md5即可。

然后通过“g.h(this.B)”安装。最后安装apk的代码就是调用PackageManager进行安装。

/Article/UploadPic/2016-10/2016105121518698.png

可见,代码中虽然通过md5对下载的apk进行了校验,检查了下载apk文件的完整性,但没有检查签名的有效性,如是不是小米的签名。

另外,由于之前的http不安全的传输,使得可以篡改url和md5的值,使得系统根据一个指向我们服务器的url下载恶意的apk,并被安装。

上面的这个过程在系统启动后,网络状态改变,手机唤醒时,都会发生。

/Article/UploadPic/2016-10/2016105121519599.png

/Article/UploadPic/2016-10/2016105121519444.png

只要满足下面的条件,即每每隔24小时触发一次。将上次检查的时间记录在updater.xml文件中。

/Article/UploadPic/2016-10/2016105121519799.png

那么我们改写updater.xml文件中的updateTime值,让时间间隔大于24小时,通过抓包可以很明显的看到此现象。通过中间人攻击可以安装上自己的apk。

1
2
3
4
5
6
root@dior:/data/data/com.miui.analytics # cd shared_prefs
root@dior:/data/data/com.miui.analytics/shared_prefs # cat updater.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <long name="updateTime" value="1475032517252" />
</map>

三. 总结


通过分析,这个“后门”可以实现静默安装任意apk。按更确切的是一个漏洞,有两个关键的缺陷,一是不安全的传输,使用http传输更新关键数据。二是虽然通过md5检查了完整性,但没有检查签名的有效性,确认是小米的签名。

从功能上看,这个analytics更多的是分析数据,应该是小米用于增强用户体验的,但在更新部分的缺陷给了hacker可乘之机。当然是不是故意留下的,大家各自评说吧。

【声明】:8090安全小组门户(http://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。