マイクロソフト セキュリティ アドバイザリ 3137909

ASP.NET テンプレートの脆弱性により改ざんが起こる

公開日:2016 年 2 月 10 日 | 最終更新日:2016 年 2 月 12 日

バージョン: 1.1

概要

マイクロソフトは、公開されたバージョンの Visual Studio 2013、Visual Studio 2015、ASP.NET MVC5、ASP.NET MVC6 の脆弱性に関する情報を提供するためにこのセキュリティ アドバイザリをリリースしています。このアドバイザリは、開発者が作成したコントロールやコンポーネントがこの脆弱性の影響を受けないようにするためのガイダンスも提供します。

マイクロソフトは、公開されているバージョンの Visual Studio 2013 および Visual Studio 2015 の脆弱性を認識しています。この脆弱性が、影響を受ける ASP.NET プロジェクト テンプレートを使用して構築された Web アプリケーションに対するクロスサイト リクエスト フォージェリ (CSRF) 攻撃のシナリオで利用される可能性があります。Microsoft ASP.NET MVC5 および ASP.NET MVC6 プロジェクト テンプレートは、新しい Web アプリケーションのスターター テンプレートとして、ソフトウェア開発者に使用されています。

問題を緩和する要素

  • 2 要素認証 (2FA) は、作成されたアプリケーションでは既定で有効になりません。開発者が、ユーザーの電話番号に基づく 2FA を有効にしていない場合、電話番号が削除された場合のセキュリティの影響はありません。

アドバイザリの「よく寄せられる質問」

攻撃者はこの脆弱性をどのように悪用する可能性がありますか?
攻撃者は、クロスサイト リクエスト フォージェリ (CSRF) を使用して、脆弱なテンプレートを使用して作成された Web アプリケーションに要求を送信し、認証されたユーザーの電話番号を ASP.NET ID データベースから削除する可能性があります。脆弱性が悪用されると、電話番号に依存している 2 要素認証 (2FA) メカニズムが削除されます。ユーザーのパスワードは影響を受けません。

この更新プログラムは何を修正しますか?
この更新プログラムは、MVC5 および MVC6 用の Visual Studio 2015 ASP.NET プロジェクト テンプレートを修正します。

このテンプレートは、新しいアプリケーションにのみ影響します。このため、マイクロソフトは、Web アプリケーションを作成した開発者にこれらのテンプレートを使用して「推奨するアクション」に記載された対処方法を直ちに実行することを推奨します。開発者は、Web アプリケーションが脆弱性の危険にさらされるかどうかを評価した上で、脆弱性から保護するため、記載されている回避策を使用してコードの変更とアプリケーションの更新を行ってください。

Visual Studio 2013 を実行している場合は、「推奨するアクション」に記載された回避策の手順を使用して、影響を受けるテンプレートを使用するたびにアプリケーションを手動で更新する必要があります。

更新プログラムの適用方法

  1. Visual Studio を起動します。
  2. [ツール] メニューの [拡張機能と更新プログラム] をクリックします。
  3. [更新プログラム] ツリーを展開します。
  4. [製品の更新プログラム] で次の 2 つのエントリを見つけます。
    • Microsoft ASP.NET と Web ツール
    • Microsoft ASP.NET Web フレームワークとツール
  5. 各更新プログラムを選択し、[更新] をクリックします。

推奨するアクション

次の回避策情報は、ASP.NET プロジェクト テンプレートから作成された既存のアプリケーション対して実行が必要な変更の詳細です。

Visual Studio 2015 MVC 5 および Visual Studio 2013 MVC 5 C# の場合

  1. Controllers ディレクトリから ManageController.cs を読み込みます。
  2. RemovePhoneNumber() (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> 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>Phone Number:</dt> (40 行目) を検索します。
  7. カスタマイズしていないテンプレート コードは次のように表示されます。

     <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. 表示コードを次のように変更します。

     <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. アプリケーションを再コンパイルして再展開します。

Visual Basic の場合

  1. Controllers ディレクトリから ManageController.cs を読み込みます。
  2. RemovePhoneNumber() (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>
         <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. Views/Manage フォルダーから Index.cshtml ファイルを読み込みます。

  6. <dt>Phone Number:</dt> (37 行目) を検索します。
  7. カスタマイズしていないテンプレート コードは次のように表示されます。

                 <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. 表示コードを次のように変更します。

                 <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. アプリケーションを再コンパイルして再展開します。

Visual Studio 2015 MVC 6 C# の場合

  1. Controllers ディレクトリから ManageController.cs を読み込みます。
  2. RemovePhoneNumber() (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> 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>
     <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>
    
                     電話番号は、2 要素認証の検証の 2 番目の要素として使用できます。
                     SMS を使用する 2 要素認証をサポートするこの ASP.NET アプリケーションを設定する詳細については、
                     <a href="http://go.microsoft.com/fwlink/?LinkID=532713">この資料</a>を参照してください。
    
                 @*@(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>
    
                     2 要素認証プロバイダーが構成されていません。
                     2 要素認証をサポートするようにこのアプリケーションをセットアップするには、<a href="http://go.microsoft.com/fwlink/?LinkID=532713">この資料</a>
                    を参照してください。
    
                 @*@if (Model.TwoFactor)
                     {
                         <form asp-controller="Manage" asp-action="DisableTwoFactorAuthentication" method="post" class="form-horizontal" role="form">
                             Enabled [<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. アプリケーションを再コンパイルして再展開します。

Visual Basic の場合

  • ASP.Net Core (以前の ASP.NET 5) は、Visual Basic をサポートしません。

追加の推奨されるアクション

  • Visual Studio ツールの更新版をダウンロードする
  • コンピューターを守る

    マイクロソフトは、お客様が引き続き、「コンピューターを守る」のガイダンスに従い、ファイアウォールを有効にし、すべてのソフトウェアの更新を適用し、ウイルス対策ソフトウェアをインストールすることを推奨しています。詳細については、Microsoft セーフティとセキュリティ センターをご覧ください。

  • マイクロソフトのソフトウェアを最新の状態に保つ
    マイクロソフトのソフトウェアをお使いのお客様は、最新のマイクロソフトのセキュリティ更新プログラムを適用してください。これは、お使いのコンピューターが可能な限り保護されることを手助けするものです。ご使用のソフトウェアが最新のものかどうか定かでない場合、Microsoft Update で、利用可能な更新プログラムがあるかどうかに関してコンピューターをスキャンし、提供されている優先度の高い更新プログラムをインストールしてください。自動更新が有効で、マイクロソフト製品用の更新プログラムが提供されるよう設定されている場合は、新しい更新プログラムがご利用可能になった時点で自動的に提供されます。しかし、更新プログラムが正しくインストールされているかどうかをご確認いただく必要があります。

関連情報

フィードバック

サポート

免責

この文書に含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation およびその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation およびその関連会社は、本文書に含まれている情報の使用および使用結果につき、正確性、真実性など、いかなる表明・保証も行いません。Microsoft Corporation、その関連会社およびこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社およびこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含むすべての損害に対して、状況のいかんを問わず一切責任を負いません。結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。

更新履歴

  • V1.0 (2016/02/10): アドバイザリを公開しました。
  • V1.1 (2016/02/12): アドバイザリを更新し、Microsoft ASP.NET Web Frameworks とツールおよび Microsoft ASP.NET と Web ツールのダウンロード情報を追記しました。これは、情報のみの更新です。

Page generated 2016-02-11 11:15-08:00.