http://www.91ri.org/12540.html

http://www.91ri.org/12540.html

http://www.91ri.org/12540.html

Android证书信任问题与大表哥

0x00 起因


1、近期icloud.com、yahoo.com、apple.com遭遇到大规模劫持

WooYun: Yahoo雅虎在国内访问遭遇SSL中间人攻击(被替换为自签名证书)

2、乌云平台、CVE都收到大量有关Android APP信任所有证书的漏洞

WooYun: 国内绝大部分Android APP存在信任所有证书漏洞

3、老外写有关大表哥的文章中提到MITM时360浏览器不提示证书错误

http://www.computerworld.com/article/2836084/chinese-big-brother-launches-nationwide-attack-on-icloud.html

之前信任证书问题一直都有被提到,但是普遍不受大家重视,因为这个漏洞是利用是需要场景的:MITM(中间人攻击 Man-in-the-middle attack)。一般情况下MITM相对其他攻击是比较少见的,如果有良好的上网习惯如不接入不受信任的网络,那就更少可能受此类攻击了。但是近期发生的 MITM据传是在核心骨干网BGP上做了改动所以劫持范围非常之广,真是防不胜防呀,你被劫持了么?

0x01 科普


https&&ssl

为了提高网站的安全性,一般会在比较敏感的部分页面采用https传输,比如注册、登录、控制台等。像Gmail、网银、icloud等则全部采用 https传输。https/ssl主要起到两个作用:网站认证、内容加密传输和数据一致性。经CA签发的证书才起到认证可信的作用,所有有效证书均可以 起到加密传输的作用。

数字证书

主要在互联网上的用于身份验证的用途。 安全站点在获得CA(Certificate Authority数字证书认证机构)认证后,获得一个数字证书,以此来标识其合法身份的真实性。数字证书主要分为服务器证书和客户端证书。服务器证书 (SSL证书)用来进行身份验证和通信的加密,客户端证书主要用于身份验证和电子签名。找CA申请证书是要收费的。

自签名证书

非CA颁发的证书,通过自签名的方式得到的证书。通常Web浏览器会显示一个对话框,询问您是否希望信任一个自签名证书。这个是不用花钱的。

中间人攻击

是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。在许多情况下这是很简单的。

0x02 分析


如果自己简单的实现android webview加载网页,如果直接访问可信证书的站点是可以正常显示,但是如果访问自签名的证书的站点就会显示notfound的页面。(写本文时apple.com以及apple.com.cn处于劫持状态)

logcat会输出网页显示不安全的内容

Default
1
Web Console:The page displayed insecure content!

功能健全的手机浏览器访问自签名证书的站点会如下提醒

在PC端如果访问自签名证书的站点则会出现如下图左侧的提醒

为解决

Default
1
javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

的异常,开发者往往会采用以下的错误解决方案。如此是浏览器应用采用此类解决方案,那么风险就更大了。

覆盖google默认的证书检查机制

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class bv
  implements X509TrustManager
{
  bv(bu parambu) {}
  public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate,String paramString) {// Do nothing -> accept any certificates}
  public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate,String paramString) {// Do nothing -> accept any certificates}
  public X509Certificate[] getAcceptedIssuers()
  {
    return null;
  }
}

信任所有主机名

Default
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

public static HttpClient getNewHttpClient() {  
    try {  
        //获得密匙库
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());  
        trustStore.load(null, null);  
        SSLSocketFactory sf = new SSLSocketFactoryEx(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();  
    }  
}

empty HostnameVerifier

Default
1
2
3
4
5
6
7

HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
// Always return true -> Accespt any host names
return true;
}
};

其实早在14年2月窃听风暴: Android平台https嗅探劫持漏洞文 中就有提到android平台的app因为覆盖google默认的证书检查机制(X509TrustManager)之后没有对证书进行应有的安全性检 查,直接接受了所有异常的https证书,不提醒用户存在安全风险,也不终止这次危险的连接。文中对证书域名检查(HostnameVerifier)部 分没有细说。

上文有提到PC版的360浏览器访问被劫持网站居然没有证书错误提示,让人很不敢相信。加上最近android app 证书问题频发,猜想是否有可能一些手机浏览器也会有此类漏洞了。测试过程中发现360手机浏览器、和搜狗浏览器存在此风险。

百度和遨游轻松检测出证书异常

而360和搜狗直接加载进入了被劫持的网站。

反编译查看遨游浏览器的代码,针对证书异常做了处理

而搜狗浏览器则是做了证书信任所有主机名不当处理

关键字:checkServerTrusted、setHostnameVerifier、ALLOW_ALL_HOSTNAME_VERIFIER、X509TrustManager、onReceivedSslError

0x03 对比


对主流手机浏览器进行了横向对比,测试对象包括:firefox、chrome、UC浏览器、搜狗浏览器、百度浏览器、360安全浏览器、欧鹏浏览器、遨游云浏览器、猎豹浏览器。

测试方法:手机访问https://example.com/,观察是否有安全提醒。(update:此方法已经无效.)

未做提醒直接加载网页:360安全浏览器、猎豹浏览器、搜狗浏览器

正常做出安全提醒:firefox、chrome、UC浏览器、百度浏览器、欧鹏浏览器、遨游云浏览器

0x04 建议


开发者:

1、非浏览器app,有钱申请ca证书没钱在客户端中添加证书,切勿信任所有证书。

2、浏览器app,严格按照客户端校验服务器证书流程处理:

  • 查看证书是否过期
  • CA是否可靠
  • CA的公钥能否正确解开服务器证书的CA数字签名,即证书的签名值
  • 服务器证书上的域名是否和服务器的实际域名相匹配

3、建议使用setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER)

用户:使用安全性较好的app

0x05 参考


http://drops.wooyun.org/tips/2775

http://drops.wooyun.org/papers/959

http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html

http://developer.android.com/reference/javax/net/ssl/X509TrustManager.html

http://developer.android.com/training/articles/security-ssl.html

http://developer.android.com/reference/org/apache/http/conn/ssl/SSLSocketFactory.html

[via@drops wooyun] 注:未经过乌云知识库授权请勿转载本篇文章。

Android证书信任问题与大表哥相关推荐

  1. Hbuilder Android证书申请

    Hbuilder Android证书申请 1.安装JDK 2.在cmd下,进入到JDK的bin目录,输入: keytool -genkey -alias yourapp -keyalg RSA -va ...

  2. (转)CMMI证书背后的6大怪现象

    CMMI证书背后的6大怪现象 CMMI证书到手了之后,企业还要做些什么? CMMI认证进入我国软件领域的这十多年来,对我国软件产业的健康发展作出了巨大贡献.但一些软件企业只是以获得证书为根本目的,而忘 ...

  3. 不仅是 64 位 Android L 还有这 9 大亮点

    Android L无疑是谷歌今年最重要的新产品之一,其战略意义重大,代表着谷歌统一多种设备平台的决心.显然,Android L有很多值得我们期待和兴奋的地方,以下是最主要的9点: Material D ...

  4. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  5. android 录音原始文件_5分钟短文 | Android证书生成,签名,验证,虽然难,但学一次就够了!...

    引言 从Android演进开始,APK签名就已经成为Android的一部分,并且android要求所有Apks都必须先签名,然后才能将其安装在设备上.关于如何生成密钥以及如何签名的文章很多.一个Apk ...

  6. jodd忽略ssl证书_关于java访问https资源时,忽略证书信任问题

    java程序在访问https资源时,出现报错 sun.security.validator.ValidatorException: PKIX path building failed: sun.sec ...

  7. iOS 10.3下解决Fiddler代理抓包ssl证书信任问题

    iOS 10.3下解决Fiddler代理抓包ssl证书信任问题 参考文章: (1)iOS 10.3下解决Fiddler代理抓包ssl证书信任问题 (2)https://www.cnblogs.com/ ...

  8. kubernetes实战篇之windows添加自签ca证书信任

    系列目录 由于服务端设置了https访问,因此如果通过浏览器访问时会提示证书不被信任,但是仍然可以通过处理继续访问.但是在自动化环境中,都是通过命令来请求的,这样不受信任的https就会报错误,这样我 ...

  9. Android 7.0动态权限大总结

    本文讲的是Android 7.0动态权限大总结,应公司项目需求,做了下Android 7.0适配.对于我们程序员,适配7.0主要就是对手机本地文件的Uri做转换处理.注意红色字体,意思也就是说对于ht ...

  10. 生成android 证书

    签名文件keystore一般有两种:jks后缀或者keystore后缀,Android Studio中创建的为jks后缀,keytool创建的为keystore后缀,两种文件均可用于APP打包. 1. ...

最新文章

  1. Delphi数据库开发之TTable篇1
  2. python 字典操作 内存占用,python - 如何强行释放字典使用的内存? - SO中文参考 - www.soinside.com...
  3. 老司机做VR视频,需要什么样的全景相机?
  4. 机器学习——常用算法的总结
  5. 怎么用python表白_如何正确使用Python进行表白?这是个值得思考的问题!
  6. 输入法画面_搜狗输入法:用AI技术谱写诗意生活
  7. Web开发:Apache2.2.x+Tomcat6.x+jk2.x做集群配置
  8. Android binder
  9. mac电脑上如何看java jdk文档
  10. displaytag分页中文处理
  11. J2EE领域的一些技术框架结构图
  12. 如何使用u深度启动u盘清除系统登录密码
  13. 飞凌ok6410一键烧写linux文件,飞凌OK6410-B Linux学习之一刷机过程
  14. 中国排名前100的IT公司及中国通信企业综合实力50强(转)
  15. 阿里云服务器地域暂时无法办理经营性ICP许可证什么意思?
  16. ERROR 1366 (HY000): Incorrect string value: ‘\xE8\xB5\xB5\xE9\x9B\xB7‘ for column ‘s_name‘ at row 1
  17. 均值不等式中考_不等式(初三不等式100道带答案)
  18. 排位赛2-I Would Walk 500 Miles
  19. IOST节点竞选计划公布,欢迎广大开发者参与成为节点!
  20. 【肥朝】从JDK中,我们能学到哪些设计模式?

热门文章

  1. 一个筛选键引起电脑键盘失灵的命案
  2. 计算机DVD驱动禁用怎么恢复,设备管理器中找不到dvd驱动器 怎么恢复 - 驱动管家...
  3. vue项目中金额小写转换为汉字大写的功能封装
  4. 基于STM32F103+涂鸦三明治的宠物自动喂食器
  5. 【Scratch一级真题解析】电子学会等级考试一级(选择题)-2021年9月
  6. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术
  7. 威廉玛丽学院计算机教授刘旭,专栏-中国计算机学会
  8. bootstrap怎么强制不换行_Bootstrap方法的软件实现
  9. Infor CRM咨询服务市场市场报告-Infor CRM咨询服务销售额及预测
  10. 如何将一个数字转换为字符串并且按照指定格式显示?--TO_CHAR