Android应用安全之数据传输安全

  Android软件通常使用WIFI网络与服务器进行通信。WiFi并非总是可靠的,例如,开放式网络或弱加密网络中,接入者可以监听网络流量;攻击者可能 自己设置WIFI网络钓鱼。此外,在获得root权限后,还可以在Android系统中监听网络数据。

不加密地明文传输敏感数据

  最危险的是直接使用HTTP协议登录账户或交换数据。例如,攻击者在自己设置的钓鱼网络中配置DNS服务器,将软件要连接的服务器域名解析至攻击者的另一台服务器在,这台服务器就可以获得用户登录信息,或者充当客户端与原服务器的中间人,转发双方数据。

早期,国外一些著名社交网站的Android客户端的登录会话没有加密,后来出现了黑客工具FaceNiff,专门嗅探这些会话并进行劫持(它甚至支持在WEP、WPA、WPA2加密的WIFI网络上展开攻击),这是目前我所知的唯一一个公开攻击移动软件漏洞的案例。

这类问题的解决方法很显然-----对敏感数据采用基于SSL/TLS的HTTPS进行传输。

SSL通信不检查证书有效性

  在SSL/TLS通信中,客户端通过数字证书判断服务器是否可信,并采用证书的公钥与服务器进行加密通信。

  然而,开发人员在开发过程中为了解决ssl证书报错的问题(使用了自己生成了证书后,客户端发现证书无法与系统可信根CA形成信任链,出现了CertificateException等异常),会在客户端代码中采用信任客户端中所有证书的方式: 

public static HttpClient getWapHttpClient() {
 
              try {
 
                    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
 
                    trustStore.load(null, null);
 
                    SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
 
                    sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
 
                  //此处信任手机中的所有证书,包括用户安装的第三方证书
 
                    HttpParams params = new BasicHttpParams();
 
                    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
 
                    HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
 
                    SchemeRegistry registry = new SchemeRegistry();
 
                    registry.register(new Scheme(“http”, PlainSocketFactory.getSocketFactory(), 80));
 
                    registry.register(new Scheme(“https”, sf, 443));
 
                    ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
 
                    return new DefaultHttpClient(ccm, params);
 
              } catch (Exception e) {
 
                    return new DefaultHttpClient();
 
              }
 
      }

而在客户端中覆盖google默认的证书检查机制(X509TrustManager),并且在代码中无任何校验SSL证书有效性相关代码:

public class MySSLSocketFactory extends SSLSocketFactory {
 
      SSLContext sslContext = SSLContext.getInstance(“TLS”);
 
      public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
 
              super(truststore);
 
              TrustManager tm = new X509TrustManager() {
 
                      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
 
                    }
 
                    //客户端并未对SSL证书的有效性进行校验,并且使用了自定义方法的方式覆盖android自带的校验方法
 
                    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
 
                    }
 
                    public X509Certificate[] getAcceptedIssuers() {
 
                            return null;
 
                    }
 
              };
 
              sslContext.init(null, new TrustManager[] { tm }, null);
 
      }
}

  如果用户手机中安装了一个恶意证书,那么就可以通过中间人攻击的方式进行窃听用户通信以及修改request或者response中的数据。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0e1b39173339513f0713f3d2f622ad91.html