Android “Janus”安全漏洞及其规避方案

一、 漏洞说明
2017年12月, Google发布 “Janus”安卓漏洞(CVE-2017-13156)。该漏洞可以让攻击者绕过Android系统的签名机制,在不改变开发者签名的情况下对APP进行篡改。
在Android 5.0到8.0系统中,所有基于signature scheme V1签名机制的App均受“Janus”漏洞影响。仅基于signature scheme V2签名的APP在Android 7.0及以上版本系统中不受影响。
二、 漏洞危害
Android应用进行更新时,Android运行时会检查更新包签名,只有签名与原安装包一致才允许更新包安装到系统。基于Janus漏洞,攻击者可以修改APP而不影响其原始签名,篡改后的APP可以成功安装运行。具体风险产生于APK被篡改后植入的恶意代码,可能造成的后果如下:

  1. 对存储在原手机上的数据进行读取,例如金融类APP的银行密码、支付密码、token; 通信类APP的聊天记录、图片、通信录
  2. 对用户的输入做各种监听、拦截、欺诈,引导用户输入密码,转账。
  3. 利用这个漏洞可以更新Android的系统APP,从获得更高的系统权限,甚至root/越狱,为其他攻击做准备。

三、 解决方案:
方案一:使用Android studio 2.3及以上版本的studio工具进行打包,打包时同时勾选V1,V2签名
在这里插入图片描述
勾选v1和v2签名说明:
1)只勾选v1,跟以前是一样的,但是在7.0上不会使用更安全的验证方式
2)只勾选v2,打包完成后7.0系统以下安装会出错:Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES],7.0以上则使用了V2的方式验证
3)同时勾选V1和V2则所有机型都没问题

方案二、在App的build.gradle的android标签下加入如下配置:
signingConfigs {
debug {
v1SigningEnabled true
v2SigningEnabled true
}
release {
v1SigningEnabled true
v2SigningEnabled true
}
}
方案三:使用命令行脚本进行签名的需要使用新的签名工具进行签名
apksigner
这个工具位于SDK目录的build-tools目录下。必须说明的是,v2签名方式时在Android7.0后才推出的,所以只有版本>25的SDK\build-tools\中才能找到apksigner.jar。
打开cmd,把目录切到SDK\build-tools\版本号\lib下(例如E:\SDK\build-tools\25.0.2\lib),执行:

java -jar apksigner.jar sign //执行签名操作
–ks 你的jks路径 //jks签名证书路径
–ks-key-alias 你的alias //生成jks时指定的alias
–ks-pass pass:你的密码 //KeyStore密码
–key-pass pass:你的密码 //签署者的密码,即生成jks时指定alias对应的密码
–out output.apk //输出路径
input.apk //被签名的apk
示例:
java -jar apksigner.jar sign --ks key.jks --ks-key-alias releasekey --ks-pass pass:pp123456 --key-pass pass:pp123456 --out output.apk input.apk

apksigner还支持另外的一些选项,详情点击这里。包括指定min-sdk版本、max-sdk版本、输出详细信息、检查apk是否已经签名等等。
例如检查apk是否已经签名:
java -jar apksigner.jar verify -v my.apk

需要注意:
1)开发本地打包可以使用方案一,但例如企学通项目正式发布的包都是由客户通过打包平台打包,所以方案一不适用,只能使用方案二

2)要使用方案二的话,对 Gradle和Build Tools的版本是有要求的,低版本Gradle和Build Tools会提示找不到“ v1SigningEnabled()”方法,我本地的Gradle和Build Tools配置如下:
在这里插入图片描述

四、 漏洞核查工具与方法
1.使用命令java -jar GetApkInfo.jar ***.apk查看APK信息及签名版本;
在这里插入图片描述
2.结果说明:
1)若“V1签名验证通过”为true,则该APK使用V1签名,反之没有;
2)若“V2签名验证通过”为true,则该APK使用V2签名,反之没有;
3)若“V1签名验证通过”和“V2签名验证通过”均显示为true,则该应用同时使用V1+V2签名。

五、 Android V1和V2签名机制的差别
Android支持两种应用签名方案,一种是基于JAR签名的方案(v1方案),另一种是 Android Nougat(7.0)中引入的APK签名方案v2(v2方案)。v1签名不保护APK的某些部分,例如ZIP元数据。APK验证程序需要处理大量不可信(尚未经过验证)的数据结构,然后会舍弃不受签名保护的数据。这会导致相当大的受攻击面。此外,APK 验证程序必须解压所有已压缩的条目,而这需要花费更多时间和内存。为了解决这些问题,Android 7.0中引入了APK签名方案v2。在验证期间,v2方案会将APK文件视为 Blob,并对整个文件进行签名检查。对APK进行的任何修改(包括对ZIP元数据进行的修改)都会使 APK 签名作废。这种形式的APK验证不仅速度要快得多,而且能够发现更多种未经授权的修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值