| 首页 > 新闻公告 > 公告详情
360儿童卫士2漏洞分析报告
2014-10-27

漏洞一.   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 错误,于是开发人员为了解决错误直接忽略了证书校验产生的错误,导致信任了所有证书,使APPHTTPS通信能够被中间人劫持。

 

相关编码错误如下,使用了自定义的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下线

CSRFCross-site request forgery跨站请求伪造)通常缩写为CSRF或者XSRFCSRF使黑客可以冒充合法用户的身份,使合法用户在不知情的情况下触发某些关键操作。

 

修复方案:

对所有关键操作加入不可预测的加密参数作请求合法性校验。

 

经验教训:

系统整体的安全性取决于最薄弱的一环,安全策略不可忽视任何细节,需要真正落实到每一处。