Советы по безопасности Майкрософт 3137909

Уязвимости в шаблонах ASP.NET могут разрешить изменение

Опубликовано: 9 февраля 2016 г. | Обновлено: 10 февраля 2016 г.

Версия: 1.1

Краткий обзор

Корпорация Майкрософт выпускает эти рекомендации по безопасности, чтобы предоставить сведения об уязвимости в общедоступных версиях Visual Studio 2013, Visual Studio 2015, ASP.NET MVC5 и ASP.NET MVC6. Эта рекомендация также содержит рекомендации по тому, что разработчики могут сделать, чтобы гарантировать, что созданные элементы управления и компоненты не подвержены уязвимости.

Корпорация Майкрософт знает об уязвимости безопасности в общедоступных версиях Visual Studio 2013 и Visual Studio 2015, которые могут использоваться в сценарии атаки на межсайтовые запросы (CSRF) для веб-приложений, созданных с помощью затронутых шаблонов проектов ASP.NET. Шаблоны проектов Microsoft ASP.NET MVC5 и ASP.NET MVC6 используются разработчиками программного обеспечения в качестве начальных шаблонов для новых веб-приложений.

Смягчающие факторы

  • Двухфакторная проверка подлинности (2FA) по умолчанию не включена в созданных приложениях. Если разработчик не включил 2FA на основе телефонного номера пользователя, то при удалении номера телефона нет влияния на безопасность.

Вопросы и ответы о рекомендациях

Как злоумышленник может воспользоваться уязвимостью?
Злоумышленник может использовать перекрестную подделку запросов (CSRF) для отправки запроса веб-приложению, созданному с помощью уязвимых шаблонов, а затем удалить номер телефона прошедшего проверку подлинности пользователя из базы данных удостоверений ASP.NET. Результат эксплойтированного уязвимости удаляет любой двухфакторный механизм проверки подлинности (2FA), основанный на телефонном номере. Пароль пользователя не затрагивается.

Что делает обновление?
Обновление исправляет шаблоны проектов Visual Studio 2015 ASP.NET для MVC5 и MVC6.

Обновления шаблона влияют только на новые приложения. По этой причине корпорация Майкрософт настоятельно рекомендует разработчикам, которые создали веб-приложения с помощью этих шаблонов, принять немедленные меры, перечисленные в разделе "Предлагаемые действия ", чтобы оценить их веб-приложения для воздействия на уязвимость, а затем использовать обходные пути в этом разделе, чтобы внести изменения в код для обновления приложений, чтобы защитить их от уязвимых.

Если вы используете Visual Studio 2013, необходимо использовать действия по обходным решениям, перечисленным в разделе "Предлагаемые действия ", чтобы обновлять приложения вручную при каждом использовании затронутых шаблонов.

Разделы справки применить обновление?

  1. Запустите среду Visual Studio.
  2. В меню "Сервис" выберите "Расширения" и Обновления.
  3. Разверните дерево Обновления.
  4. В разделе Product Обновления найдите следующие две записи:
    • Microsoft ASP.NET и веб-инструменты
    • Microsoft ASP.NET Web Frameworks and Tools
  5. Выберите каждое обновление и нажмите кнопку "Обновить".

Предлагаемые действия

Следующие сведения об обходных решениях содержат изменения, которые необходимо внести в существующие приложения, созданные на основе шаблонов проектов ASP.NET.

Visual Studio 2015 MVC 5 и Visual Studio 2013 MVC 5
Для C#

  1. В каталоге "Контроллеры" загрузите ManageController.cs.

  2. Поиск по запросу Remove Телефон Number() (строка 199).

  3. Код шаблона без каких-либо настроек будет отображаться следующим образом:

     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. Добавьте атрибуты [HttpPost] и [ValidateAntiForgeryToken] в определение функции, чтобы код отображал следующее:

     [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. В папке Views/Manage загрузите файл Index.cshtml.

  6. Поиск dt <>Телефон Number:</dt> (Строка 40)

  7. Код шаблона без каких-либо настроек отображается следующим образом:

     <dt>Phone Number:</dt>
    
@(Модель. Телефон Number ?? "Нет") [ @if (Model.ТелефонNumber != null) { @Html.ActionLink("Change", "Add Телефон Number") @:  | |  @Html.ActionLink("Remove", "Remove Телефон Number") } else { @Html.ActionLink("Add", "Add Телефон Number") } ]
```
  1. Измените код представления следующим образом:

     <dt>Phone Number:</dt>
    
@(Модель. Телефон Number ?? "Нет") @if (Model.ТелефонNumber != null) {
using (Html.BeginForm("Remove Телефон Number", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() } else { }
```
  1. Перекомпилируйте приложение и повторно разверните его.

Для Visual Basic

  1. В каталоге "Контроллеры" загрузите ManageController.cs.

  2. Выполните поиск по запросу Remove Телефон Number() (строка 164).

  3. Код шаблона без каких-либо настроек отображается следующим образом:

         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. <Добавьте атрибуты HttpPost> и <ValidateAntiForgeryToken> в определение функции, чтобы они отображались следующим образом:

         <httppost>
    
  1. В папке Views/Manage загрузите файл Index.vbhtml.

  2. Поиск dt <>Телефон Number:</dt> (Строка 37)

  3. Код шаблона без каких-либо настроек отображается следующим образом:

                 <dt>Phone Number:</dt>
    
@(If(Model.ТелефонNumber, "None")[ @If (Model.ТелефонНомер
Ничего) Затем @Html.ActionLink("Change", "Add Телефон Number") @:  | |  @Html.ActionLink("Remove", "Remove Телефон Number") Else @Html.ActionLink("Add", "Add Телефон Number") End If ]
```
  1. Измените код представления следующим образом:

                 <dt>Phone Number:</dt>
    
@(If(Model.ТелефонЧисло, "Нет")) @If (Model.ТелефонНомер
Ничего) Тогда @
@ @Using Html.BeginForm("Remove Телефон Number", "Manage", FormMethod.Post, New With {.class = "form-horizontal", .role = "form"}) @Html.AntiForgeryToken @ End Using Else @ End If
```
  1. Перекомпилируйте приложение, а затем повторно разверните его.

Visual Studio 2015 MVC 6
Для C#

  1. В каталоге "Контроллеры" загрузите ManageController.cs.

  2. Выполните поиск по запросу Remove Телефон Number() (строка 178).

  3. Код шаблона без каких-либо настроек отображается следующим образом:

     // 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. Удалите атрибут [HttpGet], а затем добавьте атрибуты [HttpPost] и [ValidateAntiForgeryToken] в определение функции, чтобы код отображал следующее:

      [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. В папке Views/Manage загрузите файл Index.cshtml.

  6. Полностью замените файл представления следующим образом:

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

@ViewData["StatusMessage"]

    <div>

Изменение параметров учетной записи


Пароль:
@if (Model.HasPassword) { } else { }
Внешние имена входа:
@Model.Logins.Count [  Управление  ]
Номер телефона:
Телефон Числа могут использоваться в качестве второго фактора проверки в двухфакторной проверке подлинности. Дополнительные сведения о настройке этого приложения ASP.NET для поддержки двухфакторной проверки подлинности с помощью SMS см . в этой статье . @*@(Модель. Телефон Number ?? "Нет") @if (Model.ТелефонNumber != null) {
[]
} else { }* @
Двухфакторная проверка подлинности:
Не настроены поставщики двухфакторной проверки подлинности. См . эту статью , чтобы настроить это приложение для поддержки двухфакторной проверки подлинности. @*@if (Model.TwoFactor) {
Включено []
} else {
[] Отключен
}* @
```
  1. Перекомпилируйте приложение и повторно разверните его.

Для Visual Basic

  • ASP.Net Core (ранее ASP.NET 5) не поддерживает Visual Basic.

Дополнительные предлагаемые действия

  • Скачайте обновления средства Visual Studio непосредственно по адресу:

  • Защита компьютера
    Мы продолжаем поощрять клиентов следовать нашим рекомендациям по защите компьютера для включения брандмауэра, получения обновлений программного обеспечения и установки антивирусного программного обеспечения. Дополнительные сведения см. в центре безопасности Майкрософт Сейф ty и безопасности.

  • Обновление программного обеспечения Майкрософт
    Пользователи, работающие под управлением программного обеспечения Майкрософт, должны применять последние обновления системы безопасности Майкрософт, чтобы убедиться, что их компьютеры защищены как можно скорее. Если вы не уверены, обновлено ли ваше программное обеспечение, посетите Центр обновления Майкрософт, проверьте компьютер на наличие доступных обновлений и установите все обновления с высоким приоритетом, предлагаемые вам. Если вы включили автоматическое обновление и настроили для предоставления обновлений для продуктов Майкрософт, обновления доставляются вам при их выпуске, но убедитесь, что они установлены.

Другие сведения

Feedback

  • Вы можете предоставить отзыв, выполнив форму справки и поддержки Майкрософт, обратитесь к нам в службу поддержки клиентов.

Поддержка

  • Клиенты в США и Канаде могут получать техническую поддержку от службы поддержки безопасности. Дополнительные сведения см. в справке и поддержке Майкрософт.
  • Международные клиенты могут получать поддержку от своих местных дочерних компаний Майкрософт. Дополнительные сведения см. в статье "Международная поддержка".
  • Microsoft TechNet Security предоставляет дополнительные сведения о безопасности в продуктах Майкрософт.

Заявление об отказе

Сведения, предоставленные в этом совете, предоставляются "как есть" без каких-либо гарантий. Корпорация Майкрософт отказывается от всех гарантий, явных или подразумеваемых, включая гарантии торговых возможностей и соответствия определенной цели. В любом случае корпорация Майкрософт или ее поставщики не несут ответственности за любые убытки, включая прямые, косвенные, случайные, косвенные, косвенные, следовательно, потерю прибыли или специальные убытки, даже если корпорация Майкрософт или ее поставщики были уведомлены о возможности таких повреждений. Некоторые государства не разрешают исключение или ограничение ответственности за последующие или случайные убытки, поэтому не может применяться ограничение.

Редакции

  • Версия 1.0 (9 февраля 2016 г.): рекомендации, опубликованные.
  • Версия 1.1 (10 февраля 2016 г.): рекомендации по добавлению сведений о скачивании для веб-платформ Microsoft ASP.NET и средств и средств, а также microsoft ASP.NET и веб-инструментов. Это только информационное изменение.

Страница создана 2016-02-19 14:36-08:00.