Comunicado de Segurança da Microsoft 4010983

Vulnerabilidade no ASP.NET Core MVC 1.1.0 pode permitir negação de serviço

Publicado em: 27 de janeiro de 2017

Versão: 1.0

Resumo executivo

A Microsoft está lançando este comunicado de segurança para fornecer informações sobre uma vulnerabilidade nas versões públicas do ASP.NET Core MVC 1.1.0. Esse comunicado também fornece orientação sobre o que os desenvolvedores podem fazer para atualizar seus aplicativos corretamente.

A Microsoft está ciente de uma vulnerabilidade de segurança na versão pública do ASP.NET Core MVC 1.1.0 em que uma solicitação HTTP malformada pode levar a uma negação de serviço.

ASP.NET Core é a próxima geração de ASP.NET que fornece uma estrutura familiar e moderna para cenários da Web e da nuvem, sendo executados sobre o .NET Core. Esses produtos são ativamente desenvolvidos pela equipe do ASP.NET em colaboração com uma comunidade de desenvolvedores de código aberto, rodando em Windows, Mac OS X e Linux. Quando ASP.NET Core foi lançado, o número da versão foi redefinido para 1.0.0 para refletir o fato de que é um produto separado de seu antecessor - ASP.NET.

Os desenvolvedores são aconselhados a atualizar todos os aplicativos para usar a versão do pacote 1.1.1 ou superior.

Fatores atenuantes

Somente os aplicativos destinados ao ASP.NET Core 1.1.0 são afetados. Os aplicativos destinados ao ASP.NET Core 1.0.0, 1.0.1 ou 1.02 não são afetados.

Softwares afetados

A vulnerabilidade afeta qualquer projeto do Microsoft ASP.NET Core se ele usar a seguinte versão do pacote afetado.

Pacote e versão afetados
Nome do pacote Versão do pacote
Microsoft.AspNetCore.Mvc.Core 1.1.0

Perguntas frequentes sobre o Advisory

Como saber se sou afetado?  ASP.NET Core possui dois tipos diferentes de dependências, direta e transitiva. Se o seu projeto tiver uma dependência direta ou transitiva do Microsoft.AspNetCore.Mvc.Core versão 1.1.0, você será afetado.

Formatos do projeto .NET Core

O .NET Core tem dois formatos de arquivo de projeto diferentes, dependendo do software que criou o projeto.

  1. project.json é o formato original, incluído no .NET Core 1.0 e no Visual Studio 2015.
  2. csproj é o formato usado no Visual Studio 2017.

Você deve garantir que siga as instruções de atualização corretas para o tipo de projeto.

Dependências diretas

Dependências diretas são dependências em que você adiciona especificamente um pacote ao seu projeto. Por exemplo, se você adicionar o pacote Microsoft.AspNetCore.Mvc ao seu projeto, então você tomou uma dependência direta de Microsoft.AspNetCore.Mvc.

As dependências diretas podem ser descobertas revisando o arquivo project.json ou csproj.

Dependências transitivas

As dependências transitivas ocorrem quando você adiciona um pacote ao seu projeto que, por sua vez, depende de outro pacote. Por exemplo, se você adicionar o pacote Microsoft.AspNetCore.Mvc ao seu projeto, ele dependerá do pacote Microsoft.AspNetCore.Mvc.Core (entre outros). Seu projeto tem uma dependência direta de Microsoft.AspNetCore.Mvc e uma dependência transitiva do pacote Microsoft.AspNetCore.Mvc.Core.

As dependências transitivas podem ser revisadas na janela Gerenciador de Soluções do Visual Studio, que oferece suporte à pesquisa, ou examinando o arquivo project.lock.json contido no diretório raiz do seu projeto para projetos project.json ou o arquivo project.assets.json contido no diretório obj do seu projeto para projetos csproj. Esses arquivos são a lista autoritativa de todos os pacotes usados pelo seu projeto, contendo dependências diretas e transitivas.

Qualquer aplicativo MVC 1.1 do ASP.NET Core terá uma dependência do pacote afetado, direta ou transitiva

Como faço para corrigir meu aplicativo afetado?

Você precisará corrigir as dependências diretas e revisar e corrigir quaisquer dependências transitivas. A versão 1.1.1 do pacote vulnerável contém as correções necessárias para proteger seu aplicativo.

Corrigindo dependências diretas - 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",
    }

Este exemplo tem três dependências diretas, Microsoft.NetCore.App, Microsoft.AspNetCore.Server.Kestrel e Microsoft.AspNetCore.Mvc.Core.

Microsoft.NetCore.App é a plataforma que o aplicativo visa, você deve ignorar isso. Os outros pacotes expõem sua versão está à direita do nome do pacote, em nosso exemplo nossos pacotes não-plataforma são a versão 1.1.0.

Revise suas dependências diretas para qualquer instância do Microsoft.AspNetCore.Mvc.Core versão 1.1.0, no exemplo acima há uma dependência direta do pacote vulnerável.

Para atualizar para o novo pacote, altere o número da versão para 1.1.1. Depois de atualizar a versão vulnerável do pacote, salve o arquivo project.json.

Observação

Como parte da aplicação de patches ASP.NET Core MVC, atualizamos todos os pacotes Microsoft.AspNetCore.Mvc.*. Se, por exemplo, você tiver uma dependência de Microsoft.AspNetCore.Mvc, você deve atualizar sua versão para 1.1.1 e ele também atualizará o pacote vulnerável Microsoft.AspNetCore.Mvc.Core.

A seção de dependências em nosso project.json de exemplo agora teria a seguinte aparência:


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

Se você estiver usando o Visual Studio e salvar seu arquivo de project.json atualizado, o Visual Studio restaurará a nova versão do pacote. Você pode ver os resultados da restauração abrindo a Janela de Saída (Ctrl+Alt+O) e altere a lista suspensa "Mostrar saída de" para o Gerenciador de Pacotes.

Se você não estiver usando o Visual Studio, abra uma linha de comando e altere para o diretório do projeto. Execute o comando dotnet restore para restaurar sua nova dependência.

Depois de resolver todas as suas dependências diretas, você também deve revisar suas dependências transitivas.

Corrigindo dependências diretas - csproj/VS2017

Abra o arquivo projectname.csproj no editor ou clique com o botão direito do mouse no projeto no Visual Studio 2017 e escolha Editar projectname.csproj no menu de conteúdo, onde projectname é o nome do seu projeto. Procure nós PackageReference. Abaixo mostra um arquivo de projeto de exemplo:


  <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> 

O exemplo tem duas dependências de pacote diretas, como visto pelos dois elementos PackageReference. O nome do pacote está no atributo Include e o número da versão do pacote está no atributo Version expor sua versão está à direita do nome do pacote. O exemplo mostra dois pacotes Microsoft.AspNetCore e Microsoft.AspNetCore.Mvc.Core e cada pacote é a versão 1.1.0.

Revise os elementos PackageReference para qualquer instância do Microsoft.AspNetCore.Mvc.Core versão 1.1.0.

Se uma referência estiver presente, atualize para o novo pacote alterando o valor do atributo Version para 1.1.1. Depois de atualizar a versão vulnerável do pacote, salve o arquivo csproj.

Observação

Como parte da aplicação de patches ASP.NET Core MVC, atualizamos todos os pacotes Microsoft.AspNetCore.Mvc.*. Se, por exemplo, você tiver uma dependência de Microsoft.AspNetCore.Mvc, você deve atualizar sua versão para 1.1.1 e ele também atualizará o pacote vulnerável Microsoft.AspNetCore.Mvc.Core.

O exemplo csproj agora teria a seguinte aparência:


    <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> 

Se você estiver usando o Visual Studio e salvar seu arquivo csproj atualizado, o Visual Studio restaurará a nova versão do pacote. Você pode ver os resultados da restauração abrindo a Janela de Saída (Ctrl+Alt+O) e altere a lista suspensa "Mostrar saída de" para o Gerenciador de Pacotes.

Se você não estiver usando o Visual Studio, abra uma linha de comando e altere para o diretório do projeto. Execute o comando dotnet restore para restaurar sua nova dependência.

Depois de resolver todas as suas dependências diretas, você também deve revisar suas dependências transitivas.

Examinando dependências transitivas

Há duas maneiras de exibir dependências transitivas. Você pode usar o Gerenciador de Soluções do Visual Studio ou revisando seu arquivo project.lock.json (project.json/VS2015) ou project.assets.json (csproj/VS2017).

Usando o Gerenciador de Soluções do Visual Studio (VS2015)

Se você quiser usar o Visual Studio 2015, abra seu projeto no Visual Studio 2015 e pressione Ctrl+; para ativar a pesquisa no Gerenciador de Soluções. Procure Microsoft.AspNetCore.Mvc.Core e anote os números de versão de todos os resultados encontrados.

Por exemplo, pesquisar Microsoft.AspNetCore.Mvc.Core em um projeto de exemplo que contém uma referência a Microsoft.AspNetCore.Mvc mostra os seguintes resultados no Visual Studio 2015;

Figura 1: Pesquisando referências no Visual Studio 2015

Os resultados da pesquisa aparecem como uma árvore. Nesses resultados, você pode ver que encontramos referências a Microsoft.AspNetCore.Mvc.Core, versão 1.1.0, a versão vulnerável.

A primeira entrada sob o título Referências refere-se à estrutura de destino que seu aplicativo está usando. Isso será . NETCoreApp, . NETStandard ou . NET-Framework-vX.Y.Z (onde X.Y.Z é um número de versão real), dependendo de como você configurou seu aplicativo. Abaixo da sua estrutura de destino estará a lista de pacotes dos quais você assumiu diretamente uma dependência. Neste exemplo, o aplicativo usa uma dependência de Microsoft.AspNetCore.Mvc. Microsoft.AspNetCore.Mvc, por sua vez, tem nós folha que listam suas dependências e suas versões. Nesse caso, o pacote Microsoft.AspNetCore.Mvc depende de uma versão vulnerável do Microsoft.AspNetCore.Mvc.Core e de vários outros pacotes.

Revisão manual project.lock.json (project.json/VS2015)

Abra o arquivo project.lock.json em seu editor. Sugerimos que você use um editor que entenda json e permita que você recolha e expanda nós para revisar este arquivo; o Visual Studio e o Visual Studio Code fornecem essa funcionalidade.

Se você estiver usando o Visual Studio, o arquivo project.lock.json está "embaixo" do arquivo project.json. Clique no triângulo apontando para a direita, ▷, à esquerda do arquivo project.json para expandir a árvore de solução para expor o arquivo project.lock.json. A Figura 1 abaixo mostra um projeto com o arquivo project.json expandido para mostrar o arquivo project.lock.json.

Figura 2: Local do arquivo project.lock.json

Procure no arquivo project.lock.json a cadeia de caracteres "Microsoft.AspNetCore.Mvc.Core/1.1.0". Se o arquivo project.lock.json incluir essa cadeia de caracteres, você terá uma dependência do pacote vulnerável.

Corrigindo dependências transitivas (project.json/VS2015)

Se você não encontrou nenhuma referência a Microsoft.AspNetCore.Mvc.Core/1.1.0, isso significa que nenhuma de suas dependências diretas depende da versão vulnerável do Microsoft.AspNetCore.Mvc.Core ou você já corrigiu o problema atualizando as dependências diretas.

Se sua revisão de dependência transitiva encontrou referências ao vulnerável Microsoft.AspNetCore.Mvc.Core/1.1.0, você deve adicionar uma dependência direta ao pacote atualizado ao arquivo project.json para substituir a dependência transitiva. Abra o project.json e localize a seção de dependências. Por exemplo:


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

Os resultados de nossa pesquisa de pacotes transitivos nos mostraram que Microsoft.AspNet.Mvc depende de Microsoft.AspNet.Mvc.Core versão 1.1.0. Para corrigir isso, você deve adicionar uma dependência direta adicionando-a ao arquivo project.json. Para fazer isso, adicione uma nova linha à seção dependências, fazendo referência à versão corrigida. Por exemplo, para extrair a versão fixa do Microsoft.AspNet.Mvc.Core, versão 1.1.1, edite o arquivo project.json da seguinte maneira;


      "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"
      }

Depois de adicionar dependências diretas aos pacotes fixos, salve o arquivo project.json.

Se você estiver usando o Visual Studio, salve o arquivo de project.json atualizado e o Visual Studio restaurará as novas versões do pacote. Você pode ver os resultados da restauração abrindo a Janela de Saída (Ctrl+Alt+O) e altere a lista suspensa "Mostrar saída de" para o Gerenciador de Pacotes.

Se você não estiver usando o Visual Studio, abra uma linha de comando e altere para o diretório do projeto. Execute o comando dotnet restore para restaurar suas novas dependências.

Usando o Gerenciador de Soluções do Visual Studio (VS2017)

Se você quiser usar o Gerenciador de Soluções, abra seu projeto no Visual Studio 2017 e pressione Ctrl+; para ativar a pesquisa no Gerenciador de Soluções. Procure Microsoft.AspNetCore.Mvc.Core e anote os números de versão de todos os resultados encontrados.

Por exemplo, pesquisar Microsoft.AspNetCore.Mvc.Core em um projeto de exemplo que contém um pacote que usa uma dependência de Microsoft.AspNetCore.Mvc mostra os seguintes resultados no Visual Studio 2017;

Figura 3: Pesquisando referências no Visual Studio 2017

Os resultados da pesquisa aparecem como uma árvore. Nesses resultados, você pode ver que encontramos referências a Microsoft.AspNetCore.Mvc.Core versão 1.1.0.

Abaixo do nó Dependências estará um nó NuGet. No nó NuGet estará a lista de pacotes dos quais você tirou diretamente uma dependência e suas versões. Neste exemplo, o aplicativo assume uma dependência direta de Microsoft.AspNetCore.Mvc. Microsoft.AspNetCore.Mvc, por sua vez, tem nós folha que listam suas dependências e suas versões. No exemplo, o pacote Microsoft.AspNetCore.Mvc usa uma dependência de uma versão do Microsoft.AspNetCore.Mvc.ApiExplorer, que, por sua vez, assume uma dependência de uma versão vulnerável do Microsoft.AspNetCore.Mvc.Core. Você pode ver que outros pacotes também têm uma dependência da versão vulnerável do Microsoft.AspNetCore.Mvc.Core.

Revisão manual project.assets.json (VS2017)

Abra o arquivo project.assets.json do diretório obj do seu projeto no editor. Sugerimos que você use um editor que entenda json e permita que você recolha e expanda nós para revisar este arquivo; o Visual Studio e o Visual Studio Code fornecem essa funcionalidade.

Procure no arquivo project.assets.json a cadeia de caracteres "Microsoft.AspNetCore.Mvc.Core/1.1.0". Se o arquivo project.assets.json incluir essa cadeia de caracteres, você terá uma dependência do pacote vulnerável.

Corrigindo dependências transitivas (csproj/VS2017)

Se você não encontrou nenhuma referência a Microsoft.AspNetCore.Mvc.Core/1.1.0, isso significa que nenhuma de suas dependências diretas depende da versão vulnerável do Microsoft.AspNetCore.Mvc.Core ou você já corrigiu o problema atualizando as dependências diretas.

Se sua revisão de dependência transitiva encontrou referências ao vulnerável Microsoft.AspNetCore.Mvc.Core/1.1.0, você deve adicionar uma dependência direta ao pacote atualizado ao arquivo csproj para substituir a dependência transitiva. Abra o arquivo projectname.csproj no editor ou clique com o botão direito do mouse no projeto no Visual Studio 2017 e escolha Editar projectname.csproj no menu de conteúdo, onde projectname é o nome do seu projeto. Procure por nós PackageReference, por exemplo;


    <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>

No arquivo csproj de exemplo acima, há 3 nós PackageReference. Os resultados de nossa pesquisa de pacotes transitivos nos mostraram que nosso aplicativo depende do vulnerável Microsoft.AspNet.Mvc.Core versão 1.1.0. Para corrigir isso, você deve adicionar uma nova dependência direta adicionando-a ao arquivo csproj. Você faz isso adicionando um novo PackageReference na parte superior da lista PackageReference, fazendo referência à versão corrigida. Por exemplo, para extrair a versão fixa do Microsoft.AspNet.Mvc.Core, versão 1.1.1 no arquivo csproj de exemplo, ele seria alterado da seguinte maneira:


    <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>

Depois de adicionar a referência de dependência direta, salve o arquivo csproj.

Se você estiver usando o Visual Studio, salve o arquivo csproj atualizado e o Visual Studio restaurará as novas versões do pacote. Você pode ver os resultados da restauração abrindo a Janela de Saída (Ctrl+Alt+O) e altere a lista suspensa "Mostrar saída de" para o Gerenciador de Pacotes.

Se você não estiver usando o Visual Studio, abra uma linha de comando e altere para o diretório do projeto. Execute o comando dotnet restore para restaurar suas novas dependências.

Recriando seu aplicativo

Finalmente, recrie seu aplicativo, teste como faria normalmente e reimplante usando seu mecanismo de implantação favorito.

Outras Informações

Suporte

  • Você pode fazer perguntas sobre esse problema no github, no repositório MVC do ASP.NET Core. Este está localizado em https://github.com/aspnet/Mvc.

Relatar problemas de segurança

  • Se você encontrou um possível problema de segurança no .NET Core, envie os detalhes por e-mail para . Os relatórios podem se qualificar para o .NET Core Bug Bounty. Os detalhes do .NET Core Bug Bounty, incluindo os Termos e Condições, estão em https:.

Programa de Proteção Ativa da Microsoft (MAPP)

Para melhorar as proteções de segurança para os clientes, a Microsoft fornece informações sobre vulnerabilidades aos principais fornecedores de software de segurança antes de cada lançamento mensal da atualização de segurança. Os provedores de software de segurança podem usar essas informações de vulnerabilidade para fornecer proteções atualizadas aos clientes por meio de seus softwares ou dispositivos de segurança, como antivírus, sistemas de detecção de intrusão baseados em rede ou sistemas de prevenção de intrusão baseados em host. Para determinar se as proteções ativas estão disponíveis a partir de provedores de software de segurança, visite os sites de proteções ativas fornecidos por parceiros do programa, listados em Parceiros do Microsoft Active Protections Program (MAPP).

Feedback

Suporte

Aviso de isenção de responsabilidade

As informações fornecidas neste comunicado são fornecidas "no estado em que se encontram", sem garantia de qualquer tipo. A Microsoft se isenta de todas as garantias, expressas ou implícitas, incluindo as garantias de comercialização e adequação a uma finalidade específica. Em nenhuma circunstância a Microsoft Corporation ou seus fornecedores serão responsáveis por quaisquer danos, incluindo danos diretos, indiretos, incidentais, consequenciais, perda de lucros comerciais ou danos especiais, mesmo que a Microsoft Corporation ou seus fornecedores tenham sido avisados da possibilidade de tais danos. Alguns estados não permitem a exclusão ou limitação de responsabilidade por danos consequenciais ou incidentais, portanto, a limitação acima pode não se aplicar.

Revisões

  • V1.0 (27 de janeiro de 2017): Comunicado publicado.

Página gerada em 27/01/2017 7:57Z-08:00. </https:>