Modelo do MSRC ppDocument

Comunicado de Segurança da Microsoft 3137909

Vulnerabilidades nos modelos ASP.NET podem permitir falsificação

Publicado em: 9 de fevereiro de 2016 | Atualizado em: 10 de fevereiro de 2016

Versão: 1.1

Sinopse

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ções sobre o que os desenvolvedores podem fazer para ajudar a assegurar que os controles e componentes por eles criados não estejam sujeitos à vulnerabilidade.

A Microsoft tomou conhecimento de uma vulnerabilidade de segurança nas versões públicas do Visual Studio 2013 e Visual Studio 2015 que podem ser usadas em ataques de falsificação de solicitação entre sites (CSRF) contra aplicativos Web criados com 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á ativada por predefinição em nenhum aplicativo criado. Se um desenvolvedor não tiver ativado a 2FA com base no número de telefone de um usuário, não existirá um impacto de segurança se o número de telefone for removido.

Perguntas frequentes do comunicado

De que forma o atacante pode explorar a vulnerabilidade?
Um atacante pode usar a falsificação de solicitação entre sites (CSRF) para enviar uma solicitação a um aplicativo criado com os modelos vulneráveis e, em seguida, remover o número de telefone de um usuário autenticado do Banco de Dados de Identificação ASP.NET. O resultado da vulnerabilidade explorada remove qualquer mecanismo de autenticação de dois fatores (2FA) que se baseia em 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 ASP.NET do Visual Studio 2015 para MVC5 e MVC6.

As atualizações de modelos afetam somente os novos aplicativos. Por este motivo, a Microsoft recomenda vivamente que os desenvolvedores que criaram aplicativos Web com estes modelos realizem de imediato os procedimentos listados na seção Medidassugeridas para avaliarem seus aplicativos Web quanto a exposição à vulnerabilidade e, sem seguida, usem as soluções temporárias nessa seção para efetuarem alterações de código para atualizarem seus aplicativos para os protegerem da vulnerabilidade.

Se você estiver executando o Visual Studio 2013, tem de usar as etapas de solução temporária listadas na seção MedidasSugeridas para atualizar seus aplicativos manualmente sempre que tiver usado os modelos afetados.

Como posso aplicar a atualização?

  1. Inicie o Visual Studio.
  2. No menu Ferramentas, selecione ExtensõeseAtualizações.
  3. Expanda a árvore Atualizações.
  4. Em Atualizações deprodutos, localize as duas entradas seguintes:
    • Microsoft ASP.NET e Ferramentas da Web
    • Frameworks e Ferramentas da Web do Microsoft ASP.NET
  5. Selecione cada atualização e clique em Atualizar.

Ações sugeridas

As seguintes informações de solução temporária explica detalhadamente as alterações que devem ser feitas em aplicativos existentes criados a partir de modelos de projeto ASP.NET.

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

  1. A partir do diretório Controladores, carregue ManageController.cs.
  2. Procure por RemovePhoneNumber() (linha 199).
  3. O código do modelo, sem qualquer personalização, será apresentado desta forma:

        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 apresentado desta forma:

        [HttpPost]
        [ValidateAntiForgeryToken]
        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 });
        }
    
  5. A partir da pasta Modos de exibição/Gerenciar, carregue o arquivo Index.cshtml.

  6. Procure por <dt>Phone Number:</dt> (linha 40)
  7. O código do modelo, sem qualquer personalização, é apresentado desta forma:

        <dt>Phone Number:</dt>
        <dd>
            @(If(Model.PhoneNumber, "None")) [
            @If (Model.PhoneNumber <> Nothing) Then
                 @Html.ActionLink("Change", "AddPhoneNumber")
                 @: &nbsp;|&nbsp;
                 @Html.ActionLink("Remove", "RemovePhoneNumber")
             Outro
                 @Html.ActionLink("Add", "AddPhoneNumber")
             End If
             ]
        </dd>
    
  8. Altere o código de exibição para exibir o seguinte:

        <dt>Phone Number:</dt>
        <dd>
             @(If(Model.PhoneNumber, "None"))
             @If (Model.PhoneNumber <> Nothing) Then
                 @<br />
                 @<text>[&nbsp;&nbsp;@Html.ActionLink("Change", "AddPhoneNumber")&nbsp;&nbsp;]</text>
                 @Using Html.BeginForm("RemovePhoneNumber", "Manage", FormMethod.Post, New With {.class = "form-horizontal", .role = "form"})
                     @Html.AntiForgeryToken
                      @<text>[<input type="submit" value="Remove" class="btn-link" />]</text>
                  End Using
              Else
                  @<text>[&nbsp;&nbsp;@Html.ActionLink("Add", "AddPhoneNumber") &nbsp;&nbsp;]</text>
             End If
        </dd>
    
  9. Recompile seu aplicativo e volte a implantá-lo.

Para Visual Basic

  1. A partir do diretório Controladores, carregue ManageController.cs.
  2. Procure por RemovePhoneNumber() (linha 164).
  3. O código do modelo, sem qualquer personalização, é apresentado desta forma:

            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 da função para que o código seja apresentado desta forma:

            <HttpPost>
            <ValidateAntiForgeryToken>
            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
    
  5. A partir da pasta Modos de exibição/Gerenciar, carregue o arquivo Index.vbhtml.

  6. Procure por <dt>Phone Number:</dt> (linha 37)
  7. O código do modelo, sem qualquer personalização, é apresentado desta forma:

                    <dt>Phone Number:</dt>
                    <dd>
                        @(If(Model.PhoneNumber, "None")) [
                        @If (Model.PhoneNumber <> Nothing) Then
                            @Html.ActionLink("Change", "AddPhoneNumber")
                            @: &nbsp;|&nbsp;
                            @Html.ActionLink("Remove", "RemovePhoneNumber")
                        Else
                            @Html.ActionLink("Add", "AddPhoneNumber")
                        End If
                        ]
                    </dd>
    
  8. Altere o código de exibição para exibir o seguinte:

                    <dt>Phone Number:</dt>
                    <dd>
                        @(If(Model.PhoneNumber, "None"))
                        @If (Model.PhoneNumber <> Nothing) Then
                            @<br />
                            @<text>[&nbsp;&nbsp;@Html.ActionLink("Change", "AddPhoneNumber")&nbsp;&nbsp;]</text>
                            @Using Html.BeginForm("RemovePhoneNumber", "Manage", FormMethod.Post, New With {.class = "form-horizontal", .role = "form"})
                                @Html.AntiForgeryToken
                                @<text>[<input type="submit" value="Remove" class="btn-link" />]</text>
                            End Using
                        Else
                            @<text>[&nbsp;&nbsp;@Html.ActionLink("Add", "AddPhoneNumber") &nbsp;&nbsp;]</text>
                        End If
                    </dd>
    
  9. Recompile o aplicativo e volte a implantá-lo.

Visual Studio 2015 MVC 6 Para C#

  1. A partir do diretório Controladores, carregue ManageController.cs.
  2. Procure por RemovePhoneNumber() (linha 178).
  3. O código do modelo, sem qualquer personalização, é apresentado desta forma:

        // 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 apresentado desta forma:

         [HttpPost]
         [ValidateAntiForgeryToken]
        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 });
        }
    
  5. A partir da pasta Modos de exibição/Gerenciar, carregue o arquivo Index.cshtml.

  6. Substitua completamente o arquivo de exibição para que ele exiba o seguinte:

        @model IndexViewModel
        @{
            ViewData["Title"] = "Manage your account";
        }
    
        <h2>@ViewData["Title"].</h2>
        <p class="text-success">@ViewData["StatusMessage"]
    
        <div>
            <h4>Change your account settings</h4>
            <hr />
            <dl class="dl-horizontal">
                <dt>Password:</dt>
                <dd>
                    @if (Model.HasPassword)
                    {
                        <text>[&nbsp;&nbsp;<a asp-controller="Manage" asp-action="ChangePassword">Change</a>&nbsp;&nbsp;]</text>
                    }
                    else
                    {
                        <text>[&nbsp;&nbsp;<a asp-controller="Manage" asp-action="SetPassword">Create</a>&nbsp;&nbsp;]</text>
                    }
                </dd>
                <dt>External Logins:</dt>
                <dd>
                    @Model.Logins.Count [&nbsp;&nbsp;<a asp-controller="Manage" asp-action="ManageLogins">Manage</a>&nbsp;&nbsp;]
                </dd>
                <dt>Phone Number:</dt>
                <dd>
    
                        Os números de telefone podem ser usados como um segundo fator de verificação em uma autenticação de dois fatores.
                        Consulte <a href="http://go.microsoft.com/fwlink/?LinkID=532713">este artigo</a>
                        para obter detalhes sobre como configurar este aplicativo ASP.NET para oferecer suporte à autenticação de dois fatores usando SMS.
                    </p >
                    @*@(Model.PhoneNumber ?? "None")
                        @if (Model.PhoneNumber != null)
                        {
                            <br />
                            <text>[&nbsp;&nbsp;<a asp-controller="Manage" asp-action="AddPhoneNumber">Change</a>&nbsp;&nbsp;]</text>
                            <form asp-controller="Manage" asp-action="RemovePhoneNumber" method="post" role="form">
                                [<button type="submit" class="btn-link">Remove</button>]
                            </form>
                        }
                        else
                        {
                            <text>[&nbsp;&nbsp;<a asp-controller="Manage" asp-action="AddPhoneNumber">Add</a>&nbsp;&nbsp;]</text>
                        }*@
                </dd>
    
                <dt>Two-Factor Authentication:</dt>
                <dd>
    
                        Não existem provedores de autenticação de dois fatores configurados. Consulte <a href="http://go.microsoft.com/fwlink/?LinkID=532713">este artigo</a>
                        para configurar este aplicativo para que ofereça suporte à autenticação de dois fatores.
                    </p >
                    @*@if (Model.TwoFactor)
                        {
                            <form asp-controller="Manage" asp-action="DisableTwoFactorAuthentication" method="post" class="form-horizontal" role="form">
                                Ativado [<button type="submit" class="btn-link">Disable</button>]
                            </form>
                        }
                        else
                        {
                            <form asp-controller="Manage" asp-action="EnableTwoFactorAuthentication" method="post" class="form-horizontal" role="form">
                                [<button type="submit" class="btn-link">Enable</button>] Disabled
                            </form>
                        }*@
                </dd>
            </dl>
        </div>
    
  7. Recompile seu aplicativo e volte a implantá-lo.

Para Visual Basic

  • ASP.Net Core (anteriormente ASP.NET 5) não suporta o Visual Basic.

Ações adicionais sugeridas

  • Baixe as atualizações da ferramenta do Visual Studio diretamente em:
  • Proteja seu PC Continuamos a incentivar nossos clientes a seguir nossa orientação de proteger o computador por meio de habilitação do firewall, obtenção de atualizações de software e instalação de software antivírus. Para obter mais informações, consulte o Centro de Segurança e Proteção da Microsoft.
  • Mantenha o software da Microsoft atualizado Todos os usuários que executam software da Microsoft devem aplicar as mais recentes atualizações de segurança da Microsoft para ter certeza de que seus computadores estejam protegidos ao máximo. Se não tiver certeza de que seu computador está atualizado, visite o Microsoft Update, verifique se há atualizações disponíveis para o computador e instale as atualizações de alta prioridade oferecidas. Se você tem as atualizações automáticas habilitadas e configuradas para fornecer atualizações para produtos Microsoft, as atualizações são fornecidas a você quando lançadas, mas você deve verificar se elas são instaladas.

Outras informações

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.1 10 de fevereiro de 2016: Comunicado de atualização para incluir as informações de download para Frameworks Web do Microsoft ASP.NET e Ferramentas e Microsoft ASP.NET e Ferramentas Web. Esta é apenas uma alteração informativa.

Página gerada em 10 de fevereiro de 2016 11:13-08:00.