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,您必須使用 [建議動作] 區段中所列的因應措施步驟,在您每次使用受影響的範本時手動更新您的應用程式。
如何? 套用更新嗎?
- 啟動 Visual Studio。
- 在 [工具] 功能表下,選擇 [擴充功能和 更新]。
- 展開 更新 樹狀結構。
- 在 [產品 更新 下找到下列兩個專案:
- Microsoft ASP.NET 與 Web 工具
- Microsoft ASP.NET Web Frameworks and Tools
- 選取每個更新,然後按兩下 [ 更新]。
建議的動作
下列因應措施資訊詳細說明您必須對從 ASP.NET 項目範本建立的現有應用程式所做的變更。
Visual Studio 2015 MVC 5 和 Visual Studio 2013 MVC 5
針對 C#
從 Controllers 目錄載入ManageController.cs。
搜尋 Remove 電話 Number() (第 199 行)。
沒有自訂的樣本程式代碼會顯示如下:
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 }); }
將 [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 }); }
從 Views/Manage 資料夾載入 Index.cshtml 檔案。
搜尋 <dt> 電話 Number:</dt> (第 40 行)
範本程式代碼,不含任何自定義專案,如下所示:
<dt>Phone Number:</dt>
變更檢視程式代碼以顯示,如下所示:
<dt>Phone Number:</dt>
using (Html.BeginForm(“Remove 電話 Number”, “Manage”, FormMethod.Post, new { @class = “form-horizontal”, role = “form” })) { @Html.AntiForgeryToken() } } else { }
- 重新編譯您的應用程式,然後重新部署它。
For Visual Basic
從 Controllers 目錄載入ManageController.cs。
搜尋 Remove 電話 Number() (第 164 行)。
範本程式代碼,不含任何自定義專案,如下所示:
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
將 HttpPost> 和 <ValidateAntiForgeryToken> 屬性新增至函式定義,使其顯示如下:<
<httppost>
從 Views/Manage 資料夾載入 Index.vbhtml 檔案。
搜尋 <dt> 電話 Number:</dt> (第 37 行)
範本程式代碼,不含任何自定義專案,如下所示:
<dt>Phone Number:</dt>
變更檢視程式代碼以顯示,如下所示:
<dt>Phone Number:</dt>
@ @Using Html.BeginForm(“Remove 電話 Number”, “Manage”, FormMethod.Post, New With {.class = “form-horizontal”, .role = “form”}) @Html.AntiForgeryToken @ End Using Else @ End If
- 重新編譯應用程式,然後重新部署它。
Visual Studio 2015 MVC 6
針對 C#
從 Controllers 目錄載入ManageController.cs。
搜尋 Remove 電話 Number () (行 178) 。
範本程式代碼,不含任何自定義專案,如下所示:
// 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 }); }
移除 [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 }); }
從 Views/Manage 資料夾載入 Index.cshtml 檔案。
完全取代檢視檔案,使其顯示如下:
@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 { }*@
- 重新編譯您的應用程式,然後重新部署它。
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 子公司獲得支援。 如需詳細資訊,請參閱國際支援。
- Microsoft TechNet 安全性 提供 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。