Comunicado de Segurança da Microsoft 3137909

Vulnerabilidades em modelos ASP.NET podem permitir adulteração

Publicado: terça-feira, 9 de fevereiro de 2016 | Atualizado: February 10, 2016

Versão: 1.1

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 Visual Studio 2013, Visual Studio 2015, ASP.NET MVC5 e ASP.NET MVC6. Este comunicado também fornece orientação sobre o que os desenvolvedores podem fazer para ajudar a garantir que os controles e componentes criados por eles não estejam sujeitos à vulnerabilidade.

A Microsoft está ciente de uma vulnerabilidade de segurança nas versões públicas do Visual Studio 2013 e do Visual Studio 2015 que pode ser usada em um cenário de ataque de falsificação de solicitação entre sites (CSRF) contra aplicativos Web criados usando os modelos de projeto ASP.NET afetados. Os modelos de projeto Microsoft ASP.NET MVC5 e ASP.NET MVC6 são usados por desenvolvedores de software como modelos iniciais para novos aplicativos Web.

Fatores atenuantes

  • A autenticação de dois fatores (2FA) não está habilitada por padrão em nenhum aplicativo gerado. Se um desenvolvedor não tiver habilitado o 2FA com base no número de telefone de um usuário, não haverá impacto na segurança se o número de telefone for removido.

Perguntas frequentes sobre o Advisory

Como um invasor pode explorar a vulnerabilidade?
Um invasor pode usar a falsificação de solicitação entre sites (CSRF) para enviar uma solicitação a um aplicativo Web gerado com os modelos vulneráveis e, em seguida, remover o número de telefone de um usuário autenticado do Banco de Dados de Identidade ASP.NET. O resultado da vulnerabilidade explorada remove qualquer mecanismo de autenticação de dois fatores (2FA) que dependa de um número de telefone. A senha do usuário não é afetada.

O que a atualização faz?
A atualização corrige os modelos de projeto do Visual Studio 2015 ASP.NET para MVC5 e MVC6.

As atualizações de modelo afetam apenas novos aplicativos. Por esse motivo, a Microsoft recomenda enfaticamente que os desenvolvedores que criaram aplicativos Web usando esses modelos tomem medidas imediatas, listadas na seção Ações Sugeridas , para avaliar seus aplicativos Web quanto à exposição à vulnerabilidade e, em seguida, usem as soluções alternativas nessa seção para fazer alterações de código para atualizar seus aplicativos para protegê-los dos vulneráveis.

Se você estiver executando o Visual Studio 2013, precisará usar as etapas de solução alternativa listadas na seção Ações Sugeridas para atualizar seus aplicativos manualmente sempre que você usou os modelos afetados.

Como faço para aplicar a atualização?

  1. Inicie o Visual Studio.
  2. No menu Ferramentas, escolha Extensões e atualizações.
  3. Expanda a árvore Atualizações .
  4. Em Atualizações do Produto, localize as duas entradas a seguir:
    • Microsoft ASP.NET and Web Tools
    • Estruturas e ferramentas da Web do Microsoft ASP.NET
  5. Selecione cada atualização e clique em Atualizar.

Ações sugeridas

As informações de solução alternativa a seguir detalham as alterações que você deve fazer em aplicativos existentes criados a partir dos modelos de projeto ASP.NET.

Visual Studio 2015 MVC 5 e Visual Studio 2013 MVC 5
Para C#

  1. No diretório Controllers, carregue ManageController.cs.

  2. Procure por RemovePhoneNumber() (linha 199).

  3. O código do modelo, sem qualquer personalização, será exibido da seguinte maneira:

     public async Task<actionresult> RemovePhoneNumber()
     {
         var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);
         if (!result.Succeeded)
         {
             return RedirectToAction("Index", new { Message = ManageMessageId.Error });
         }
         var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
         if (user != null)
         {
             await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
         }
         return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess });
     }
    
  4. Adicione os atributos [HttpPost] e [ValidateAntiForgeryToken] à definição da função, para que o código seja exibido da seguinte maneira:

     [HttpPost]
     [ValidateAntiForgeryToken]
     public async Task</actionresult><actionresult> RemovePhoneNumber()
     {
         var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);
         if (!result.Succeeded)
         {
             return RedirectToAction("Index", new { Message = ManageMessageId.Error });
         }
         var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
         if (user != null)
         {
             await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
         }
         return RedirectToAction("Index", new { Message = ManageMessageId.RemovePhoneSuccess });
     }
    
  5. Na pasta Views/Manage , carregue o arquivo Index.cshtml.

  6. Procure por dt>Número de< telefone:</dt> (Linha 40)

  7. O código do modelo, sem qualquer personalização, é exibido da seguinte maneira:

     <dt>Phone Number:</dt>
    
@(Model.PhoneNumber ?? "Nenhum") [ @if (Model.PhoneNumber != null) { @Html.ActionLink("Change", "AddPhoneNumber") @:  |  @Html.ActionLink("Remove", "RemovePhoneNumber") } else { @Html.ActionLink("Add", "AddPhoneNumber") } ]
```
  1. Altere o código de exibição para exibir da seguinte maneira:

     <dt>Phone Number:</dt>
    
@(Model.PhoneNumber ?? "Nenhum") @if (Model.PhoneNumber != null) {
usando (Html.BeginForm("RemovePhoneNumber", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() } } else { }
```
  1. Recompile seu aplicativo e reimplante-o.

Para Visual Basic

  1. No diretório Controllers, carregue ManageController.cs.

  2. Procure por RemovePhoneNumber() (linha 164).

  3. O código do modelo, sem qualquer personalização, é exibido da seguinte maneira:

         Public Async Function RemovePhoneNumber() As Task(Of ActionResult)
             Dim result = Await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), Nothing)
             If Not result.Succeeded Then
                 Return RedirectToAction("Index", New With {
                     .Message = ManageMessageId.[Error]
                 })
             End If
             Dim userInfo = Await UserManager.FindByIdAsync(User.Identity.GetUserId())
             If userInfo IsNot Nothing Then
                 Await SignInManager.SignInAsync(userInfo, isPersistent:=False, rememberBrowser:=False)
             End If
             Return RedirectToAction("Index", New With {
                 .Message = ManageMessageId.RemovePhoneSuccess
             })
         End Function
    
  4. Adicione os <atributos HttpPost> e <ValidateAntiForgeryToken> à definição de função para que sejam exibidos da seguinte maneira:

         <httppost>
    
  1. Na pasta Views/Manage, carregue o arquivo Index.vbhtml.

  2. Procure por dt>Número de <telefone:</dt> (Linha 37)

  3. O código do modelo, sem qualquer personalização, é exibido da seguinte maneira:

                 <dt>Phone Number:</dt>
    
@(If(Model.PhoneNumber, "Nenhum")) [ @If (Model.PhoneNumber
Nothing) Então @Html.ActionLink("Change", "AddPhoneNumber") @:  |  @Html.ActionLink("Remove", "RemovePhoneNumber") Else @Html.ActionLink("Add", "AddPhoneNumber") End If ]
```
  1. Altere o código de exibição para exibir da seguinte maneira:

                 <dt>Phone Number:</dt>
    
@(If(Model.PhoneNumber, "Nenhum")) @If (Model.PhoneNumber
Nada) Então @
@ @Using Html.BeginForm("RemovePhoneNumber", "Manage", FormMethod.Post, New With {.class = "form-horizontal", .role = "form"}) @Html.AntiForgeryToken @ end usando else @ end if
```
  1. Recompile o aplicativo e reimplante-o.

Visual Studio 2015 MVC 6
Para C#

  1. No diretório Controllers, carregue ManageController.cs.

  2. Procure por RemovePhoneNumber() (linha 178).

  3. O código do modelo, sem qualquer personalização, é exibido da seguinte maneira:

     // GET: /Manage/RemovePhoneNumber
     [HttpGet]
     public async Task<iactionresult> RemovePhoneNumber()
     {
          var user = await GetCurrentUserAsync();
          if (user != null)
          {
              var result = await _userManager.SetPhoneNumberAsync(user, null);
              if (result.Succeeded)
              {
                  await _signInManager.SignInAsync(user, isPersistent: false);
                  return RedirectToAction(nameof(Index), new { Message = ManageMessageId.RemovePhoneSuccess });
             }
         }
         return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
     }
    
  4. Remova o atributo [HttpGet] e adicione os atributos [HttpPost] e [ValidateAntiForgeryToken] à definição da função, para que o código seja exibido da seguinte maneira:

      [HttpPost]
      [ValidateAntiForgeryToken]
     public async Task</iactionresult><iactionresult> RemovePhoneNumber()
     {
         var user = await GetCurrentUserAsync();
         if (user != null)
         {
             var result = await _userManager.SetPhoneNumberAsync(user, null);
             if (result.Succeeded)
             {
                 await _signInManager.SignInAsync(user, isPersistent: false);
                 return RedirectToAction(nameof(Index), new { Message = ManageMessageId.RemovePhoneSuccess });
             }
         }
         return RedirectToAction(nameof(Index), new { Message = ManageMessageId.Error });
    }
    
  5. Na pasta Views/Manage , carregue o arquivo Index.cshtml.

  6. Substitua completamente o arquivo de exibição para que ele seja exibido da seguinte maneira:

     @model IndexViewModel
     @{
         ViewData["Title"] = "Manage your account";
     }
    
     <h2>@ViewData["Title"].</h2>
    

@ViewData["StatusMessage"]

    <div>

Alterar as configurações da sua conta


Senha:
@if (Model.HasPassword) { } else { }
Logins externos:
@Model.Logins.Count [  Gerenciar  ]
Número de telefone:
Os números de telefone podem ser usados como um segundo fator de verificação na autenticação de dois fatores. Consulte este artigo para obter detalhes sobre como configurar este aplicativo ASP.NET para oferecer suporte à autenticação de dois fatores usando SMS. @*@(Model.PhoneNumber ?? "Nenhum") @if (Model.PhoneNumber != null) {
[]
} else { }* @
Autenticação de dois fatores:
Não há provedores de autenticação de dois fatores configurados. Consulte este artigo para configurar este aplicativo para oferecer suporte à autenticação de dois fatores. @*@if (Model.TwoFactor) {
Ativado []
} else {
[] Desativado
}* @
```
  1. Recompile seu aplicativo e reimplante-o.

Para Visual Basic

  • ASP.Net Core (anteriormente ASP.NET 5) não oferece suporte ao Visual Basic.

Ações adicionais sugeridas

  • Baixe as atualizações da ferramenta Visual Studio diretamente em:

  • Proteja seu PC
    Continuamos a incentivar os clientes a seguirem nossa orientação Proteja seu computador de habilitar um firewall, obter atualizações de software e instalar software antivírus. Para obter mais informações, consulte Central de Segurança da Microsoft.

  • Mantenha o software Microsoft atualizado
    Os usuários que executam o software da Microsoft devem aplicar as atualizações de segurança mais recentes da Microsoft para ajudar a garantir que seus computadores estejam o mais protegidos possível. Se você não tiver certeza se o software está atualizado, visite o Microsoft Update, verifique se há atualizações disponíveis no computador e instale as atualizações de alta prioridade que lhe são oferecidas. Se você tiver a atualização automática habilitada e configurada para fornecer atualizações para produtos Microsoft, as atualizações serão entregues a você quando forem lançadas, mas você deverá verificar se elas estão instaladas.

Outras Informações

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 (9 de fevereiro de 2016): Comunicado publicado.
  • V1.1 (10 de fevereiro de 2016): Comunicado atualizado para incluir informações de download para Microsoft ASP.NET Web Frameworks e Ferramentas e Microsoft ASP.NET e Ferramentas da Web. Esta é apenas uma alteração informativa.

Página gerada em 19/02/2016 14:36-08:00.