漏洞一. 360儿童卫士APP HTTPS通信中间人劫持
影响范围:360儿童手环2
漏洞危害评级:低
漏洞描述:360儿童卫士2使用了HTTPS通信来防止黑客的中间人劫持监听,但使用了一个错误的编码方式,忽略了HTTPS通信过程中的证书校验错误,导致HTTPS通信能够被中间人劫持。
漏洞原理:
目前安卓APP在开发上使用HTTPS通信的方案分两种:
1.直接使用系统的ssl trustmanger,信任系统已经安装的证书。
2.自定义ssl trustmanger,可以信任自签名证书,自定义trustmange各种设置和方法。
APP应用在使用HTTPS会碰到很多兼容问题:
1. 时间同步问题,手机的时间与服务器时间不同步可能会导致HTTPS无法使用。
2. 证书过期问题,服务端使用的证书过期失效,可能会导致HTTPS无法使用。
等等…
儿童卫士APP是使用的自定义ssl trustmanger方案使用HTTPS通信,儿童卫士APP在使用https的时候经常会遇到no peercertificate 错误,于是开发人员为了解决错误直接忽略了证书校验产生的错误,导致信任了所有证书,使APP的HTTPS通信能够被中间人劫持。
相关编码错误如下,使用了自定义的SSLSocketFactoryEx(继承自SSLSocketFactory)接管忽略了SSL证书校验错误java.security.cert.CertificateException。
在验证证书的时候,不做任何处理,代码如下
private class SSLSocketFactoryEx extends SSLSocketFactory {
SSLContext mSSLContext = SSLContext.getInstance("TLS");
public SSLSocketFactoryEx(KeyStore truststore)
throws NoSuchAlgorithmException, KeyManagementException,
KeyStoreException, UnrecoverableKeyException {
super(truststore);
TrustManager tm = new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain, String authType)
throws java.security.cert.CertificateException {
}
};
mSSLContext.init(null, new TrustManager[] {
tm
}, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port,
boolean autoClose) throws IOException, UnknownHostException {
return mSSLContext.getSocketFactory().createSocket(socket, host, port,
autoClose);
}
@Override
public Socket createSocket() throws IOException {
returnmSSLContext.getSocketFactory().createSocket();
}
}
修复方案:
参照Google官方的SSL安全建议 https://developer.android.com/training/articles/security-ssl.html
一般正确的SSL检查内容包括以下内容:
1. 证书是否是CA签名
2. 证书是否是自签名
3. 主机域名是否匹配
经验教训:
开发者不能以应用的兼容问题为借口而去修改原本安全的策略,更不能以整个APP的安全为代价换取更好的功能和用户体验。
漏洞二、360儿童卫士2 APP Logout接口CSRF漏洞
影响范围:360儿童手环2
漏洞危害评级:低
漏洞原理:
儿童卫士本身的协议做到了一些安全措施,包括防止黑客模拟儿童卫士的请求进行攻击,在各关键操作时使用了加密校验参数p,并且对服务端返回的敏感数据也做了加密处理,但是Logout接口未加入此校验参数,导致攻击者可利用中间人劫持或CSRF方式让“目标APP下线”。
CSRF(Cross-site request forgery跨站请求伪造)通常缩写为CSRF或者XSRF。CSRF使黑客可以冒充合法用户的身份,使合法用户在不知情的情况下触发某些关键操作。
修复方案:
对所有关键操作加入不可预测的加密参数作请求合法性校验。
经验教训:
系统整体的安全性取决于最薄弱的一环,安全策略不可忽视任何细节,需要真正落实到每一处。