MS09-056:解决X.509 CryptoAPI ASN.1安全漏洞
MS09-056解决了两个影响Windows CryptoAPI解析X.509数字证书方式的漏洞。Windows平台上的应用程序以及Windows组件(如WinHTTP API)可以调用CryptoAPI,该API提供加密服务以验证数字证书。例如,Internet Explorer使用CryptoAPI解析和验证远程Web服务器的证书。
数字证书可以证明SSL连接中的一方是其声称的身份。它们由受信任的独立第三方(称为证书颁发机构)签名。最常用于保护与网站的通信,它们也常用于保护电子邮件通信或B2B连接。X.509标准描述了证书中可以包含的信息,并使用ASN.1(抽象语法记法1)来描述数据的格式。对象标识符或OID是用于标识证书特定元素(如算法或属性类型)的ASN.1类型。例如,“2.5.4.3”是标识证书中“通用名称”或“CN”字符串字段的OID。
此安全更新解决了ASN.1解析中的空截断漏洞和整数溢出条件。这两个漏洞均由Dan Kaminsky在今年7月底在拉斯维加斯的BlackHat安全会议上发现并展示。
- CVE-2009-2510:证书主题名称中的字段(如“通用名称”或“CN”字段)如果包含字符串中的NULL字符,将导致CryptoAPI仅解析NULL字符之前的字符串部分。然而,证书可能已颁发给字符串中NULL字符之后的组织/域。
- CVE-2009-2511:在证书中,每个对象标识符(OID)存储为整数序列,但在解析证书时由CryptoAPI转换为字符串。ASN.1标准未指定整数的最大值,但CryptoAPI假设OID的整数组件可以安全地解析为内存中的32位整数。特制的OID号可能导致整数溢出条件,从而使其以允许OID号的数据替换先前遇到的OID的数据的方式解析。这可能导致证书颁发机构和Windows以不同方式解析证书。此漏洞可在证书颁发机构忽略特制OID并同意签名证书,而Windows CryptoAPI解析特制OID的情况下被利用。
这两个漏洞都具有欺骗的影响,这意味着攻击者可以使用它们欺诈性地欺骗互联网上另一个合法服务器的身份。
这听起来相当严重,确实如此。然而,重要的是要考虑到设置此类攻击所需的努力是广泛的。为了在Web浏览场景中利用此问题,攻击者必须成功完成以下步骤:
- 说服证书颁发机构签名恶意证书。这必须是存在于Windows计算机的根证书存储中的证书颁发机构;
- 执行成功的中间人攻击,劫持从易受攻击的客户端到服务器的连接,并向客户端呈现证书,例如通过DNS欺骗攻击或通过本地子网上的ARP缓存中毒。
利用这些缺陷的攻击并非微不足道,但不能排除。我们确实相信,这些对攻击者提出的要求显著减轻了这些攻击的威胁。然而,TLS握手协议(RFC 2246)做出了两个安全承诺,这些漏洞违反了这些承诺:
- 可以对等方的身份进行身份验证;
- 没有攻击者可以在不被通信方检测的情况下修改通信。
由于此漏洞显示了打破此安全承诺的潜力,我们认为解决这些问题很重要,并发布此安全更新。我们建议客户尽早安装它们。
对CryptoAPI的更新影响了在Windows平台上运行的大量应用程序,这些更新在发布前需要非常彻底和严格的测试。对于此特定更新,我们的工程师特别寻找可能受此API独特更改影响的应用程序,并执行了非常详细和特定的互操作性测试。安全更新的质量对Microsoft至关重要,对于CryptoAPI,这通常导致相当长的测试周期。
在这些安全更新的开发过程中,Microsoft持续评估威胁环境,以评估这些漏洞对我们的客户构成的风险。包含在Windows根证书存储中的证书颁发机构都必须满足Microsoft根证书计划的要求。受Microsoft信任且其根证书通过根证书计划分发的第三方证书颁发机构(CA)列表可在KB文章931125中找到。在这些更新的开发过程中,MSRC与证书颁发机构合作,确保他们的系统也得到了强化,以帮助防止签名可能试图利用这些漏洞的证书。
感谢MSRC工程团队的Gavin Thomas和Robert Hensing以及Windows Crypto的Kelvin Yiu对这两个问题的技术调查。
- Maarten Van Horenbeeck,MSRC项目经理