Microsoft Security Advisory 3137909

ASP.NET 範本中的弱點可能會允許竄改

發佈時間: 2016 年 2 月 9 日 |更新日期:2016年2月10日

版本: 1.1

執行摘要

Microsoft 即將發行此安全性諮詢,以提供 Visual Studio 2013、Visual Studio 2015、ASP.NET MVC5 和 ASP.NET MVC6 公用版本中弱點的相關信息。 此諮詢也會提供開發人員可執行哪些動作的指引,以協助確保其所建置的控件和元件不受弱點影響。

Microsoft 知道 Visual Studio 2013 和 Visual Studio 2015 公用版本中的安全性弱點,這些弱點可用於跨網站要求偽造 (CSRF) 攻擊案例中,針對使用受影響 ASP.NET 專案範本所建置的 Web 應用程式。 軟體開發人員會使用 Microsoft ASP.NET MVC5 和 ASP.NET MVC6 專案範本作為新 Web 應用程式的入門範本。

緩和因素

  • 任何產生的應用程式中預設不會啟用雙因素驗證 (2FA)。 如果開發人員尚未根據使用者的電話號碼啟用 2FA,則移除電話號碼時不會對安全性造成任何影響。

諮詢常見問題

攻擊者如何利用弱點?
攻擊者可以使用跨網站偽造要求(CSRF)將要求傳送給使用易受攻擊範本產生的 Web 應用程式,然後從 ASP.NET 身分識別資料庫移除已驗證使用者的電話號碼。 惡意探索弱點的結果會移除依賴電話號碼的任何雙因素驗證 (2FA) 機制。 用戶的密碼不會受到影響。

更新有何用途?
此更新會更正 MVC5 和 MVC6 的 Visual Studio 2015 ASP.NET 項目範本。

範本更新只會影響新的應用程式。 基於這個理由,Microsoft 強烈建議使用這些範本建置 Web 應用程式的開發人員立即採取行動,並列在 [建議動作 ] 區段中,評估其 Web 應用程式以暴露在弱點中,然後使用該區段中的因應措施進行程式代碼變更,以更新其應用程式,以保護它們免於易受攻擊。

如果您執行 Visual Studio 2013,您必須使用 [建議動作] 區段中所列的因應措施步驟,在您每次使用受影響的範本時手動更新您的應用程式。

如何? 套用更新嗎?

  1. 啟動 Visual Studio。
  2. 在 [工具] 功能表下,選擇 [擴充功能和 更新]。
  3. 展開 更新 樹狀結構。
  4. [產品 更新 下找到下列兩個專案:
    • Microsoft ASP.NET 與 Web 工具
    • Microsoft ASP.NET Web Frameworks and Tools
  5. 選取每個更新,然後按兩下 [ 更新]。

建議的動作

下列因應措施資訊詳細說明您必須對從 ASP.NET 項目範本建立的現有應用程式所做的變更。

Visual Studio 2015 MVC 5 和 Visual Studio 2013 MVC 5
針對 C#

  1. 從 Controllers 目錄載入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 ??“None”) [ @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 ??“None”) @if (Model.電話Number != null) {
using (Html.BeginForm(“Remove 電話 Number”, “Manage”, FormMethod.Post, new { @class = “form-horizontal”, role = “form” })) { @Html.AntiForgeryToken() } } else { }
```
  1. 重新編譯您的應用程式,然後重新部署它。

For Visual Basic

  1. 從 Controllers 目錄載入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.電話數量
Nothing) 然後@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.電話number, “None”)) @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. 從 Controllers 目錄載入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 ??“None”) @if (Model.電話Number != null) {
[]
} else { }*@
雙因素驗證:
未設定雙因素驗證提供者。 請參閱 本文 ,以設定此應用程式以支援雙因素驗證。 @*@if (Model.TwoFactor) {
已開啟 []
} else {
[] 已停用
}*@
```
  1. 重新編譯您的應用程式,然後重新部署它。

For Visual Basic

  • ASP.Net Core (先前 ASP.NET 5) 不支援 Visual Basic。

其他建議的動作

  • 直接在下列位置下載 Visual Studio 工具更新:

  • 保護您的電腦
    我們繼續鼓勵客戶遵循我們的「保護您的計算機」指引,以啟用防火牆、取得軟體更新,以及安裝防病毒軟體。 如需詳細資訊,請參閱 Microsoft 保管庫 ty & 資訊安全中心

  • 讓 Microsoft 軟體更新保持更新
    執行 Microsoft 軟體的使用者應套用最新的 Microsoft 安全性更新,以協助確保電腦盡可能受到保護。 如果您不確定您的軟體是否為最新狀態,請造訪 Microsoft Update、掃描您的電腦是否有可用的更新,並安裝您提供的任何高優先順序更新。 如果您已啟用自動更新並設定為提供 Microsoft 產品的更新,則更新會在發行時傳遞給您,但您應該確認它們已安裝。

其他資訊

Feedback

  • 您可以完成 Microsoft 說明及支援表單、客戶服務與我們連絡以提供意見反應。

支援

免責聲明

本諮詢中提供的資訊是「如目前」提供,不含任何種類的擔保。 Microsoft 不表示明示或隱含的所有擔保,包括適銷性及適合特定用途的擔保。 任何情況下,Microsoft Corporation 或其供應商都不得承擔任何損害責任,包括直接、間接、附帶、衍生性、業務利潤損失或特殊損害,即使 Microsoft Corporation 或其供應商已獲告知可能遭受此類損害。 某些州不允許排除或限制衍生性或附帶性損害的責任,因此可能不適用上述限制。

修訂記錄

  • V1.0 (2016 年 2 月 9 日):已發佈諮詢。
  • V1.1(2016 年 2 月 10 日):已更新諮詢,以包含 Microsoft ASP.NET Web Framework 的下載資訊,以及工具和 Microsoft ASP.NET 和 Web 工具。 這隻是參考性變更。

頁面產生的 2016-02-19 14:36-08:00。