漏洞说明

 /*** 覆盖java默认的证书验证*/private static final TrustManager[] TRUSTALLCERTS = new TrustManager[]{new X509TrustManager() {public java.security.cert.X509Certificate[] getAcceptedIssuers() {return new java.security.cert.X509Certificate[]{};}@SuppressLint("TrustAllX509TrustManager")public void checkClientTrusted(X509Certificate[] chain, String authType) {}@SuppressLint("TrustAllX509TrustManager")public void checkServerTrusted(X509Certificate[] chain, String authType) {}}};try {SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, TRUSTALLCERTS, new java.security.SecureRandom()); //配置自己的信任管理类(信任策略)SSLSocketFactory newFactory = sc.getSocketFactory();connection.setSSLSocketFactory(newFactory);} catch (Exception e) {e.printStackTrace();}

如上代码所示,自定义与使用了X509TrustManager子类,但又没有实现信任校验的逻辑时遇,对安全平台扫描APK时,会报如下风险

【漏洞】自定义实现的X509TrustManager子类中,未对服务器端证书做验证,默认接受任意服务端证书,会存在安全风险,可能会导致恶意程序利用中间人攻击绕过证书校验

【修复的建议通常的如下】

利用X509TrustManager子类中的checkServerTrusted函数,校验服务器端证书的合法性

PS:一般自定义信任管理器,通常是使用自签名或android不认可的证书颁发机构SSL证书的业务场景
使用这个方式最麻烦是公钥/证书放置在前端,以及公钥的同步等问题!!!

修复建议

个人的修复建议是
【前提条件】
1、你的SSL证书是由android认可的证书颁发机构或者该结构下属的机构颁发的证书(最关键)
2、使用的https的服务的请求与响应的数据安全性不是那么高(数据不敏感与私密),
3、又不保证服务器的证书是否不会被替换,
那么性价较高且简单明了的方案是

不要使用509TrustManager子类!
不要使用509TrustManager子类!
不要使用509TrustManager子类!
即使用默认的系统网络库默认的信任管理/校验方案,系统会使用证书链的信任管理策略

PS:

Android已经把将近150个CA根证书(数字证书认证机构认证过的证书)内置在我们手机中。这150多个证书被全世界信赖

TIPS分享

查看域名的证书的信息

利用chrome打开对应的域名,查看即可

证书详情

查看信息的信证CA根证书

设置->安全->信任的凭据

自定义X509TrustManage示例

说明 : 如下代码copy自 学会正确的使用 https,不要留下漏洞!!

public static SSLSocketFactory getSSLSocketFactory() throws Exception {final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {// 本地公钥信息,实现项目中在考虑该值的更新,否则服务证书一换,之前的端不会能正常工作了public static final String PUB_KEY = "3082010a0282010100d52ff5dd432b3a05113ec1a7065fa5a80308810e4e181cf14f7598c8d553cccb7d5111fdcdb55f6ee84fc92cd594adc1245a9c4cd41cbe407a919c5b4d4a37a012f8834df8cfe947c490464602fc05c18960374198336ba1c2e56d2e984bdfb8683610520e417a1a9a5053a10457355cf45878612f04bb134e3d670cf96c6e598fd0c693308fe3d084a0a91692bbd9722f05852f507d910b782db4ab13a92a7df814ee4304dccdad1b766bb671b6f8de578b7f27e76a2000d8d9e6b429d4fef8ffaa4e8037e167a2ce48752f1435f08923ed7e2dafef52ff30fef9ab66fdb556a82b257443ba30a93fda7a0af20418aa0b45403a2f829ea6e4b8ddbb9987f1bf0203010001";@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] chain,String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] chain,String authType) throws CertificateException {if (chain == null) {throw new IllegalArgumentException("checkServerTrusted:x509Certificate array isnull");}if (!(chain.length > 0)) {throw new IllegalArgumentException("checkServerTrusted: X509Certificate is empty");}if (!(null != authType && authType.equalsIgnoreCase("RSA"))) {throw new CertificateException("checkServerTrusted: AuthType is not RSA");}try {TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");tmf.init((KeyStore) null);for (TrustManager trustManager : tmf.getTrustManagers()) {((X509TrustManager) trustManager).checkServerTrusted(chain, authType);}} catch (Exception e) {throw new CertificateException(e);}RSAPublicKey pubkey = (RSAPublicKey) chain[0].getPublicKey();String encoded = new BigInteger(1 , pubkey.getEncoded()).toString(16);final boolean expected = PUB_KEY.equalsIgnoreCase(encoded);if (!expected) {throw new CertificateException("checkServerTrusted: Expected public key: "+ PUB_KEY + ", got public key:" + encoded);}}@Overridepublic java.security.cert.X509Certificate[] getAcceptedIssuers() {return new java.security.cert.X509Certificate[0];}}};final SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, trustAllCerts,new java.security.SecureRandom());return sslContext.getSocketFactory();}

相关文档

  • 学会正确的使用 https,不要留下漏洞!!
  • https是如何工作的?
  • 聊聊 Android HTTPS 的使用姿势
  • 学会正确的使用 https,不要留下漏洞!!
  • Https证书校验不当引起的安全问题
  • 通过 HTTPS 和 SSL 确保安全

【漏洞修复】自定义实现的X509TrustManager子类中..相关推荐

  1. 浅谈漏洞修复的方法论

    序言 大人,时代变了 面临的场景不同 技术的不同 应该怎么做 战略 组织 技术 策略 未来的发展 是否是创业的方向 序言 近日在看到安全牛发布的<漏洞管理的八大趋势>,其中提到了" ...

  2. java中xxe漏洞修复方法

    java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不 ...

  3. VMware 修复 Workstation、Fusion 和 ESXi中的多个漏洞

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 本周,VMware 发布 Workstation.Fusion 和 ESXi 产品线的安全更新,提醒称其中的堆缓冲区溢出漏洞 (CVE-2021 ...

  4. 关于ECSHOP中sql注入漏洞修复

    标签:ecshop sql注入漏洞修复 公司部署了一个ecshop网站用于做网上商城使用,部署在阿里云服务器上,第二天收到阿里云控制台发来的告警信息,发现ecshop网站目录下文件sql注入漏洞以及程 ...

  5. 阿里云Linux服务器漏洞修复 ( 继续汇总中 )

    USN-3767-1: GLib 漏洞 修复命令:apt-get update && apt-get install libglib2.0-0 --only-upgrade 软件:li ...

  6. [转]Android 常见安全漏洞修复理论与实践

    前言 前段时间公司对应用在爱加密上进行了安全扫描,本文将基于爱加密的漏洞分析报告,针对部分内容,介绍理论修复实践 最小化特权准则概念介绍 最小化特权准则,即指组件只能供自身应用调用,尽可能禁止其他应用 ...

  7. Web常见漏洞修复建议

    一.SQL注入修复建议 1.过滤危险字符,例如:采用正则表达式匹配union.sleep.and.select.load_file等关键字,如果匹配到则终止运行. 2.使用预编译语句,使用PDO需要注 ...

  8. 阿里云安全中心之漏洞修复最佳实践

    新钛云服已累计为您分享666篇技术干货 一.云安全中心简介 云安全中心是一个实时识别.分析.预警安全威胁的统一安全管理系统,通过防勒索.防病毒.防篡改.镜像安全扫描.合规检查等安全能力,实现威胁检测. ...

  9. thinkcmf 渗透测试漏洞修复解决方案

    近段时间发现很多APP程序用的是thinkcmf,此程序源码存在getshell漏洞,我们Sine安全紧急对此高危漏洞进行了分析和漏洞修复,攻击者可以通过构造特定的请求包get请求即可在远程服务器上执 ...

最新文章

  1. 老公趴下!62图给你讲Docker
  2. Java 实现 Trie (前缀树)
  3. 容器学习 之 容器的概念(一)
  4. 逻辑回归:损失函数与梯度下降
  5. dump文件解析之探索.Net的内存
  6. CSS布局(五) 网页布局方式
  7. leetcode - 813. 最大平均值和的分组
  8. 劲爆ORACLE优化,你不必是专家
  9. 使用EF Core和AngularJS的Master Chef(第3部分)ASP.NET Core MVC
  10. mysql 字段加减_MySQL数据库开发常见问题及优化(续)
  11. Mac os 10.5.8, 驱动声卡成功
  12. 计算机c盘删除的文件怎么找回,两分钟恢复电脑误删除的文件数据
  13. golang解决数据库中null值的问题
  14. VideoPlayer视频播放
  15. 性能服务器主板如何进bois,各种主板进入BIOS设置的图文教程
  16. 【实操】python opencv将图片合成视频,并插入音频
  17. JavaScript之移动端网页特效与本地存储(57th)
  18. ARM实验板移植,linux点阵字库的使用
  19. 双栈排序java_双栈排序
  20. 中国主要知名的旅游与酒店调查研究咨询公司

热门文章

  1. python3使用requests和csv库抓取某地市肯德基门店地址并存入csv文件
  2. u盘在电脑上读不出来?数据恢复解决方法在这
  3. 音频总线专题(一)——基本知识
  4. 手机连接电脑只能充电怎么回事
  5. 社区团购小程序怎么盈利
  6. PDF翻译怎么操作?教你几个PDF翻译的技巧
  7. 自制编程语言,六个令你迷惑的问题
  8. 【OS操作系统】Operating System 第五章:虚存技术
  9. DTOJ #3194. 去月球
  10. Pnpm Workspace: 单仓库多项目(monorepo)