前言
自诞生以来,Android就要求开发者对应用进行签名。在应用进行更新时,只有更新包的签名与现有的app的签名一致的情况下,Android运行时才允许更新包安装到系统。若app被恶意的攻击者修改,重新打包签名,由于攻击者无法获得原始开发者的私钥,其重打包的签名与原始签名不一致,系统会拒绝安装此更新。这样可以保证每次的更新一定来自原始的开发者。然而Google在本月4日发布的Android安全公告中提到一个Android的漏洞,利用该漏洞的攻击者可修改app而不影响其原始签名。
该漏洞产生的根源在于:一个文件可以同时是APK文件和DEX文件。由于这种同时为APK文件和DEX文件的二元性,联想到罗马的二元之神Janus,将该漏洞命名为:Janus漏洞。
Janus漏洞原理
如图:
攻击者可以利用这种二元性(Janus漏洞),将一个恶意的DEX文件与原始APK文件进行拼接,从而不影响APK文件的签名。Android运行时就可以将该带有恶意DEX文件的APK文件看作是之前app的合法的升级版,允许这种安装,然后从DEX的头部开始执行!而这里的DEX就可以是任意的符合DEX格式的文件了,可以带有攻击者的恶意代码。如果被“升级”的app是一个具有高权限的app,比如系统应用,那么该恶意应用可继承其高权限,访问系统的敏感信息,甚至完全接管系统!
影响范围
该漏洞仅影响基于 JAR 签名的方案(v1 方案)。不影响自Android 7.0 以来引入的 APK 签名方案 v2(v2 方案)。