最近这两天经常看到关于Janus漏洞的转载,大致意思是修改App而不影响签名,特记录汇总一些细节。
参考:
https://www.anquanke.com/post/id/89979
https://source.android.com/security/apksigning/v2?hl=zh-cn#integrity-protected-contents
背景介绍:
Google在Android 7.0后引入了v2作为APK签名方案。这种方案是一种全文件签名方案,为了向下兼容。开发者应该先用JAR签名功能对APK进行签名,然后再使用v2方案进行签名。
上图中APK签名分块就包含v2签名和签名者身份信息。
APK签名分块负责保护ZIP条目的内容、ZIP中央目录、ZIP中央目录结尾及APK签名方案v2分块中的signed data的数据完整性。
CVE-2017-13156 Janus漏洞
APK文件是一个zip文件,它可以在zip文件之前(或者是在zip文件之间)包含任意字节。JAR签名模式(v1)只会考虑zip条目,这个方案在计算或者验证应用签名时会忽略额外字节。另外,Dex文件可以包括在最后包括任意字节,例如在常规的Sections之后strings、classes、method definitions之后。总结成一句话就是一个文件可以同时是apk文件和dex文件!
另外一个触发关键因素是ART虚拟机。理论上来说,在Android运行时载入APK后会提取DEX文件,然后执行相关代码。但在实际中,ART虚拟机可以载入并执行APK文件和DEX文件。如果找到APK文件,会根据Header中magic特征字节来判断文件类型。如果找到Dex Header,它会载入DEX文件。否则,虚拟机会将包含DEX文件的APK载入。
攻击者可以利用这种二元性,即将恶意Dex文件放到APK文件中,这样在基于JAR的签名方案下就不会影响签名。Android运行时会将这种APK看做是之前合法APK的一种升级,允许安装,然后从下图中DEX Header开始执行。
影响范围:
目前来看Janus漏洞主要针对的是Android 5.0到Android7.0的版本,利用V2 方案签名的应用不受此影响,主要是因为V2签名方案会考虑APK文件中的所有字节。
网上有人放出了POC https://github.com/V-E-O/PoC/tree/master/CVE-2017-13156
我参考使用说明跑了遍,
python janus.py malware.dex original.apk out.apk
可以安装成功但是运行时会退出。
后记:目前还是不太明白实际的攻击效果,特别是对于金融级别这种上了apk完整校验保护方案的产品,有没有实质性的破坏力,我实验的2个产品都是能安装但是运行不起来,后序需要跟踪学习下。