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: 26 de janeiro de 2017

Versão: 1.0

Sinopse

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. Este aviso também fornece orientações 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 resultar em negação de serviço.

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

Fatores atenuantes

Somente aplicativos voltados para o ASP.NET Core 1.1.0 são afetados. Aplicativos voltados para o ASP.NET Core 1.0.0, 1.0.1 ou 1.02 não são afetados.

Softwares afetados

A vulnerabilidade afetará qualquer projeto do Microsoft ASP.NET Core se este usar a seguinte versão de pacote afetada.

Pacote e versão afetados

Nome do pacote

Versão do pacote

Microsoft.AspNetCore.Mvc.Core

1.1.0

Perguntas frequentes do comunicado

Como eu sei se sou afetado?
O ASP.NET Core tem dois tipos diferentes de dependências: direta e transitiva. Você está afetado caso o seu projeto tenha uma dependência direta ou transitiva por Microsoft.AspNetCore.Mvc.Core versão 1.1.0.

Formatos de Projeto do .NET Core

O .NET Core tem dois formatos de arquivo de projeto diferentes, dependendo de qual software 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.

Certifique-se de seguir as instruções de atualização corretas para o seu tipo de projeto.

Dependências diretas

Dependências diretas são dependências nas quais você adiciona especificamente um pacote ao seu projeto. Por exemplo, se você adicionar o pacote Microsoft.AspNetCore.Mvc ao projeto, terá uma dependência direta com Microsoft.AspNetCore.Mvc.

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

Dependências transitivas

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

Dependências transitivas são analisáveis na janela Gerenciador de Soluções do Visual Studio, que oferece suporte para pesquisa, ou por meio de uma análise do arquivo project.lock.json, contido no diretório raiz do seu projeto, em busca de projetos project.json ou do arquivo project.assets.json, contido no diretório obj do seu projeto, em busca de projetos csproj. Esses arquivos são a lista oficial de todos os pacotes usados pelo seu projeto, contendo tanto dependências diretas quanto transitivas.

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

Como corrigir o aplicativo afetado?

Você precisará corrigir as dependências diretas e examinar 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 o aplicativo.

Corrigindo dependências diretas – project.json/VS2015

Abra o arquivo project.json no seu editor. Procure a seção dependencies. Veja a seguir um exemplo de seção de dependências:

    "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 dos destinos do aplicativo e deve ser ignorado. Os outros pacotes expõem suas versões à direita do nome do pacote. No exemplo, nossos pacotes não relacionados a plataforma são da versão 1.1.0.

Reveja suas dependências diretas em busca de qualquer instância de Microsoft.AspNetCore.Mvc.Core versão 1.1.0. No exemplo acima, há uma dependência direta pelo 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 do pacote vulnerável, salve o arquivo project.json.

Observação

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

A seção dependencies no arquivo de exemplo project.json agora teria esta 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 o arquivo project.json atualizado, o Visual Studio restaurará a nova versão do pacote. É possível ver o resultado da restauração abrindo a Janela de Saída (Ctrl+Alt+O) e alterar a lista suspensa "Mostrar saída de" para Gerenciador de Pacotes.

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

Depois de ter abordado todas as suas dependências diretas, você também deve rever suas dependências transitivas.

Corrigindo dependências diretas – csproj/VS2017

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

  <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 Include="Microsoft.AspNetCore.Mvc.Core" Version="1.1.0" />
    </ItemGroup>
    <ItemGroup>
      <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0-msbuild3-final" />
    </ItemGroup>
  </Project> 

O exemplo tem duas dependências de pacote diretas, conforme visto pelos dois elementos PackageReference. O nome do pacote está no atributo Include, enquanto o número de versão do pacote esta no atributo Version e expõe o número da versão à direita do nome do pacote. O exemplo mostra dois pacotes Microsoft.AspNetCore e Microsoft.AspNetCore.Mvc.Core, cuja versão é 1.1.0.

Reveja seus elementos PackageReference em busca de qualquer instância de 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 do pacote vulnerável, salve o arquivo csproj.

Observação

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

O exemplo de csproj passa a ter 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 Include="Microsoft.AspNetCore.Mvc.Core" Version="1.1.1" />
    </ItemGroup>
    <ItemGroup>
      <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0-msbuild3-final" />
    </ItemGroup>
  </Project> 

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

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

Depois de ter abordado todas as suas dependências diretas, você também deve rever suas dependências transitivas.

Examinando dependências transitivas

Há duas formas de exibir dependências transitivas. Você pode usar o Gerenciador de Soluções do Visual Studio ou pode analisar o 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 o 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 qualquer resultado que você encontrar.

Por exemplo, procurar 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 são mostrados como uma árvore. Nesses resultados, é possível 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 o aplicativo está usando. Ela será .NETCoreApp, .NETStandard ou .NET Framework--vX.Y.Z (em que X.Y.Z é um número de versão real), dependendo de como você configurou o aplicativo. Abaixo da estrutura de destino, é exibida a lista de pacotes pelos quais você adquiriu diretamente uma dependência. Neste exemplo, o aplicativo tem uma dependência por Microsoft.AspNetCore.Mvc. Por sua vez, Microsoft.AspNetCore.Mvc tem nós folha que listam suas dependências e versões. Neste caso, o pacote Microsoft.AspNetCore.Mvc adquire uma dependência por uma versão vulnerável de Microsoft.AspNetCore.Mvc.Core e vários outros pacotes.

Analisando manualmente project.lock.json (project.json/VS2015)

Abra o arquivo project.lock.json no seu editor. Sugerimos que você use um editor que compreenda json e que permita recolher e expandir nós para analisar esse arquivo; tanto o Visual Studio quanto o Visual Studio Code fornecem essa funcionalidade.

Se você está usando o Visual Studio, o arquivo project.lock.json está "abaixo" do arquivo project.json. Clique no triângulo que aponta para a direita, ▷, à esquerda do arquivo project.json, para expandir a árvore de solução e 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: localização do arquivo project.lock.json

Procure a cadeia de caracteres “Microsoft.AspNetCore.Mvc.Core/1.1.0” no arquivo project.lock.json. Se o arquivo project.lock.json incluir essa cadeia de caracteres, significa você tem uma dependência pelo pacote vulnerável.

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

Se você não encontrou uma referência a Microsoft.AspNetCore.Mvc.Core/1.1.0, significa que nenhuma das suas dependências diretas está subordinada à versão vulnerável de Microsoft.AspNetCore.Mvc.Core ou que você já corrigiu o problema por meio da atualização das dependências diretas.

Se a análise das suas dependências transitivas encontrou referências ao pacote Microsoft.AspNetCore.Mvc.Core/1.1.0 vulnerável, você deve incluir no seu arquivo project.json uma dependência direta ao pacote atualizado, para substituir a dependência transitiva. Abra o arquivo project.json e localize a seção dependencies. 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 da nossa pesquisa por pacotes transitivos 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 à seção dependencies uma nova linha que faça referência à versão corrigida. Por exemplo, para obter a versão corrigida de 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 ter adicionado dependências diretas aos pacotes corrigidos, salve o arquivo project.json.

Se estiver usando o Visual Studio, salve o arquivo project.json atualizado, e o Visual Studio restaurará as novas versões dos pacotes. É possível ver o resultado da restauração abrindo a Janela de Saída (Ctrl+Alt+O) e alterar a lista suspensa "Mostrar saída de" para Gerenciador de Pacotes.

Se não estiver usando o Visual Studio, abra uma linha de comando e mude 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 o 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 qualquer resultado que você encontrar.

Por exemplo, se você procurar Microsoft.AspNetCore.Mvc.Core em um projeto de exemplo que contém um pacote que adquire dependência por Microsoft.AspNetCore.Mvc, os seguintes resultados serão exibidos no Visual Studio 2017;

Figura 3: Pesquisando referências no Visual Studio 2017

Os resultados da pesquisa são mostrados como uma árvore. Nesses resultados, é possível ver que encontramos referências a Microsoft.AspNetCore.Mvc.Core, versão 1.1.0.

Abaixo do nó Dependencies, haverá um nó NuGet. Abaixo do nó NuGet, haverá uma lista de pacotes pelos quais você adquiriu diretamente uma dependência, juntamente com suas versões. Neste exemplo, o aplicativo tem uma dependência direta por Microsoft.AspNetCore.Mvc. Por sua vez, Microsoft.AspNetCore.Mvc tem nós folha que listam suas dependências e versões. No exemplo, o pacote Microsoft.AspNetCore.Mvc adquire uma dependência por uma versão de Microsoft.AspNetCore.Mvc.ApiExplorer, que, por sua vez, adquire uma dependência por uma versão vulnerável de Microsoft.AspNetCore.Mvc.Core. É possível ver que outros pacotes também adquirem uma dependência pela versão vulnerável de Microsoft.AspNetCore.Mvc.Core.

Analisando manualmente project.assets.json (VS2017)

Abra o arquivo project.assets.json, localizado no diretório obj do seu projeto, no seu editor. Sugerimos que você use um editor que compreenda json e que permita recolher e expandir nós para analisar esse arquivo; tanto o Visual Studio quanto o Visual Studio Code fornecem essa funcionalidade.

Procure a cadeia de caracteres “Microsoft.AspNetCore.Mvc.Core/1.1.0” no arquivo project.assets.json. Se o arquivo project.lock.json tiver essa cadeia de caracteres, significa você tem uma dependência pelo pacote vulnerável.

Corrigindo dependências transitivas (csproj/VS2017)

Se você não encontrou uma referência a Microsoft.AspNetCore.Mvc.Core/1.1.0, significa que nenhuma das suas dependências diretas está subordinada à versão vulnerável de Microsoft.AspNetCore.Mvc.Core ou que você já corrigiu o problema por meio da atualização das dependências diretas.

Se a análise das suas dependências transitivas encontrou referências ao pacote Microsoft.AspNetCore.Mvc.Core/1.1.0 vulnerável, você deve incluir no seu arquivo csproj uma dependência direta ao pacote atualizado, para substituir a dependência transitiva. Abra seu arquivo projectname.csproj no editor ou clique no projeto com o botão direito no Visual Studio 2017 e escolha Editar projectname.csproj no menu de conteúdo, em que projectname é o nome do seu projeto. Procure 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 Include="Microsoft.AspNetCore.Mvc" Version="1.1.0" />
      <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.0" />
    </ItemGroup>
    <ItemGroup>
      <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0-msbuild3-final" />
    </ItemGroup>
  </Project>

No exemplo de arquivo csproj acima, existem 3 nós PackageReference. Os resultados da nossa pesquisa por pacotes transitivos mostraram que o aplicativo depende do pacote Microsoft.AspNet.Mvc.Core versão 1.1.0 vulnerável. Para corrigir isso, você deve adicionar uma nova dependência direta, adicionando-a ao arquivo project.json. Para fazer isso, adicione ao topo da lista PackageReference uma nova PackageReference que faça referência à versão corrigida. Por exemplo, para extrair a versão corrigida de Microsoft.AspNet.Mvc.Core, versão 1.1.1 no exemplo de arquivo csproj, a seguinte alteração deve ser feita:

  <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 Include="Microsoft.AspNetCore" Version="1.1.0" />
      <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.0" />
      <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.0" />
    </ItemGroup>
    <ItemGroup>
      <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0-msbuild3-final" />
    </ItemGroup>

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

Se estiver usando o Visual Studio, salve o arquivo csproj atualizado, e o Visual Studio restaurará as novas versões dos pacotes. É possível ver o resultado da restauração abrindo a Janela de Saída (Ctrl+Alt+O) e alterar a lista suspensa "Mostrar saída de" para Gerenciador de Pacotes.

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

Recompilando seu aplicativo

Por último, recompile o aplicativo, teste-o como faria normalmente e reimplante-o usando seu mecanismo de implantação favorito.

Outras informações

Suporte

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

Comunicando problemas de segurança

  • Se você encontrou um possível problema de segurança no .NET Core, envie um e-mail com os detalhes para secure@microsoft.com. Os problemas comunicados podem se qualificar para o .NET Core Bug Bounty. Detalhes sobre o .NET Core Bug Bounty, incluindo os Termos e Condições, estão disponíveis em https://aka.ms/corebounty.

Microsoft Active Protections Program (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 do lançamento de cada atualização de segurança mensal. Assim, os fornecedores de software de segurança podem usar essas informações sobre vulnerabilidades 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 invasões com base em rede ou sistemas de prevenção de invasões com base em host. Para determinar se os fornecedores de software de segurança estão disponibilizando proteções ativas, visite os sites de proteções ativas fornecidos pelos parceiros do programa, listados em Parceiros do Microsoft Active Protections Program (MAPP).

Comentários

Suporte

Aviso de isenção de responsabilidade

As informações oferecidas neste documento são fornecidas "como estão" sem garantia de nenhum tipo. A Microsoft se isenta de todas as garantias, expressas ou implícitas, inclusive as garantias de comercialização e adequação a um propósito específico. Em hipótese alguma a Microsoft Corporation ou seus fornecedores serão responsáveis por quaisquer danos, inclusive danos diretos, indiretos, incidentais, consequenciais, danos por lucros cessantes ou danos especiais, mesmo que a Microsoft Corporation ou seus fornecedores tenham sido alertados da possibilidade dos referidos danos. Como alguns estados não permitem a exclusão ou limitação de responsabilidade por danos consequenciais ou indiretos, a limitação acima pode não ser aplicável a você.

Revisões

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

Página gerada em 2017-01-25 19:52Z-08:00.