次の方法で共有


Microsoft セキュリティ アドバイザリ 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 は、影響を受ける ASP.NET プロジェクト テンプレートを使用して構築された Web アプリケーションに対するクロスサイト リクエスト フォージェリ (CSRF) 攻撃シナリオで使用できる、Visual Studio 2013 および Visual Studio 2015 のパブリック バージョンのセキュリティの脆弱性を認識しています。 Microsoft ASP.NET MVC5 および ASP.NET MVC6 プロジェクト テンプレートは、新しい Web アプリケーションのスターター テンプレートとしてソフトウェア開発者によって使用されます。

軽減要因

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

アドバイザリに関する FAQ

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

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

テンプレートの更新は、新しいアプリケーションにのみ影響します。 このため、Microsoft では、これらのテンプレートを使用して Web アプリケーションを構築した開発者に対して、「推奨されるアクション」セクションに記載されている即時アクションを実行して、Web アプリケーションが脆弱性にさらされた可能性を評価することを強くお勧めします。その後、そのセクションの回避策を使用して、脆弱性から保護するためにアプリケーションを更新するためのコード変更を行うことを強くお勧めします。

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

更新プログラム操作方法適用しますか?

  1. Visual Studio を起動します。
  2. [ツール] メニューの [拡張機能] と [更新] を選択します。
  3. 更新 ツリーを展開します。
  4. [製品更新で、次の 2 つのエントリを見つけます。
    • Microsoft ASP.NET and Web Tools
    • Microsoft ASP.NET Web フレームワークとツール
  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>
    
@(Model.電話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>
    
@(Model.電話Number ??"None") @if (Model.電話数値 != null) {
using (Html.BeginForm("Remove電話Number", "Manage", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() } } else { }
```
  1. アプリケーションを再コンパイルし、再デプロイします。

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.電話数値"なし")) [ @If (Model.電話数
Nothing) then @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>

アカウント設定を変更する


Password (パスワード):
@if (Model.HasPassword) { } else { }
外部ログイン:
@Model.Logins.Count [  管理  ]
電話番号:
電話番号は、2 要素認証の検証の 2 番目の要素として使用できます。 SMS を使用した 2 要素認証をサポートするようにこの ASP.NET アプリケーションを設定する方法の詳細については 、この記事 を参照してください。 @*@(Model.電話Number ??"None") @if (Model.電話数値 != null) {
[]
} else { }*@
2 要素認証:
2 要素認証プロバイダーは構成されません。 2 要素認証をサポートするようにこのアプリケーションを設定するには、この記事を参照してください。 @*@if (Model.TwoFactor) {
有効 []
} else {
[ 無効
}*@
```
  1. アプリケーションを再コンパイルし、再デプロイします。

Visual Basic の場合

  • ASP.Net Core (以前 ASP.NET 5) では、Visual Basic はサポートされていません。

その他の推奨されるアクション

  • Visual Studio ツールの更新プログラムを直接ダウンロードします。

  • PC を保護する
    ファイアウォールの有効化、ソフトウェア更新プログラムの取得、ウイルス対策ソフトウェアのインストールに関する Microsoft のコンピューター保護ガイダンスに従うことをお客様に引き続きお勧めします。 詳細については、「Microsoft セーフty & Security Center」を参照してください

  • Microsoft ソフトウェアを最新の状態に保つ
    Microsoft ソフトウェアを実行しているユーザーは、コンピューターが可能な限り保護されていることを確認するために、最新の Microsoft セキュリティ更新プログラムを適用する必要があります。 ソフトウェアが最新かどうかわからない場合は、Microsoft Update にアクセスし、コンピューターで利用可能な更新プログラムをスキャンし、提供されている優先度の高い更新プログラムをインストールします。 自動更新を有効にして、Microsoft 製品の更新プログラムを提供するように構成している場合、更新プログラムはリリース時に配信されますが、インストールされていることを確認する必要があります。

その他の情報

フィードバック

  • Microsoft のヘルプとサポートフォーム、カスタマー サービスのお問い合わせフォームに入力することで、 フィードバックを提供できます。

サポート

  • 米国およびカナダのお客様は、セキュリティ サポートからテクニカル サポート受けることができます。 詳細については、Microsoft のヘルプとサポートを参照してください
  • 海外のお客様は、現地の Microsoft 子会社からサポートを受けることができます。 詳細については、国際サポートを参照してください。
  • Microsoft TechNet Security は、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 ツールのダウンロード情報を含むようにアドバイザリが更新されました。 これは情報の変更のみです。

Page generated 2016-02-19 14:36-08:00.