Microsoft 安全咨询4021279

.NET Core 中的漏洞,ASP.NET Core 可能允许提升权限

发布时间: 2017 年 5 月 9 日 |更新时间:2017 年 5 月 10 日

版本: 1.1

执行摘要

Microsoft 正在发布此安全公告,提供有关公共 .NET Core 和 ASP.NET Core 中的漏洞的信息。 此建议还指导开发者如何正确地更新应用程序。

.NET Core 和 ASP.NET Core 是下一代 .NET,为 Web 和云方案提供熟悉的新式框架。 这些产品由 .NET 积极开发,ASP.NET 团队与在 Windows、Mac OS X 和 Linux 上运行的开放源代码开发人员社区协作。 发布 .NET Core 后,版本号将重置为 1.0.0,以反映它是与其前置 -.NET 不同的产品。

问题 CVE 和说明

CVE 描述
CVE-2017-0247 拒绝服务
CVE-2017-0248 安全功能绕过
CVE-2017-0249 权限提升
CVE-2017-0256 欺骗

受影响的软件

如果漏洞使用以下受影响的包版本,则这些漏洞会影响任何 Microsoft .NET Core 项目。

受影响的包和版本
包名称 包版本 修复了包版本
System.Text.Encodings.Web 4.0.0 4.3.0 4.0.1 4.3.1
System.Net.Http 4.1.1 4.3.1 4.1.2 4.3.2
System.Net.Http.WinHttpHandler 4.0.1 4.3.0 4.0.2 4.3.1
System.Net.Security 4.0.0 4.3.0 4.0.1 4.3.1
System.Net.WebSockets.Client 4.0.0 4.3.0 4.0.1 4.3.1
Microsoft.AspNetCore.Mvc 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Core 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Abstractions 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.ApiExplorer 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Cors 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.DataAnnotations 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Formatters.Json 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Formatters.Xml 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Localization 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Razor.Host 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.Razor 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.TagHelpers 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.ViewFeatures 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3
Microsoft.AspNetCore.Mvc.WebApiCompatShim 1.0.0, 1.0.1, 1.0.2, 1.0.3 1.1.0, 1.1.1, 1.1.2 1.0.4 1.1.3

咨询常见问题解答

如何实现知道我是否受到影响?
.NET Core 和 ASP.NET Core 具有两种类型的依赖项:直接和可传递。 如果项目对前面列出的任何包和版本具有直接或可传递的依赖项,则你受到影响。

注意

作为修补 ASP.NET Core MVC 的一部分,我们将更新每个 Microsoft.AspNetCore.Mvc.* 包。 例如,如果依赖于 Microsoft.AspNetCore.Mvc,则应先更新到相应的版本(1.0.x 应更新到 1.0.4、1.1.x 应更新为 1.1.3),它还会更新任何其他易受攻击的 Microsoft.AspNetCore.Mvc 依赖项。

.NET Core 项目格式

.NET Core 具有两种不同的项目文件格式,具体取决于创建项目的软件。

  1. project.json是 .NET Core 1.0 和 Microsoft Visual Studio 2015 中包含的原始格式。
  2. csproj 是 Microsoft Visual Studio 2017 中使用的格式。

必须确保按照项目类型的正确更新说明进行操作。

直接依赖项

直接依赖项是专门向项目添加包的依赖项 。 例如,如果将 Microsoft.AspNetCore.Mvc 包添加到项目中,则你已直接依赖 Microsoft.AspNetCore.Mvc。

可以通过查看project.json或 csproj 文件来发现直接依赖项。

可传递依赖项

将包添加到又依赖于另一个包的项目时,会发生可传递依赖项 。 例如,如果将 Microsoft.AspNetCore.Mvc 包添加到项目,则它依赖于 Microsoft.AspNetCore.Mvc.Core 包(等等)。 你的项目直接依赖于 Microsoft.AspNetCore.Mvc,以及 Microsoft.AspNetCore.Mvc.Core 包的可传递依赖项。

可传递依赖项在 Visual Studio 解决方案资源管理器 窗口中查看,该窗口支持搜索,或通过查看项目根目录中包含project.json项目的project.lock.json文件或 csproj 项目的 obj 目录中所包含的project.assets.json文件。 这些文件是项目使用的所有包的权威列表,其中包含直接依赖项和可传递依赖项。

如何实现修复受影响的应用程序?

需要同时修复直接依赖项并查看和修复任何可传递依赖项。 上一“受影响的软件”部分中受影响的包和版本包括每个易受攻击的包、易受攻击的版本和修补的版本。

如果在项目中使用 ASP.NET Core MVC,应首先根据以前的受影响的版本表更新 Microsoft.AspNetCore.Mvc 版本。 如果当前使用的是版本 1.0.0、1.0.1、1.0.2 或 1.0.3,则应将包版本更新为 1.0.4。 如果使用版本 1.1.0、1.1.1 或 1.1.2,则应将包版本更新为 1.1.3。 这将将每个 MVC 包更新为固定版本。

修复直接依赖项 - project.json/VS2015

在编辑器中打开project.json文件。 查找依赖项部分。 下面是一个示例依赖项部分:

    "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.0.1",
          "type": "platform"
        },
        "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
        "Microsoft.AspNetCore.Mvc ": "1.0.1",
         
      }

此示例有三个直接依赖项:Microsoft.NETCore.App、Microsoft.AspNetCore.Server.Kestrel 和 Microsoft.AspNetCore.Mvc。

Microsoft.NetCore.App 是应用程序面向的平台,应忽略此目标。 其他包将其版本公开到包名称的右侧。 在我们的示例中,非平台包是版本 1.0.1。

查看前面列出的包和版本的任何实例的直接依赖项。 在前面的示例中,有一个易受攻击的包(Microsoft.AspNetCore.Mvc 版本 1.0.1)有直接依赖项。

若要更新到固定包,请将版本号更改为适合发布的包。 在此示例中,这会将 Microsoft.AspNetCore.Mvc 更新为 1.0.4。

更新易受攻击的包版本后,保存project.json文件。

示例中的依赖项部分project.json现在如下所示:

      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.0.1",
          "type": "platform"
        },
        "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
        "Microsoft.AspNetCore.Mvc": "1.0.4",
          
      }

如果使用 Visual Studio 并保存更新的project.json文件,Visual Studio 将还原新的包版本。 可以通过打开“输出窗口”(Ctrl+Alt+O)并将“显示输出”从下拉列表更改为程序包管理器来查看还原结果。

如果未使用 Visual Studio,请打开命令行并更改为项目目录。 执行 dotnet restore 命令以还原新的依赖项。

解决所有直接依赖项后,还必须查看可传递依赖项。

修复直接依赖项 - csproj/VS2017

在编辑器中打开 projectname.csproj 文件,或右键单击 Visual Studio 2017 中的项目,然后从内容菜单中选择“编辑 projectname.csproj”,其中 projectname 是项目的名称。 查找 PackageReference 节点。 下面显示了一个示例项目文件:


    <project sdk="Microsoft.NET.Sdk.Web">
<propertygroup>
<targetframework>netcoreapp1.1</targetframework>
</propertygroup>
<propertygroup>
<packagetargetfallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</packagetargetfallback>
</propertygroup>
<itemgroup>
<packagereference include="Microsoft.AspNetCore" version="1.1.1">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc" version="1.1.2">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0 ">
</dotnetclitoolreference></itemgroup>
</project>

该示例具有两个直接包依赖项,如两个 PackageReference 元素所示。 包的名称位于 Include 属性中,包版本号位于包名称右侧公开的版本属性中。 此示例显示了 Microsoft.AspNetCore 版本 1.1.1 和 Microsoft.AspNetCore.Mvc.Core 版本 1.1.2 的两个包。

查看之前列出的包和版本的任何实例的 PackageReference 元素。 在前面的示例中,有一个易受攻击的包(Microsoft.AspNetCore.Mvc 版本 1.1.2)有直接依赖项。

若要更新到固定包,请将版本号更改为适用于发布的相应包。 在此示例中,这会将 Microsoft.AspNetCore.Mvc 更新为 1.1.3。

更新易受攻击的包版本后,保存 csproj 文件。

示例 csproj 现在如下所示:


    <project sdk="Microsoft.NET.Sdk.Web">
<propertygroup>
<targetframework>netcoreapp1.1</targetframework>
</propertygroup>
<propertygroup>
<packagetargetfallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</packagetargetfallback>
</propertygroup>
<itemgroup>
<packagereference include="Microsoft.AspNetCore" version="1.1.1">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc.Core" version="1.1.3">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0 ">
</dotnetclitoolreference></itemgroup>
</project>

如果使用 Visual Studio 并保存更新的 csproj 文件,Visual Studio 将还原新的包版本。 可以通过打开“输出窗口”(Ctrl+Alt+O)并将“显示输出”从下拉列表更改为程序包管理器来查看还原结果。

如果不使用 Visual Studio 打开命令行并更改为项目目录。 执行 dotnet restore 命令以还原新的依赖项。

重新编译应用程序。

如果在重新编译后看到依赖项冲突警告,则必须将其他直接依赖项更新到相应的版本。 例如,如果项目引用版本号为 1.0.1 的 Microsoft.AspNetCore.Routing,则将 Microsoft.AspNetCore.Mvc 包更新为 1.0.4,编译将引发:

NU1012 依赖关系冲突。 Microsoft.AspNetCore.Mvc.Core 1.0.4 预期 Microsoft.AspNetCore.Routing >= 1.0.4,但收到 1.0.1

若要解决此问题,请编辑预期包的版本,方法是更新 csproj 或project.json,其方式与更新易受攻击包版本的方式相同。

解决所有直接依赖项后,还必须查看可传递依赖项。

查看可传递依赖项

有两种方法可以查看可传递依赖项。 可以使用 Visual Studio 的解决方案资源管理器,也可以查看project.lock.json(project.json/VS2015)或project.assets.json(csproj/VS2017)文件。

使用 Visual Studio 解决方案资源管理器 (VS2015)

如果要使用 Visual Studio 2015,请在 Visual Studio 2015 中打开项目,然后按 Ctrl+;以激活解决方案资源管理器中的搜索。 搜索每个易受攻击的包名称,并记下找到的任何结果的版本号。

例如,在包含对 Microsoft.AspNetCore.Mvc 的引用的示例项目中搜索 Microsoft.AspNetCore.Mvc.Core,Visual Studio 2015 中显示了以下结果。

图 1:在 Visual Studio 2015 中搜索引用

搜索结果显示为树。 在这些结果中,可以看到我们找到了对 Microsoft.AspNetCore.Mvc 版本 1.0.1(易受攻击的版本)的引用。

引用标题下的第一个条目是指应用程序正在使用的目标框架。 这是 。NETCoreApp, .NETStandard 或 .NET-Framework-vX.Y.Z(其中 X.Y.Z 是实际版本号),具体取决于应用程序配置方式。 目标框架下是你直接依赖的包列表。 在此示例中,应用程序依赖于 Microsoft.AspNetCore.Mvc。 Microsoft.AspNetCore.Mvc 又具有叶节点,列出其依赖项及其版本。 在这种情况下,Microsoft.AspNetCore.Mvc 包依赖于易受攻击版本的 Microsoft.AspNetCore.Mvc.Core 和其他许多包。

手动查看project.lock.json(project.json/VS2015)

在编辑器中打开project.lock.json文件。 建议使用了解 json 的编辑器,并允许折叠和展开节点以查看此文件;Visual Studio 和 Visual Studio Code 都提供此功能。

如果使用 Visual Studio,则project.lock.json文件位于project.json文件中的“下”。 单击project.json文件左侧的指向三角形 ▷,展开解决方案树以公开project.lock.json文件。 下图 1 显示了展开project.json文件以显示project.lock.json文件的项目。

图 2:project.lock.json文件位置

在project.lock.json文件中搜索字符串“Microsoft.AspNetCore.Mvc.Core/1.1.0”。 如果project.lock.json文件包含此字符串,则依赖于易受攻击的包。

修复可传递依赖项(project.json/VS2015)

如果找不到对任何易受攻击包的任何引用,这意味着任何直接依赖项都依赖于任何易受攻击的包,或者你已通过更新直接依赖项来修复此问题。

如果你的可传递依赖项评审发现对任何易受攻击的包的引用,则必须将直接依赖项添加到project.json文件中,以替代可传递依赖项。 打开project.json并找到依赖项部分。 例如:


      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.0.1",
          "type": "platform"
        },
        "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
        "Microsoft.AspNetCore.Mvc": "1.1.0"
      }

对于返回的每个易受攻击包,必须通过将其添加到project.json文件,将直接依赖项添加到更新的版本。 为此,请向依赖项部分添加新行,引用固定版本。 例如,如果搜索显示对易受攻击的 System.Net.Security 版本 4.0.0 的可传递引用,则添加对相应固定版本 4.0.1 的引用。 编辑project.json文件,如下所示:


      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.0.1",
          "type": "platform"
        },
        "System.Net.Security": "4.0.1",
        "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
        "Microsoft.AspNetCore.Mvc": "1.1.1"
      }

将直接依赖项添加到固定包后,保存project.json文件。

如果使用 Visual Studio 保存更新project.json文件,Visual Studio 将还原新的包版本。 可以通过打开“输出窗口”(Ctrl+Alt+O)并将“显示输出”从下拉列表更改为程序包管理器来查看还原结果。

如果不使用 Visual Studio 打开命令行并更改为项目目录。 执行 dotnet restore 命令以还原新依赖项。

使用 Visual Studio 解决方案资源管理器 (VS2017)

如果要使用解决方案资源管理器,请在 Visual Studio 2017 中打开项目,然后按 Ctrl+;激活解决方案资源管理器中的搜索。 搜索每个易受攻击的包名称,并记下找到的任何结果的版本号。

例如,在示例项目中搜索 Microsoft.AspNetCore.Mvc.Core,其中包含依赖 Microsoft.AspNetCore.Mvc 的包,其中显示了 Visual Studio 2017 中的以下结果。

图 3:在 Visual Studio 2017 中搜索引用

搜索结果显示为树。 在这些结果中,可以看到我们找到了对 Microsoft.AspNetCore.Mvc.Core 版本 1.1.2 的引用。

在“依赖项”节点下将是一个 NuGet 节点。 NuGet 节点下是你直接依赖的包列表及其版本。 在此示例中,应用程序直接依赖于 Microsoft.AspNetCore.Mvc。 Microsoft.AspNetCore.Mvc 又具有叶节点,列出其依赖项及其版本。 在示例中,Microsoft.AspNetCore.Mvc 包依赖于 Microsoft.AspNetCore.Mvc.ApiExplorer 版本,后者又依赖于易受攻击的 Microsoft.AspNetCore.Mvc.Core 版本。

手动评审project.assets.json (VS2017)

在编辑器中从项目的 obj 目录中打开project.assets.json文件。 建议使用了解 json 的编辑器,并允许折叠和展开节点以查看此文件;Visual Studio 和 Visual Studio Code 都提供此功能。

在project.assets.json文件中搜索易受攻击包表中的每个包名称,后跟 /。 例如,查找 Microsoft.AspNetCore.Mvc 需要使用搜索字符串“Microsoft.AspNetCore.Mvc/”。 如果project.assets.json文件包含此字符串,并且完整版本号(在任意搜索命中之后的编号)与前面列出的一个易受攻击的版本匹配,则依赖于易受攻击的包。

修复可传递依赖项(csproj/VS2017)

如果找不到对任何易受攻击包的任何引用,这意味着任何直接依赖项都依赖于任何易受攻击的包,或者你已通过更新直接依赖项来修复此问题。

如果你的可传递依赖项评审找到了对任何易受攻击包的引用,则必须将直接依赖项添加到 csproj 文件中,以替代可传递依赖项。 在编辑器中打开 projectname.csproj 文件,或右键单击 Visual Studio 2017 中的项目,然后从内容菜单中选择“编辑 projectname.csproj”,其中 projectname 是项目的名称。 查找 PackageReference 节点,例如:


    <project sdk="Microsoft.NET.Sdk.Web">
<propertygroup>
<targetframework>netcoreapp1.1</targetframework>
</propertygroup>
<propertygroup>
<packagetargetfallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</packagetargetfallback>
</propertygroup>
<itemgroup>
<packagereference include="Microsoft.AspNetCore" version="1.1.1">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc" version="1.1.3">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0">
</dotnetclitoolreference></itemgroup>
</project>

对于每个易受攻击的包,搜索返回的每个包都必须通过将其添加到 csproj 文件,将直接依赖项添加到更新的版本。 为此,请向依赖项部分添加新行,引用固定版本。 例如,如果搜索显示对易受攻击的 System.Net.Security 版本 4.3.0 的可传递引用,则添加对相应固定版本 4.3.1 的引用。


    <project sdk="Microsoft.NET.Sdk.Web">
<propertygroup>
<targetframework>netcoreapp1.1</targetframework>
</propertygroup>
<propertygroup>
<packagetargetfallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</packagetargetfallback>
</propertygroup>
<itemgroup>
<packagereference include="System.Net.Security" version="4.3.1">
</packagereference><packagereference include="Microsoft.AspNetCore" version="1.1.1">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc" version="1.1.3">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0">
</dotnetclitoolreference></itemgroup>

添加直接依赖项引用后,保存 csproj 文件。

如果使用 Visual Studio,请保存更新的 csproj 文件,Visual Studio 将还原新的包版本。 可以通过打开“输出窗口”(Ctrl+Alt+O)并将“显示输出”从下拉列表更改为程序包管理器来查看还原结果。

如果未使用 Visual Studio,请打开命令行并更改为项目目录。 执行 dotnet restore 命令以还原新依赖项。

重新生成应用程序

最后重新生成应用程序,像平时一样进行测试,并使用你喜欢的部署机制重新部署。

其他信息

报告安全问题

  • 如果在 .NET Core 中发现了潜在的安全问题,请发送电子邮件至此详细信息。 报告可能有资格获得 .NET Core Bug 赏金。 .NET Core Bug 赏金的详细信息,包括条款和条件位于 https:

Microsoft Active Protections 计划 (MAPP)

为了改善客户的安全保护,Microsoft 在每月安全更新发布之前向主要安全软件提供商提供漏洞信息。 然后,安全软件提供商可以使用此漏洞信息通过其安全软件或设备(如防病毒、基于网络的入侵检测系统或基于主机的入侵防护系统)为客户提供更新的保护。 若要确定安全软件提供商是否提供主动保护,请访问计划合作伙伴提供的活动保护网站,这些网站在 Microsoft Active Protections 计划 (MAPP) 合作伙伴列出。

反馈

支持

  • 可以在 .NET Core 或 ASP.NET Core 组织中在 GitHub 上提问此问题。 这些位置位于 </https:>https: 和 </https:>https:。 每个产品的公告存储库(https://github.com/dotnet/Announcementshttps://github.com/aspnet/Announcements)将包含此公告作为问题,并将包含指向讨论问题的链接,你可以在其中提出问题。
  • 美国和加拿大的客户可以从安全支持部门获得技术支持。 有关详细信息,请参阅 Microsoft 帮助和支持。
  • 国际客户可以从其本地 Microsoft 子公司获得支持。 有关详细信息,请参阅国际性支持。 * Microsoft TechNet Security 提供有关 Microsoft 产品中安全性的其他信息。

致谢

Microsoft 感谢 以下部门与我们合作,帮助保护客户:

  • 用于报告 ASP.NET 核心拒绝服务漏洞的 Sidertia 解决方案David Fernandez (CVE-2017-0247)
  • Mikhail Shcherbakov 报告 ASP.NET 核心欺骗漏洞(CVE-2017-0256)

免责声明

此公告中提供的信息“按原样”提供,没有任何担保。 Microsoft 不明确或暗示所有保证,包括适销性和针对特定用途的适用性和适用性的保证。 在任何情况下,Microsoft Corporation 或其供应商都应对任何损害负责,包括直接、间接、附带、后果性、业务利润损失或特殊损害,即使 Microsoft Corporation 或其供应商被告知存在此类损害的可能性。 某些州不允许排除或限制后果性或附带性损害的责任,因此上述限制可能不适用。

修订

  • V1.0(2017 年 5 月 9 日):已发布公告。
  • V1.1(2017 年 5 月 10 日):经过修订,包括问题 CVE 及其说明表的公告。 这只是一项信息性更改。

页面生成的 2017-05-10 13:08-07:00。 </https:>