作者:ssssssshg
预估稿费:500RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
0x01 引子
我们知道,具有静默安装应用能力的APP,一般默认是手机厂商的系统应用,这类应用天生就拥有system权限,而第三方应用想要拥有静默安装app能力,只能在root后的手机上向su申请root权限,那么是否有非root权限下静默安装app的方法呢?
第三方应用中,有静默安装APP需求的一般是市场类应用,如360手机助手、百度手机助手和腾讯应用宝等,市场类应用为了让用户节约频繁点击操作的时间,提高用户体验,在安装和升级大量app不太希望有太多的弹框确认操作影响用户,而各家都独避蹊径实现了非root权限静默安装app,目前的方法都是使用AccessibilityService辅助服务进行自动点击,根据app的安装步骤来一步步实现app的静默安装。
AccessibilityService辅助服务是google为使用手机有障碍的用户提供的服务,第三方APP必须通过开启这个服务,才能让手机模拟用户点击,app使用这个功能会明确提示用户,如某流行的第三方市场应用。
另外还可以通过adb shell命令
”settings put secure enabled_accessibility_services <PACKAGE_NAME>/< ACCESSIBILITY_SERVICES_NAME>”和”settings put secure accessibility_enabled 1”
直接开启辅助服务,因为adb shell是具有”settings”的执行权限的:
0x02 另一种静默安装APP的方法
那既然拥有了adb shell的权限,除了开启辅助服务实现静默安装,我们还能不能使用一种更简单的方法呢?
大家知道,adb是能远程连接的,以前各种手机和智能设备都默认开启了adb的远程连接造成各种安全漏洞,如果安卓开启了调试模式,我们也可以事先通过USB调试使用tcpip命令开启这个远程调试功能,如“adb tcpip 5555”,开启5555端口的远程调试绑定,这时候不管是什么终端只要能使用合法的调试协议都是能使用adb的,所以手机上的app也能使用远程调试功能,这里我们不需要重复造轮子,直接使用Adblib这个开源库就能让app拥有adb远程调试的能力。无代码,不信服:
Socket socket = new Socket("127.0.0.1", 5555);
AdbCrypto crypto = AdbCrypto.loadAdbKeyPair(new AdbBase64() {
@Override
public String encodeToString(byte[] data) {
return Base64.encodeToString(data, Base64.DEFAULT);
}
}, keyPair);
connection = AdbConnection.create(socket, crypto);
connection.connect();
AdbStream stream = connection.open("shell:pm install -r /storage/emulated/0/ HookVulnerable.apk");
如图,APP在本地就具备了静默安装的能力
0x03 adb协议简要分析
目前安卓的adb调试协议启用了设备认证,并使用了RSA非对称加密!我来简单描叙下ADB协议的流程:
1.调试设备连接手机,手机向调试设备发送AUTH TOKEN报文,这里会包含源自/dev/urandom的20字节的随机token。
2.调试设备用自己的私钥对该随机token进行签名(SHA1+RSA),放在发往手机的SIGNATURE报文中。
3.手机检查签名,如果正确,响应以CONNECT报文,否则向主机发送新的AUTH TOKEN报文,提供新的随机token。
4.如果调试设备已经确认了所有公私钥对,则向手机发送AUTH RSAPUBLICKEY报文,包含一个调试设备公钥。
5.手机接收到调试设备公钥后弹出信息框,询问是否允许(或永久允许),该信息框中一般会显示调试设备公钥的指纹(MD5)
6. 调试设备的公钥最后保存在手机端的/data/misc/adb/adb_keys
看到这里我再把Adblib简要分析下,作者将adb源码里的几个重要的结构用JAVA实现,主要是
1.adb协议的标志头(OKAY,CLSE,OPEN,AUTH等)
2.adb消息的结构(命令、参数、payload长度,payload的checksum、magic以及payload)
3.adb加密方式(RSA加密消息)
大致通信过程如下:
因此,Adblib只是在APP端把adb协议调试设备端的流程重新实现了而已。
0X04安全思考
文章写到这里,我就不再做更深入的分析了。关于安全问题,每个人都会有自己的思考,也许产品人员想到的是用户体验,而安全人员希望寻找里面的漏洞,黑产木马病毒制造者想到的则是会是怎么作恶,
0x05 参考
https://github.com/cgutman/AdbLib
https://nelenkov.blogspot.com/2013/02/secure-usb-debugging-in-android-422.html

评论