注:转载请注明出处
LBE在新版本V5.1中增加了"免ROOT"的功能,可以在不root的情况下实现root后才有的功能,比如卸载系统软件、主动防御等。
经过百度安全实验室的分析,LBE的免ROOT功能是利用Android签名验证漏洞(编号9695860)替换了系统应用SettingsProvider,然后在SettingsProvider进程里以System权限加载执行LBE自己的功能模块,达到root后才能实现的功效。下面我们来分析这个"免ROOT"实现的主要步骤。
开启LBE的"免root启动"主动防御后,LBE会提示用户修复MasterKey漏洞,如果用户同意修复,LBE会连接到服务器端下载所在系统SettingsProvider对应版本的补丁到/data/data/com.lbe.security/files/lbe_patch,然后安装。安装完毕后,提示重启,重启后即可实现免root主动防御功能。
安装lbe_patch:
这个补丁文件lbe_patch是一个修改过的SettingsProvider安装包。安装过程中,利用了Android签名验证漏洞#9695860,覆盖系统自带的SettingsProvider。关于该漏洞的具体分析,可以参见百度安全实验室发布的另一篇文章(链接)。
从lbe_patch的文件结构可以看到,CERT.RSA的Comment大小被设置为0x8000,致使java在解析lbe_patch时,处理完cert.rsa这个central directory后,会紧跟着解析后续的central director;而C++则跳转到0x8000后的地址解析。
所以,在验证签名时,PackageParser.java将lbe_patch解析成如下结构:
而C++会将其解析成:
对比下系统自带的SettingsProvider包的结构:
可以看到, java解析lbe_patch后的变化有两个:
-
新增了随机命名的两个文件夹
-
缺少AndroidManifest.xml
那lbe_patch是怎么绕过Android签名验证的?PackageParser.java在验证JarEntry的签名代码如下:
从上面的代码可以看到:
-
PackageParser会直接略过文件夹的签名验证,所以新增的两个文件夹不会对签名校验有影响,它们的作用是保证java解析CentralDirectory的个数达到ZipEndLocator中记录的CentralDirectory的个数,这两个文件夹正好用来冲抵AndroidManifest.xml和classes.dex。
-
验证签名时,PackageParser会遍历Apk里的每个ZipEntry,获得它的校验值,然后和apk的meta-inf里存储的每个文件的校验值做比较,不难发现,缺少的文件不会做比较,不会影响签名的校验。所以lbe_patch在java层解析时虽然缺少AndroidManifest.xml,但是签名验证还是可以通过。
至此,lbe_patch安装成功,而实际在运行中调用的是c++层解析后的安装包,里面包含了classes.dex和AndroidManifest.xml。
AndroidManifest.xml中记录了patch version,在安装时校验,并且新注册了个com.lbe.security.mkservice服务,供lbe后续调用:
Classes.dex代码结构:
可以看到里面包含了com.android.providers.settings代码。MkPayload是lbe_patch的入口类,里面包含了main函数,用来做一些初始化,反射调用和加载主防等模块:
这个main函数何时被调用?LBE修改了com.android.providers.setting的代码,在SettingsProvider的构造函数里调用了这个main函数,所以LBE的代码会跟着SettingsProvider一起加载执行:
至此,LBE的代码已经获得System权限,即可在SettingsProvider进程里加载其他功能模块,实现"rootFree"功能:
对于LBE提出的免root功能,确实在一定程度上解决了root带来的问题,比如root后可能有些手机将无法保修,或者部分普通用户不会root,但某些场景下又确实需要root带来的功能。但是目前LBE提出的这个方案也存在一些问题:
-
首先LBE的rootFree功能基于Android系统漏洞的前提,安全厂商利用系统漏洞替换系统模块,这并不应该是一个安全厂商应有的行为;
-
其次,LBE利用#9695860漏洞绕过签名验证,但是却是在没有给出该漏洞解决方案的前提下利用了该漏洞,这样势必会导致该漏洞的爆发,我们预计利用该漏洞的案例将会越来越多,甚至包括病毒也将会利用该漏洞进行破坏和牟利;
-
最后,经过我们的分析和测试,鉴于该技术涉及到技术环节较多,加上Android系统的开发性,LBE的rootFree功能尚不成熟稳定,使用时存在一定的风险。
百度安全实验室近日已经推出DroidSploit方案,可以查杀该漏洞和利用该漏洞的程序。