- A+
0x01:Janus介绍
Android APP仅使用V1签名,可能存在Janus漏洞(CVE-2017-13156),Janus漏洞(CVE-2017-13156)允许攻击者在不改变原签名的情况下任意修改APP中的代码逻辑。
影响范围:Android系统5.1.1 - 8.0
Android平台被爆出“核弹级”漏洞Janus(CVE-2017-13156),该漏洞允许攻击者任意修改Android应用中的代码,而不会影响其签名。 众所周知,Android具有签名机制。正常情况下,开发者发布了一个应用,该应用一定需要开发者使用他的私钥对其进行签名。恶意攻击者如果尝试修改了这个应用中的任何一个文件(包括代码和资源等),那么他就必须对APK进行重新签名,否则修改过的应用是无法安装到任何Android设备上的。但如果恶意攻击者用另一把私钥对APK签了名,并将这个修改过的APK对用户手机里的已有应用升级时,就会出现签名不一致的情况。因此,在正常情况下,Android的签名机制起到了防篡改的作用。**
但如果恶意攻击者利用Janus漏洞,那么恶意攻击者就可以任意地修改一个APK中的代码(包括系统的内置应用),同时却不需要对APK进行重新签名。换句话说,用这种方式修改过的APK,Android系统会认为它的签名和官方的签名是一致的,但在这个APK运行时,执行的却是恶意攻击者的代码。恶意攻击者利用这个修改过的APK,就可以用来覆盖安装原官方应用(包括系统的内置应用)。由此可见,该漏洞危害极大,而且影响的不仅是手机,而是所有使用Android操作系统的设备。
0x02:漏洞原理
ART虚拟机在加载并执行一个文件时,会首先判断这个文件的类型。如果这个文件是一个Dex文件,则按Dex的格式加载执行,如果是一个APK文件,则先抽取APK中的dex文件,然后再执行。而判断的依据是通过文件的头部魔术字(Magic Code)来判断。如果文件的头部魔术字是“dex”则判定该文件为Dex文件,如果文件头部的魔术字是“PK”则判定该文件为Apk文件。
另一方面,Android在安装一个APK时会对APK进行签名验证,但却直接默认该APK就是一个ZIP文件(并不检查文件头部的魔术字),而ZIP格式的文件一般都是从尾部先读取,因此只要ZIP文件尾部的数据结构没有被破坏,并且在读取过程中只要没有碰到非正常的数据,那么整个读取就不会有任何问题。
总而言之,Android在加载执行代码时,只认文件头,而安装验证签名时只认文件尾。
因此只要构造一个APK,从其头部看是一个Dex文件,从其尾部看,是一个APK文件,就可以实施攻击。很容易想到,将原APK中的classes.dex抽取出来,改造或替换成攻击者想要执行的dex,并将这个dex和原APK文件拼起来,合成一个文件,就可以利用Janus漏洞。
当然仅仅简单地将恶意dex放在头部,原apk放在尾部合起来的文件还是不能直接用来攻击。需要稍作修正。对于头部dex,需要修改DexHeader中的file_size,将其调整为合并后文件的大小。另外需要修改尾部Zip,修正[end of central directory record]中[central directory]的偏移和[central directory]中各[local file header]的偏移。
当然,Janus漏洞是针对APK文件的攻击,因此v1签名无法抵御这类攻击,而v2签名可以抵御。
0x03:检测方式
使用GetApkinfo.jar工具
1 |
java -jar GetAPKInfo.jar "com.lt.wokuan.App .apk" |
V2签名验为false则可能存在Janus漏洞。
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫