MS16-065:TLS/SSL 协议信息泄漏漏洞 (CVE-2016-0149) 的说明:2016 年 5 月 10 日

概要
在 Microsoft .NET Framework 加密组件中实施传输层安全协议和安全套接字层协议 (TLS/SSL) 时存在信息泄漏漏洞。成功利用此漏洞的攻击者可以对加密的 TLS/SSL 通信进行解密。

要利用此漏洞,攻击者首先需要将非加密的数据插入安全通道,然后在目标客户端和合法服务器之间执行中间人 (MiTM) 攻击。此更新通过修改 .NET 加密组件发送和接收加密网络数据包的方式来修复此漏洞。

此漏洞作为 Microsoft 安全公告 MS16-065 中的一部分进行修复。此更新更改 .NET Framework 加密组件发送和接收加密网络数据包的方式。

下表包含指向“常见漏洞和披露”列表中每个漏洞标准条目的链接。

漏洞标题CVE 编号公开披露已被利用
TLS/SSL 欺骗漏洞CVE-2016-0149

漏洞解决方案

Microsoft 安全公告 MS16-065 中引入的更改会导致握手后的第一个 TLS 记录被拆分。这会导致 SslStream、WebRequest(HttpWebRequest、FtpWebRequest)、SmtpClient 和 HttpClient(基于 HttpWebRequest)流返回首次读取的单个字节,后面紧跟连续读取的其余 (n-1) 个字节。只有使用 TLS 1.0 + 加密块链接的应用程序才会发生此行为更改,但在其使用 TLS 1.1 或 TLS 1.2 时不会发生。

注意 作为先决条件,您必须安装Microsoft 安全公告 MS12-006 才能启用此更新。

这种更改可能导致基于 .NET Framework 的一些应用程序发生中断。本文介绍了两种方法,在你应用 Microsoft 安全公告 MS16-065 之后,可以使用这两种方法更新应用程序,使其正常运行。

兼容性问题缓解功能

选项 1:切换到 TLS 1.2 协议

此选项通过修改注册表或以编程方式配置协议版本,使应用程序使用 TLS 1.2 协议。
  • 修改注册表

    重要提示 请仔细按照本部分中的步骤操作。对注册表修改不当可能会导致严重问题。在修改注册表之前,请备份注册表以便 在出现问题时进行还原。

    运行在 .NET Framework 4.5 及更高版本上的 .NET Framework 4.0 和 .NET Framework 4.5.x 应用程序可以通过启用 SchUseStrongCrypto 注册表项,将默认协议切换到 TLS 1.2、TLS 1.1 和 TLS 1.0。Microsoft TechNet 网站上 Microsoft 安全通报 2960358 中的建议操作一节中讨论了此注册表项。

    重要提示 只有满足下列条件,此注册表更改才有效:
    • 使用基于 ServicePointManager 的 API 的应用程序明确设置 ServicePointManager.SecurityProtocol 值。这种类的示例包括 System.Net.Http.HttpClientSystem.Net.FtpWebRequestSystem.Net.HttpWebRequestSystem.Net.Mail.SmtpClient。在代码中设置 ServicePointManager.SecurityProtocol 优先于注册表。
    • 应用程序使用的是 SslStream AuthenticateAsClient(String) 重载。

  • 以编程方式配置协议版本

    必须重新编译在 .NET Framework 4.5 及更高版本上运行并且使用 SslStream AuthenticateAsClient(String, X509CertificateCollection, SslProtocols, Boolean) 重载的 .NET Framework 4.0 和 4.5 应用程序,同时指定 SslProtocols.Tls12SslProtocols.Tls11SslProtocols.Tls 作为第三个参数。有关对如何使用 SslStream 类的完整说明,请参阅 Microsoft Developer (MSDN) 网站上的 SslStream 类主题。

    注意 .NET Framework 4.6 及更高版本使用 TLS 1.2、TLS 1.1 和 TLS 1.0 作为协议默认设置。Microsoft TechNet 网站上的 Microsoft 安全通报 2960358 主题对此进行了讨论。

选择 2:处理拆分包

此更新导致将单个记录拆分为多个记录。因此,如果某个应用程序要在单个 Read 调用中获取完整记录,则该应用程序可能会中断。为了确保应用程序正常运行,请验证应用程序能否通过正确执行 Stream.Read 调用来处理拆分包。你可以将此处提供的示例代码作为参考,以了解如何修复应用程序,使其正确执行 Read 调用。

有关介绍在安装更新31474613147458 之前(带缓解功能)和之后(不带缓解功能)在行为方面的区别的示例 HTTP 请求,请参阅“详细信息”部分。

有关 Stream.Read 方法的完整示例,请参阅 Microsoft Developer (MSDN) 网站上的 Stream.Read 方法 (Byte[], Int32, Int32) 主题。

应用程序兼容性问题的变通办法

警告 这些变通办法可能会导致计算机或网络更易于受到恶意用户或恶意软件(如病毒)的攻击。我们不建议采用这些变通办法,此信息仅供参考,您应自行决定是否实施这些变通办法。使用这些变通办法需要你自担风险。

方法 1:更新注册表项(适用于所有版本的 .NET Framework)



禁用 SCH_SEND_AUX_RECORD 结构(全局)
对于所有应用程序,请添加以下注册表子项:
注册表位置:
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>

DWORD 名称: SchSendAuxRecord
数值数据: 0

注意 <version_number> 占位符为 v4.0.30319 或 v2.0.50727,具体取决于版本。

对于在 64 位计算机上运行的 32 位应用程序,还应添加以下注册表子项:
注册表位置:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>

DWORD 名称: SchSendAuxRecord
数值数据: 0

注意 <version_number> 占位符为 v4.0.30319 或 v2.0.50727,具体取决于版本。

变通办法
若要临时禁用本文中所述的安全模式,请单击相应链接下载 .reg 文件,然后双击下载的 .reg 文件,对注册表进行更改。

对于面向 Microsoft .NET Framework 3.5 的应用程序:

对于面向 Microsoft .NET Framework 4.0 及更高版本的应用程序:

若要重新启用本文中所述的安全模式,请单击相应链接下载 .reg 文件,然后双击下载的 .reg 文件,对注册表进行更改。

对于面向 Microsoft .NET Framework 3.5 的应用程序:

对于面向 Microsoft .NET Framework 4.0 及更高版本的应用程序:

有关如何下载 Microsoft 支持文件的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
119591 如何从联机服务获得 Microsoft 支持文件
Microsoft 已对该文件进行了病毒扫描。Microsoft 使用的是该文件发布时提供的最新病毒检测软件。该文件存储在安全性得到增强的服务器上,以防止在未经授权的情况下对其进行更改。


对个别应用程序禁用 SCH_SEND_AUX_RECORD 结构
对于所有应用程序,请添加以下注册表子项:
注册表位置:
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord

DWORD 名称: 应用程序 .exe 的完全限定的路径(例如,C:\MyApp\MyApp.exe)
数值数据: 0

注意 <version_number> 占位符为 v4.0.30319 或 v2.0.50727,具体取决于版本。

对于在 64 位计算机上运行的 32 位应用程序,还应添加以下注册表子项:
注册表位置:
HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\.NETFramework\<version_number>\System.Net.ServicePointManager.SchSendAuxRecord

DWORD 名称: 应用程序 .exe 的完全限定的路径(例如,C:\MyApp\MyApp.exe)
数值数据: 0(唯一的有效值为 0)。其他任何值都将被忽略。)

注意 <version_number> 占位符为 v4.0.30319 或 v2.0.50727,具体取决于版本。

方法 2:在应用程序级别更改配置(仅适用于 NET Framework 4.6 版本及更高版本)

从 .NET Framework 4.6 开始,可以通过代码或应用程序配置或注册表更改在应用程序级别更改配置。

在 .NET Framework 4.6 中,可以使用以下任何一种方法来设置此开关。这些示例可禁用安全功能。
  • 通过编程方式

    应用程序应首先运行以下代码。这是因为服务点管理器只会初始化一次。
    private const string DisableCachingName = @"TestSwitch.LocalAppContext.DisableCaching"; private const string DontEnableSchSendAuxRecordName = @"Switch.System.Net.DontEnableSchSendAuxRecord"; AppContext.SetSwitch(DisableCachingName, true); AppContext.SetSwitch(DontEnableSchSendAuxRecordName , true);
  • 应用程序配置

    若要更改应用程序配置,请添加以下条目:
    <runtime><AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchSendAuxRecord=true"/></runtime>
  • 注册表项(全局计算机)

    注册表位置:
    HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\AppContext
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\AppContext

    值: Switch.System.Net.DontEnableSchSendAuxRecord
    类型:字符串
    值: True

    注意 对于所有应用程序,Switch.System.Net.DontEnableSchSendAuxRecord = False。
更多信息
以下是在安装此更新前后的示例客户端/服务器通信模式。提供此信息用于对确定由于安装此修复程序导致的任何应用程序中断情况进行说明。

不带缓解功能带缓解功能
[服务器] 正在等待连接 (127.0.0.1:4431)
[客户端] 正在连接到 localhost:4431
[服务器] 客户端已连接。
[客户端] 已连接。正在进行身份验证...
[服务器] 客户端已通过身份验证。
[客户端] 正在发送请求(94 字节)
[客户端] 正在等待响应…

[服务器] 已收到 94 字节:<<<GET / HTTP/1.0
主机:contoso.com
用户代理:测试应用程序

>>>
[服务器] 已响应 476 字节。

[客户端 1:476 字节] 响应:<<<<<HTTP/1.1 200 完成

>>>>>
[服务器] 正在等待连接 (127.0.0.1:4431)
[客户端] 正在连接到 localhost:4431
[服务器] 客户端已连接。
[客户端] 已连接。正在进行身份验证...
[服务器] 客户端已通过身份验证。
[客户端] 正在发送请求(94 字节)
[客户端] 正在等待响应...
[服务器] 已收到 1 字节:<<<G>>>
[服务器] 已收到 93 字节:<<<ET / HTTP/1.0
主机:contoso.com
用户代理:测试应用程序

>>>
[服务器] 已响应 476 字节。
[客户端 1:1 字节] 响应:<<<<<H>>>>>
[客户端 2:475 字节] 响应:<<<<<TTP/1.1 200 完成

>>>>>

属性

文章 ID:3155464 - 上次审阅时间:05/13/2016 17:44:00 - 修订版本: 2.0

Microsoft .NET Framework 4.6.1, Microsoft .NET Framework 4.6, Microsoft .NET Framework 4.5.2, Microsoft .NET Framework 3.5.1, Microsoft .NET Framework 3.5, Microsoft .NET Framework 2.0 Service Pack 2

  • kbsecvulnerability kbsecurity kbsecbulletin kbfix kbexpertiseinter kbbug atdownload KB3155464
反馈