CVE-2017-13156 Janus 漏洞学习

Janus漏洞

“Janus”安卓漏洞(漏洞编号:CVE-2017-13156)是Google在2017年12月发布的安卓系统安全公告中披露的一个漏洞。
该漏洞可以绕过安卓系统的signature scheme V1签名机制,使攻击者在不改变原来apk签名的情况下,植入恶意代码。

 

漏洞简析

 

漏洞前提1:虚拟机

Janus漏洞出现于Android5.0及以上系统,原因是Android5.0之后Android手机虚拟机由原来的Dalvik转为ART,而ART虚拟机允许执行一个dex文件或者一个包含dex的zip文件(apk文件)。

漏洞前提2:Android签名机制

Android支持两种签名方式,V1签名使用传统JAR签名,这种签名方式对zip文件内的所有entry做校验,可以防止zip打包文件被篡改,但是无法校验整个zip文件是否被篡改。在Android7.0及以上版本Google增加了V2签名机制,可以校验整个apk文件,但是为了兼容性,允许2种签名方式同时存在。

漏洞产生:

一个APK文件头部是dex文件尾部是apk文件,① Android在apk安装时进行签名校验,如果apk只有V1签名,则使用V1签名验证,发现apk内所有entry未进行篡改,签名验证通过;② ART虚拟机执行的时候发现这是一个dex文件,则直接执行,恶意代码被成功执行。

ZIP文件简析:

Android官方文档的图片:


ZIP是一个压缩文件包,其文件结构分为3个部分如上图所示。Contents of ZIP entries 是压缩包内所有entry;Central Directory保存了所有entry的header,而且每个header都是以魔鬼数字0x02014b50开头,每个header的第42-46字节保存的是每个entry的偏移量;End of Central Directory以魔鬼数字0x06054b50开头,第12-16字节保存 Central Directory 的长度,16-20字节保存 Central Directory 的起始位置偏移量。

因此只要偏移量正确,通过End of Central Directory可以确定Central Directory,再通过 Central Directory可以找到对应的entry,那么这就是一个合法的zip文件。而V1签名只能保证Contents of ZIP entries部分不被篡改,因此修改偏移量并不会影响V1签名。我们只要通过流将DEX文件加到APK头部,并且修改Central Directory和 End of Central Directory部分的偏移量使其保持一个合法的ZIP结构,即可绕过Android V1签名,并且执行我们自己的代码DEX文件。

 

JAVA版合并代码(仅供学习使用)


github地址 :https://github.com/xyzAsian/Janus-CVE-2017-13156

Android V2签名

注:最新签名机制V2签名,并不存在这个漏洞,原因是由于V2签名校验整个ZIP文件,包括了Central Directory和 End of Central Directory部分,因此只要修改了偏移量,V2签名校验就会失败。

漏洞分析参考资料

CVE-2017-13156漏洞分析(上): https://shunix.com/janus-one/

CVE-2017-13156漏洞分析(中)https://shunix.com/janus-two/

你可能感兴趣的:(android)