整个漏洞翻译成中文大概是这样的:一些OEM厂商在定制自己的rom的时候,将一些Remote Support Tool (mRST)插件,比如TeamViewer的QS Add-On: Samsung打包进了/system/priv-app/,这样这些插件拥有了系统级的权限,而这些插件导出了服务供外部使用,但是在连接的时候没有正确的校验调用者的身份(或是说被绕过了),导致用户可以悄悄的使用这些远程控制功能。其实整个过程是第三方软件漏洞+OEM厂商的错误使用,所以google也将这个责任推给了第三方,毕竟不是自己的源代码出现了问题。
漏洞发现者公司check point提供了一个检测手机是否存在这种漏洞的app,下载地址 https://play.google.com/store/apps/details?id=com.checkpoint.capsulescanner ,自行翻墙。
JEB载入apk,直奔扫描代码,看到首先定义了一个OEM厂商指纹列表:
我们可以看到包括但不限于国内的一些厂商,比如华为,联想,明基,OPPO,TCL等,还有一些国外厂商比如三星,LG等。
其中校验指纹用的是apk签名字节的sha1计算结果,检测插件用的是apk内容的前8192字节的sha256值,检测是否被exploit用的是apk签名的hashcode等 ,代码就不一一贴了。工具里给出了一系列有漏洞plugin的sha256值,如下图
我在网上下了一个TeamViewer Quick Support Addon Samsung 8.0版,终于找到个有漏洞的版本,google play上的已经10.0修复了验证漏洞。
老外的议题已经说明过了,这里我再狗尾续貂一下。
首先我们能看到整个apk只导出了一个service,当我们bind上这个service时返回一个binder实例
后面的序号是为了对应原接口的顺序自己做的记号,可无视,这里也是蛋疼的地方。看代码
这个服务端服务提供的a方法返回结果就能知道当前连接插件的app是否通过验证,然后赋值给b,然后再每次调用其他方法时(比如截屏,发送按键等)会判断这个this.b的值,我们跟进去看下验证部分的代码:
TVAddonService.a是什么,看代码:
漏洞的形成就是校验调用者时只判断了签名的一部分,即seialNumber,而且是硬编码到app里的, 也是逗,为毛不校验整个签名?这个漏洞已经在最新版中修复,修复方法就是比对整个签名了。
这里我分别用一个未修改签名的apk和一个exploit后的app测试,看结果:
关于如何生成exploit的apk,首先生成签名需要的pem和pk8文件,老外给的文档里出现的命令生成了key和cer,其实就是对应的pk8和pem文件了。
生成pem和pk8命令如下:
生成pem和key文件:openssl req -x509 -nodes -newkey rsa:1024 -keyout evil.key -out evil.pem -set_serial 1287658381 将key转换为pk8格式:openssl pkcs8 -in evil.key -topk8 -outform DER -out evil.pk8 -nocrypt 给未签名的apk签名:D:/Apkdb/sign>java -jar signapk.jar evil.pem evil.pk8 testtvaddon.apk exp.apk
再来测试: