【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

研究人员揭露 SSL 库及其在非浏览器服务方面的弱点

  • 2012-12-04
  • 本文字数:2608 字

    阅读完需:约 9 分钟

美国德州大学奥斯汀分校和斯坦福大学的研究人员公布了他们的研究成果,研究表明大众认为高度安全的 SSL 库,在非浏览器应用使用的过程中存在严重的弱点。这些需要高度安全保障的关键性服务包括银行服务、电子商务用户的 SDK 及关键程度稍低一些的软件服务,如云存储服务和通讯服务。这篇文章指出了以下问题:对抗测试表现不佳、SSL 库本身存在弱点,程序调用 SSL 库的过程中存在弱点,查找深藏在堆栈中的弱点复杂,以及开发人员普遍禁用证书验证的不安全的实践。

该研究团队所使用的威胁模型是动态的中间人攻击模型(MITM)。模拟中间人使用了三份证书进行攻击:(1) 一份自签发的证书,证书的通用名(common name)与客户端尝试连接的主机的通用名相同,(2) 一份使用错误通用名的自签发证书, (3) 由可信的认证授权机构 AllYourSSLAreBelongTo.us 签发的一份有效证书。中间人集中对信任验证链和主机名验证进行攻击,未对证书吊销或是 X.509 的扩展内容进行测试。可以在这里下载到威胁模型模拟的代码。

这篇文章就开发人员使用 SSL 库的问题上,探讨了一些具体实现的细节:OpenSSL、JSSE 以及数据传输库:Apache HttpClient、Weberknecht、cURL、PHP 的 fsockopen 方法,cURL 绑定,以及 Python 的 urllib、urllib2 和 httplib。多数 SSL 库在进行证书验证的时候,向客户端开放了一些主机名验证的选项,但它们被很多开发人员忽略了。比如,JSSE 底层的 API,SSLSocketFactory 类,如果未指定算法,那么会自动关闭主机名验证。多数客户端,包括 Apache HttpClient,均未在程序中另行实现主机名验证功能,使其存在安全风险。

下面是 SSLSocketFactory 中进行证书验证的代码片段,证明这种问题是普遍存在的。

复制代码
private void checkTrusted(X509Certificate[] chain, String
authType, Socket socket, boolean isClient)
throws CertificateException {
...
//check end point identity
String identityAlg = sslSocket.getSSLParameters().
getEndpointIdentificationAlgorithm();
if (identityAlg != null && identityAlg.length != 0)
{
String hostname = session.getPeerHost();
checkIdentity(hostname, chain[0], identityAlg);
}
}

使用这些库的非浏览器应用,其堆栈中都会隐藏着这类弱点。如需获得客户端正确调用 SSL 和数据传输库的具体建议,请参考本文作者提供的FAQ

文章的后半部分主要讨论了各种模拟攻击的研究成果,它们是云客户端的API(AWS EC2 和ELB 的API 工具)、应用程序(大通银行的移动应用、Rackspace 的IOS 应用、Groupon 的安卓应用和TextSecure)、SDK(亚马逊灵活支付服务SDK,PayPal 支付标准SDK)、Web 服务中间件(Apache Axis、Axis2、CodeHaus XFire 和Pusher)以及移动广告应用(AdMob)。文章总结了给应用开发人员的一些建议:

切记进行模糊测试(黑盒测试,如果有必要)和对抗测试,去观察在使用异常SSL 证书时,应用的具体行为。弱点一般很隐蔽,而且经常连现象都没有。在我们的许多研究案例中,很明显的现象是,除了目标服务器的证书外,开发人员没有使用别的证书进行过测试。当使用AllYourSSLAreBelongTo.us 签发的证书替代亚马逊、PayPal 或大通银行的证书时,这些程序立刻建立了SSL 连接,并将秘密拱手相让。这些问题,应当在测试阶段暴露出来。

切勿在对自签发和(或者)不可信证书进行测试的时候,改动程序代码并关闭证书验证。因为我们发现,在研究中,开发人员常常忘记在软件的正式版本中撤销这些改动。作为替代的办法,我们可以创建一个不可信的CA 公钥,并将其存放在一同创建的临时证书库中。测试代码的时候,如需使用自签发或是不可信证书时,可以使用刚刚创建的证书库来替代你的可信证书库。

切勿寄希望于SSL 库的默认设置保证SSL 连接的安全。同一库的不同版本的默认设置都有可能不同,更别说不同的库了——比如,cURL 7.10 之前的版本,默认不会验证证书,但是7.10 及以后的版本则会进行验证。因此,为建立安全的连接,往往需要显式地设置这些选项,而不能使用默认的设置。

下面是对SSL 库开发人员的建议:

切记在开发SSL 库时,API 的语义要更加明确和详细。在许多情况下,应用开发人员明显不明白参数和大量选项的作用。比如,亚马逊灵活支付服务(Amazon Flexible Payments Services)和PayPal 支付标准(PayPal Payments Standard)的PHP 库尝试在cURL 中启用主机名验证,但是没想到,不仅没能启用,还意外的覆盖了正确的默认值,最终不得不禁用这个选项(详见7.1 和7.2 节)。这说明,即使默认值足够安全,也不能够保证安全。Lynx 尝试对自签发的证书进行检查,但是因为误解了GnuTLS 证书验证功能返回值的意思,导致这个检查实际上从未执行过(详见7.4 节)。

规范化SSL 库的API 的简要的语义描述,以及严格验证应用程序与库之间的“契约”,,这些将是未来研究中的一个有意思的课题,那时可能需要编程语言的支持。

切勿将管理SSL 连接的责任扔给应用。现有SSL 库为更高层的软件调用提供了很多选项。丰富的选择使其充满了危险。应用开发人员并没有意识到,他们必须明确的选择特定的选项,才能进行证书验证。因此,SSL 库应当尽可能地使用安全的默认值。此外,SSL 库不应该在未启用重要功能(如主机名验证)时保持沉默,就像JSSE 一样,当算法字段为Null 或留空的时候无任何提示(详见4.1 节)。相反,SSL 库应当抛出一个异常或是通过其他方式通知应用。

务必设计简洁、一致的错误报告接口。SSL 库如OpenSSL 和GnuTLS,在报告错误的时候,有时会通过函数的返回值,有时会通过传入的标记参数返回。混乱的报告接口搞得开发人员晕头转向,以至于在应用排错的时候会无意中漏掉了一些问题。

部分软件的开发商已经对文中指出的问题进行处理,并且将处理结果反馈给了研究人员,详见 FAQ 。为了便于开发人员处理这些 SSL 的问题, ISec 合作伙伴已经就本文内容,发布了三款弱点测试的工具。但是这些工具的使用,并不能代替作者所建议的对 SSL 实现方法的完全审查或是对抗测试。

查看英文原文 Researchers Expose SSL Vulnerabilities in Libraries and Their Usage in Popular Non-Browser Services


感谢马国耀对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-12-04 07:181968
用户头像

发布了 36 篇内容, 共 13.4 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

MimeType文件格式速查表

入门小站

工具

为什么 Golang 正在接管软件行业

云原生

云计算 Kubernetes 云原生 编程语言 Go 语言

让Chrome爽到飞起的5款小众插件!

Jackpop

什么是可中断锁?有什么用?怎么实现?

王磊

9月日更

手撸二叉树之二叉树的所有路径

HelloWorld杰少

9月日更

【SpringCloud技术专题】「Eureka源码分析」从源码层面让你认识Eureka工作流程和运作机制(上)

洛神灬殇

源码分析 Eureka spring-cloud 9月日更

Golang 中的整洁架构

baiyutang

架构 DDD Go 语言 9月日更

缓存核心知识小抄,面试必备,赶紧收藏!

博文视点Broadview

深入理解rtmp(一)之开发环境搭建

轻口味

android 音视频 直播 9月日更

网络攻防学习笔记 Day131

穿过生命散发芬芳

网络安全 9月日更

统一区块链应用接口,加速新场景落地

CECBC

解决网卡“Device eth0 does not seem to be present, delaying initialization”

耳东@Erdong

9月日更 网卡

【Flutter 专题】51图解动画小插曲之 Flare 动画

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 9月日更

Jira API的踩坑记

FunTester

接口测试 API Jira FunTester 缺陷管理

重放浏览器单个请求性能测试实践

FunTester

性能测试 接口测试 测试框架 测试开发 FunTester

每个人都在谈数据治理,每个人都治理不好

奔向架构师

数据仓库 数据治理 9月日更

聊聊Java运算符的那些事

Bob

Java 9月日更

Python代码阅读(第26篇):将列表映射成字典

Felix

Python 编程 Code Programing 阅读代码

【LeetCode】找到需要补充粉笔的学生编号Java题解

Albert

算法 LeetCode 9月日更

Java从入门到升仙的书单推荐,附带读书笔记

Silently9527

Java书籍推荐 Java进阶书籍推荐 Mysql读书笔记

代码工具:VSCode

正向成长

vscode

全网最新最全面Java程序员面试清单(12专题5000解析)

Java 架构 面试 程序人生 程序

15. 弱人工智能、强人工智能、超人工智能

数据与智能

人工智能

Rust 从 0 到 1

rust

云南推进“区块链+数据中心”融合发展

CECBC

linux之type命令

入门小站

Linux

有个码龄 10 年的程序员跟我说:“他编程从来不用鼠标”,我说:

梦想橡皮擦

9月日更

Vue进阶(幺零五):elementUI 实现表格行列拖拽

No Silver Bullet

Vue 9月日更

观测未来,携手同行!驻云诚邀您参加2021 OSCAR 开源产业大会!文末报名福利!

观测云

开源 可观测

数字技术重构产业链供应链比较优势

CECBC

编程基础:硬件同步原语

正向成长

CAS 硬件同步原语 FAA

研究人员揭露SSL库及其在非浏览器服务方面的弱点_DevOps & 平台工程_Jeevak Kasarkod_InfoQ精选文章