2016-11-29 39 views
1

今天我刚收到这封电子邮件来自谷歌:在这封电子邮件的结尾处列出谷歌播放警告:如何解决不正确执行的HostnameVerifier的

您的应用程序(S)有不安全的 实现的HostnameVerifier接口,它在使用setDefaultHostnameVerifier API与 建立与远程主机的HTTPS连接时接受所有 主机名,从而使您的应用程序容易受到 的中间人攻击。攻击者可以读取传输的数据 (例如登录凭证),甚至可以更改在HTTPS连接上传输的数据。

不幸的是,我搜索了我的所有代码,发现没有使用HostnameVerifier,也没有使用setDefaultHostnameVerifier,甚至没有任何HTTPS连接!

我在其最新版本中使用Google的兼容性库:25.0.1,在我的一些应用程序中使用了Google Ads 9.8.0。将广告升级到10.0.1,因为我只能假设罪魁祸首在那里?!

有没有人收到此警报,如果是的话,你是如何解决它?

+0

你使用像Glide第三方库吗?同样的警报在这里,不知道如何解决它。代码中没有HostNameVerifier的直接实现。 – Stan

+0

仅使用Google广告和Google兼容性库。我的一些项目包括Xposed框架JAR,jcifs samba源代码和Apache commons.net源代码。但受影响的项目没有这些。 – 3c71

回答

1

同样在这里 - 不安全的主机名验证检测在APK

您的应用使用不安全的实现的HostnameVerifier的。有关详细信息,请参阅此Google帮助中心文章,其中包括 修复漏洞的截止日期,请参阅 。我没有使用HostnameVerifier 而不是调用setDefaultHostnameVerifier。此外 - 我使用OKHTTP lib用于http请求。我希望定义TrustManager将解决 这个问题。

由于我不是继承HostnameVerifier或致电setDefaultHostnameVerifier()我认为它依赖于一些第三方库。既然不能检测这样的lib我想我会尝试添加一类具有下面的代码

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
     public boolean verify(final String hostname, final SSLSession session) { 
      if (check if SSL is really valid) 
       return true; 
      else 
       return false; 
     } 
    }); 

到我的项目,并会看它是否修复该问题。
所以我做到了,另外每webView的我已经添加了重写的方法

@Override 
      public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) { 
// the main thing is to show dialog informing user 
// that SSL cert is invalid and prompt him to continue without 
// protection: handler.proceed(); 
// or cancel: handler.cancel(); 
       String message; 
       switch(error.getPrimaryError()) { 
        case SslError.SSL_DATE_INVALID: 
         message = ResHelper.getString(R.string.ssl_cert_error_date_invalid); 
         break; 
        case SslError.SSL_EXPIRED: 
         message = ResHelper.getString(R.string.ssl_cert_error_expired); 
         break; 
        case SslError.SSL_IDMISMATCH: 
         message = ResHelper.getString(R.string.ssl_cert_error_idmismatch); 
         break; 
        case SslError.SSL_INVALID: 
         message = ResHelper.getString(R.string.ssl_cert_error_invalid); 
         break; 
        case SslError.SSL_NOTYETVALID: 
         message = ResHelper.getString(R.string.ssl_cert_error_not_yet_valid); 
         break; 
        case SslError.SSL_UNTRUSTED: 
         message = ResHelper.getString(R.string.ssl_cert_error_untrusted); 
         break; 
        default: 
         message = ResHelper.getString(R.string.ssl_cert_error_cert_invalid); 
       } 
       mSSLConnectionDialog = new MaterialDialog.Builder(getParentActivity()) 
         .title(R.string.ssl_cert_error_title) 
         .content(message) 
         .positiveText(R.string.continue_button) 
         .negativeText(R.string.cancel_button) 
         .titleColorRes(R.color.black) 
         .positiveColorRes(R.color.main_red) 
         .contentColorRes(R.color.comment_grey) 
         .backgroundColorRes(R.color.sides_menu_gray) 
         .onPositive(new MaterialDialog.SingleButtonCallback() { 
          @Override 
          public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) { 
           mSSLConnectionDialog.dismiss(); 
           handler.proceed(); 
          } 
         }) 
         .onNegative(new MaterialDialog.SingleButtonCallback() { 
          @Override 
          public void onClick(MaterialDialog materialDialog, DialogAction dialogAction) { 
           handler.cancel(); 
          } 
         }) 
         .build(); 
       mSSLConnectionDialog.show(); 
} 

mWebView.setWebViewClient(new WebViewClient() { 
... // other corresponding overridden methods 
} 

最后谷歌称:

安全扫描完整
无已知的漏洞会在APK 158中检测到。

但是我不确定代码是什么,HostNameVerifieronReceivedSslError()mWebView.setWebViewClient

+0

你是如何得到这个安全扫描的?我刚发布了一个更新的APK,没有得到任何警告或看到这样的扫描?也许我没有注意。 – 3c71

+1

当您上传apk(Menu-> APK)时,将其作为Beta版本(我不知道它是否与Production相同)以及一段时间之后转到Menu-> Pre-Launch Report(第3个选项从APK启动)到安全选项卡。 “ – Stan

+0

”“”“SECURITY SCAN COMPLETE 没有发现任何已知漏洞的APK 26.”“”我收到了这个消息,但警报仍然存在。任何想法 ? –

0

按照从谷歌收到的邮件,可以有针对此问题的两种可能性:

主要是你必须检查你的包名称未使用由谷歌限制的关键字。例如“com.companyname。android”,则不允许.android。次要的是检查HostNameVerifier

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
    public boolean verify(final String hostname, final SSLSession session) { 
     if (/* check if SSL is really valid */) 
      return true; 
     else 
      return false; 
    } 
});