当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0141054

漏洞标题:广州银行android客户端应用配置可绕过自签名验证

相关厂商:http://www.gzcb.com.cn/

漏洞作者: 路人甲

提交时间:2015-09-14 13:29

修复时间:2015-12-16 11:12

公开时间:2015-12-16 11:12

漏洞类型:非授权访问/认证绕过

危害等级:中

自评Rank:7

漏洞状态:已交由第三方合作机构(广东省信息安全测评中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-09-14: 细节已通知厂商并且等待厂商处理中
2015-09-17: 厂商已经确认,细节仅向厂商公开
2015-09-20: 细节向第三方安全合作伙伴开放
2015-11-11: 细节向核心白帽子及相关领域专家公开
2015-11-21: 细节向普通白帽子公开
2015-12-01: 细节向实习白帽子公开
2015-12-16: 细节向公众公开

简要描述:

通过绕过签名验证伪造成官方应用后可以运行获知进一步的信息如客户的重要个人信息以及核心的业务流程,可能造成进一步的危害

详细说明:

一般安全性要求高一点的android应用都要在内部进行自签名验证,防止黑客篡改apk内容后重新打包运行。我将广州银行最新的2.0.2版本的客户端进行解包之后再重新用一个keystore进行打包签名,安装后运行客户端提示

653982467115409680.jpg

由此可知广州银行客户端在应用内部有做自签名验证的,但是我要弄清楚其实现方式是什么,是否可以被破解,于是我在解包的string.xml文件中搜索提示的字符串,

QQ截图20150914113906.png

。为了找到该字符串资源在程序中的位置,我通过android sdk的aapt工具获取到编译完成的字符串资源对应的十六进制格式的资源id

QQ截图20150914114636.png

,通过在反编译后的代码里面搜索资源id可以获知判断程序的位置

QQ截图20150914123107.png

,通过阅读上图代码可以知道程序的逻辑就是通过判断资源id为0x7f0900bc以及0x7f0900bb对应的字符串来确认应用是否为官方签名的应用,从上图代码中还可以获知客户端如何处理取得的应用签名的字符串

QQ截图20150914123536.png

QQ截图20150914123604.png

。最后通过将其处理签名字符串的程序提取出来

public class MainActivity extends ActionBarActivity {
private TextView signatureTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

signatureTxt = (TextView)findViewById(R.id.signature);
String result = "";
try {
String signature = this.getPackageManager().getPackageInfo(this.getPackageName(), 64).signatures[0].toCharsString();
MessageDigest msgDigest = MessageDigest.getInstance("MD5");
byte[] arrayOfByte;
StringBuffer localStringBuffer;
int i;
try {
msgDigest.reset();
msgDigest.update(signature.getBytes("UTF-8"));
} catch (UnsupportedEncodingException unsupportedencodingexception) {
unsupportedencodingexception.printStackTrace();
}
arrayOfByte = msgDigest.digest();
localStringBuffer = new StringBuffer();
i = 0;
do {
if (i >= arrayOfByte.length) {
result = localStringBuffer.toString();
break;
}
if (Integer.toHexString(0xff & arrayOfByte[i]).length() == 1) {
localStringBuffer.append("0").append(
Integer.toHexString(0xff & arrayOfByte[i]));
} else {
localStringBuffer.append(Integer
.toHexString(0xff & arrayOfByte[i]));
}
i++;
} while (true);
} catch (NameNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
signatureTxt.setText(result);
Log.i("Signature", result + "");
}
}

并新建另一个工程,将刚才测试的keystore作为该工程的签名keystore进行导出apk,apk文件安装运行后即可得到一个字符串,将该字符串替换资源id为0x7f0900bc以及0x7f0900bb对应的字符串资源。重新打包签名apk,安装运行后验证通过

42994135117692476.jpg

721498709589047948.jpg

728047457516843835.jpg

漏洞证明:

当我用czw12345作为密钥生成keystore,之后运行测试程序得到一串处理过的签名字符串70289abe147313f0c5a79d63c6f1c3a5,将string.xml资源文件中的defaultkey以及testkey内容替换为该签名字符串

QQ截图20150914125859.png

,重新签名打包apk后,安装运行通过。

修复方案:

1.建议客户端不要将验证签名的逻辑代码暴露出来,可以将验证的逻辑代码封装到native代码中
2.不要将验证的签名字符串暴露在可修改配置的string.xml文件中,应该将其封装进native代码中并做一定的隐蔽处理

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2015-09-17 11:11

厂商回复:

非常感谢您的报告。
报告中的问题已确认并复现.
影响的数据:高
攻击成本:低
造成影响:高
综合评级为:高,rank:10
正在联系相关网站管理单位处置。

最新状态:

暂无