3137909 de aviso de seguridad de Microsoft

Las vulnerabilidades de las plantillas de ASP.NET podrían permitir alteraciones

Publicado: 9 de febrero de 2016 | Actualizado: 10 de febrero de 2016

Versión: 1.1

Resumen ejecutivo

Microsoft publica este aviso de seguridad para proporcionar información sobre una vulnerabilidad en las versiones públicas de Visual Studio 2013, Visual Studio 2015, ASP.NET MVC5 y ASP.NET MVC6. Este aviso también proporciona instrucciones sobre lo que los desarrolladores pueden hacer para ayudar a garantizar que los controles y componentes que han creado no están sujetos a la vulnerabilidad.

Microsoft conoce una vulnerabilidad de seguridad en las versiones públicas de Visual Studio 2013 y Visual Studio 2015 que se podrían usar en un escenario de ataque de falsificación de solicitudes entre sitios (CSRF) en aplicaciones web creadas con las plantillas de proyecto de ASP.NET afectadas. Los desarrolladores de software usan las plantillas de proyecto de Microsoft ASP.NET MVC5 y ASP.NET MVC6 como plantillas de inicio para nuevas aplicaciones web.

Factores de mitigación

  • La autenticación en dos fases (2FA) no está habilitada de forma predeterminada en ninguna aplicación generada. Si un desarrollador no ha habilitado 2FA en función del número de teléfono de un usuario, no habrá ningún impacto en la seguridad si se quita el número de teléfono.

Preguntas más frecuentes sobre asesoramiento

¿Cómo podría un atacante aprovechar la vulnerabilidad?
Un atacante podría usar falsificación de solicitudes entre sitios (CSRF) para enviar una solicitud a una aplicación web generada con las plantillas vulnerables y, a continuación, quitar el número de teléfono de un usuario autenticado de la base de datos de identidad de ASP.NET. El resultado de la vulnerabilidad explotada quita cualquier mecanismo de autenticación en dos fases (2FA) que se base en un número de teléfono. La contraseña del usuario no se ve afectada.

¿Qué hace la actualización?
La actualización corrige las plantillas de proyecto de Visual Studio 2015 ASP.NET para MVC5 y MVC6.

Las actualizaciones de plantilla solo afectan a las nuevas aplicaciones. Por este motivo, Microsoft recomienda encarecidamente que los desarrolladores que han compilado aplicaciones web que usan estas plantillas realicen acciones inmediatas, que aparecen en la sección Acciones sugeridas, evalúen sus aplicaciones web para que se exponguen a la vulnerabilidad y, a continuación, use las soluciones alternativas de esa sección para realizar cambios en el código para actualizar sus aplicaciones para protegerlos de los vulnerables.

Si ejecuta Visual Studio 2013, debe usar los pasos de solución que se enumeran en la sección Acciones sugeridas para actualizar las aplicaciones manualmente cada vez que usó las plantillas afectadas.

Cómo aplicar la actualización?

  1. Inicie Visual Studio.
  2. En el menú Herramientas, elija Extensiones y Novedades.
  3. Expanda el árbol de Novedades.
  4. En Product Novedades busque las dos entradas siguientes:
    • Microsoft ASP.NET and Web Tools
    • Herramientas y marcos web de Microsoft ASP.NET
  5. Seleccione cada actualización y haga clic en Actualizar.

Acciones sugeridas

La siguiente información de solución alternativa detalla los cambios que debe realizar en las aplicaciones existentes creadas a partir de las plantillas de proyecto de ASP.NET.

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

  1. En el directorio Controladores, cargue ManageController.cs.

  2. Busque Remove Teléfono Number() (línea 199).

  3. El código de plantilla, sin ninguna personalización, se mostrará de la siguiente manera:

     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. Agregue los atributos [HttpPost] y [ValidateAntiForgeryToken] a la definición de función para que el código se muestre de la siguiente manera:

     [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. En la carpeta Views/Manage , cargue el archivo Index.cshtml.

  6. <Busque dt> Teléfono Number:</dt> (Línea 40)

  7. El código de plantilla, sin ninguna personalización, se muestra de la siguiente manera:

     <dt>Phone Number:</dt>
    
@(Model. Teléfono Number ?? "None") [ @if (Model.TeléfonoNumber != null) { @Html.ActionLink("Change", "Add Teléfono Number") @:  |  @Html.ActionLink("Remove", "Remove Teléfono Number") } else { @Html.ActionLink("Add", "Add Teléfono Number") } ]
```
  1. Cambie el código de vista para que se muestre de la siguiente manera:

     <dt>Phone Number:</dt>
    
@(Model. Teléfono Number ?? @if "None") (Model.TeléfonoNúmero != null) {
using (Html.BeginForm("Remove Teléfono Number", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() } } else { }
```
  1. Vuelva a compilar la aplicación y vuelva a implementarla.

Para Visual Basic

  1. En el directorio Controladores, cargue ManageController.cs.

  2. Busque Remove Teléfono Number() (línea 164).

  3. El código de plantilla, sin ninguna personalización, se muestra de la siguiente manera:

         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. Agregue los atributos HttpPost> y< ValidateAntiForgeryToken> a la definición de función para que se muestren de la <siguiente manera:

         <httppost>
    
  1. En la carpeta Views/Manage, cargue el archivo Index.vbhtml.

  2. <Busque dt> Teléfono Number:</dt> (Línea 37)

  3. El código de plantilla, sin ninguna personalización, se muestra de la siguiente manera:

                 <dt>Phone Number:</dt>
    
@(If(Model.TeléfonoNumber, "None")) [ @If (Model.TeléfonoNúmero
Nothing) Then @Html.ActionLink("Change", "Add Teléfono Number") @:  |  @Html.ActionLink("Remove", "Remove Teléfono Number") Else @Html.ActionLink("Add", "Add Teléfono Number") End If ]
```
  1. Cambie el código de vista para que se muestre de la siguiente manera:

                 <dt>Phone Number:</dt>
    
@(If(Model.TeléfonoNumber, "None")) @If (Model.TeléfonoNúmero
Nada) Entonces @
@ @Using Html.BeginForm("Remove Teléfono Number", "Manage", FormMethod.Post, New With {.class = "form-horizontal", .role = "form"}) @Html.AntiForgeryToken @ End Using Else @ End If
```
  1. Vuelva a compilar la aplicación y vuelva a implementarla.

Visual Studio 2015 MVC 6
Para C#

  1. En el directorio Controladores, cargue ManageController.cs.

  2. Busque Remove Teléfono Number() (línea 178).

  3. El código de plantilla, sin ninguna personalización, se muestra de la siguiente manera:

     // 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. Quite el atributo [HttpGet] y agregue los atributos [HttpPost] y [ValidateAntiForgeryToken] a la definición de función, de modo que el código se muestre de la siguiente manera:

      [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. En la carpeta Views/Manage , cargue el archivo Index.cshtml.

  6. Reemplace completamente el archivo de vista para que se muestre de la siguiente manera:

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

@ViewData["StatusMessage"]

    <div>

Cambiar la configuración de la cuenta


Contraseña:
@if (Model.HasPassword) { } else { }
Inicios de sesión externos:
@Model.Logins.Count [  Administrar  ]
Número de teléfono:
Teléfono Números se pueden usar como segundo factor de verificación en la autenticación en dos fases. Consulte este artículo para obtener más información sobre cómo configurar esta aplicación de ASP.NET para admitir la autenticación en dos fases mediante SMS. @*@(Model. Teléfono Number ?? @if "None") (Model.TeléfonoNúmero != null) {
[]
} else { }* @
Autenticación en dos fases:
No hay proveedores de autenticación en dos fases configurados. Consulte este artículo para configurar esta aplicación para admitir la autenticación en dos fases. @*@if (Model.TwoFactor) {
Habilitado []
} else {
[] Deshabilitado
}* @
```
  1. Vuelva a compilar la aplicación y vuelva a implementarla.

Para Visual Basic

  • ASP.Net Core (anteriormente ASP.NET 5) no admite Visual Basic.

Acciones sugeridas adicionales

  • Descargue las actualizaciones de la herramienta de Visual Studio directamente en:

  • Proteger su PC
    Seguimos animando a los clientes a seguir nuestra guía Proteger su equipo para habilitar un firewall, obtener actualizaciones de software e instalar software antivirus. Para obtener más información, consulte Microsoft Caja fuerte ty & Security Center.

  • Mantener actualizado el software de Microsoft
    Los usuarios que ejecutan software de Microsoft deben aplicar las últimas actualizaciones de seguridad de Microsoft para ayudar a asegurarse de que sus equipos estén lo más protegidos posible. Si no está seguro de si el software está actualizado, visite Microsoft Update, examine el equipo para ver las actualizaciones disponibles e instale las actualizaciones de alta prioridad que se le ofrecen. Si tiene habilitada y configurada la actualización automática para proporcionar actualizaciones para los productos de Microsoft, las actualizaciones se le entregan cuando se publican, pero debe comprobar que están instaladas.

Otra información

Comentarios

Soporte técnico

  • Los clientes de la Estados Unidos y Canadá pueden recibir soporte técnico del soporte técnico de soporte técnico. Para obtener más información, consulte Ayuda y soporte técnico de Microsoft.
  • Los clientes internacionales pueden recibir soporte técnico de sus subsidiarias locales de Microsoft. Para obtener más información, consulte Asistencia internacional.
  • Microsoft TechNet Security proporciona información adicional sobre la seguridad en los productos de Microsoft.

Declinación de responsabilidades

La información proporcionada en este aviso se proporciona "tal cual" sin garantía de ningún tipo. Microsoft renuncia a todas las garantías, ya sea expresas o implícitas, incluidas las garantías de comerciabilidad y idoneidad para un propósito determinado. En ningún caso, Microsoft Corporation o sus proveedores serán responsables de cualquier daño, incluyendo daños directos, indirectos, incidentales, consecuentes, pérdida de beneficios empresariales o daños especiales, incluso si Microsoft Corporation o sus proveedores han sido informados de la posibilidad de tales daños. Algunos estados no permiten la exclusión o limitación de responsabilidad por daños consecuenciales o incidentales, por lo que es posible que no se aplique la limitación anterior.

Revisiones

  • V1.0 (9 de febrero de 2016): Aviso publicado.
  • V1.1 (10 de febrero de 2016): aviso actualizado para incluir información de descarga para Microsoft ASP.NET Web Frameworks y Herramientas y Microsoft ASP.NET y Web Tools. Solo se trata de un cambio informativo.

Página generada 2016-02-19 14:36-08:00.