Microsoft 安全咨询4010983

ASP.NET Core MVC 1.1.0 中的漏洞可能允许拒绝服务

发布时间: 2017 年 1 月 27 日

版本: 1.0

执行摘要

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

Microsoft 知道 ASP.NET Core MVC 1.1.0 的公共版本中存在安全漏洞,其中格式不正确的 HTTP 请求可能导致拒绝服务。

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

建议开发人员更新所有应用以使用程序包版本 1.1.1 或更高版本。

缓解因素

只有面向 ASP.NET Core 1.1.0 的应用程序受到影响。 面向 ASP.NET Core 1.0.0、1.0.1 或 1.02 的应用程序不会受到影响。

受影响的软件

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

受影响的包和版本
包名称 包版本
Microsoft.AspNetCore.Mvc.Core 1.1.0

咨询常见问题解答

如何实现知道我是否受到影响?  ASP.NET Core 具有两种不同类型的依赖项:直接和可传递。 如果项目对 Microsoft.AspNetCore.Mvc.Core 版本 1.1.0 具有直接或可传递依赖项,则你受到影响。

.NET Core 项目格式

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

  1. project.json是 .NET Core 1.0 和 Visual Studio 2015 中包含的原始格式。
  2. csproj 是 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 1.1 应用程序都将依赖于受影响的包,无论是直接包还是可传递包

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

需要同时修复直接依赖项并查看和修复任何可传递依赖项。 易受攻击包的版本 1.1.1 包含保护应用所需的修补程序。

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


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

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

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

查看 Microsoft.AspNetCore.Mvc.Core 版本 1.1.0 的任何实例的直接依赖项,在上面的示例中,直接依赖于易受攻击的包。

若要更新到新包,请将版本号更改为 1.1.1。 更新易受攻击的包版本后,保存project.json文件。

注意

作为修补 ASP.NET Core MVC 的一部分,我们将更新每个 Microsoft.AspNetCore.Mvc.* 包。 例如,如果依赖于 Microsoft.AspNetCore.Mvc,则应将其版本更新为 1.1.1,并且还会更新易受攻击的 Microsoft.AspNetCore.Mvc.Core 包。

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


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

如果使用 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 toolsversion="15.0" 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.0">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc.Core" version="1.1.0">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0-msbuild3-final">
</dotnetclitoolreference></itemgroup>
</project> 

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

查看 Microsoft.AspNetCore.Mvc.Core 版本 1.1.0 的任何实例的 PackageReference 元素。

如果引用存在对新包的更新,请将 Version 属性值更改为 1.1.1。 更新易受攻击的包版本后,保存 csproj 文件。

注意

作为修补 ASP.NET Core MVC 的一部分,我们将更新每个 Microsoft.AspNetCore.Mvc.* 包。 例如,如果依赖于 Microsoft.AspNetCore.Mvc,则应将其版本更新为 1.1.1,并且还会更新易受攻击的 Microsoft.AspNetCore.Mvc.Core 包。

示例 csproj 现在如下所示:


    <project toolsversion="15.0" 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.0">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc.Core" version="1.1.1">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0-msbuild3-final">
</dotnetclitoolreference></itemgroup>
</project> 

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

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

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

查看可传递依赖项

有两种方法可以查看可传递依赖项。 可以使用 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.Core 并记下找到的任何结果的版本号。

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

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

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

引用标题下的第一个条目是指应用程序正在使用的目标框架。 这是 。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)

如果尚未找到对 Microsoft.AspNetCore.Mvc.Core/1.1.0 的任何引用,这意味着任何直接依赖项都取决于 Microsoft.AspNetCore.Mvc.Core 的易受攻击版本,或者已通过更新直接依赖项来修复问题。

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


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

传递包搜索的结果显示,Microsoft.AspNet.Mvc 依赖于 Microsoft.AspNet.Mvc.Core 版本 1.1.0。 若要解决此问题,必须通过将其添加到project.json文件来添加直接依赖项。 为此,请向依赖项部分添加新行,引用固定版本。 例如,若要拉取固定版本的 Microsoft.AspNet.Mvc.Core 版本 1.1.1,请编辑project.json文件,如下所示:


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

将直接依赖项添加到固定包后,保存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 的包的示例项目中搜索 Microsoft.AspNetCore.Mvc.Core,在 Visual Studio 2017 中显示了以下结果:

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

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

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

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

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

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

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

如果尚未找到对 Microsoft.AspNetCore.Mvc.Core/1.1.0 的任何引用,这意味着任何直接依赖项都取决于 Microsoft.AspNetCore.Mvc.Core 的易受攻击版本,或者已通过更新直接依赖项来修复问题。

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


    <project toolsversion="15.0" 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.0">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc" version="1.1.0">
</packagereference><packagereference include="Microsoft.AspNetCore.StaticFiles" version="1.1.0">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0-msbuild3-final">
</dotnetclitoolreference></itemgroup>
</project>

在上面的示例 csproj 文件中,有 3 个 PackageReference 节点。 传递包搜索的结果显示,应用程序依赖于易受攻击的 Microsoft.AspNet.Mvc.Core 版本 1.1.0。 若要解决此问题,必须通过将其添加到 csproj 文件来添加新的直接依赖项。 为此,请在 PackageReference 列表顶部添加新的 PackageReference,引用固定版本。 例如,若要在示例 csproj 文件中拉取固定版本的 Microsoft.AspNet.Mvc.Core 版本 1.1.1,将按如下所示进行更改:


    <project toolsversion="15.0" 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.Mvc.Core" version="1.1.1">
</packagereference><packagereference include="Microsoft.AspNetCore" version="1.1.0">
</packagereference><packagereference include="Microsoft.AspNetCore.Mvc" version="1.1.0">
</packagereference><packagereference include="Microsoft.AspNetCore.StaticFiles" version="1.1.0">
</packagereference></itemgroup>
<itemgroup>
<dotnetclitoolreference include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" version="1.0.0-msbuild3-final">
</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) 合作伙伴列出。

反馈

支持

免责声明

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

修订

  • V1.0(2017 年 1 月 27 日):已发布公告。

页面生成的 2017-01-27 7:57Z-08:00。 </https:>