セキュリティ更新プログラム MS14-059 によって ASP.NET MVC のビルドに問題が生じる

こんにちは。d99 です。
今回は下記 blog の日本語参考訳を掲載します。

Microsoft Asp.Net MVC Security Update MS14-059 broke my build!
https://blogs.msdn.com/b/webdev/archive/2014/10/16/microsoft-asp-net-mvc-security-update-broke-my-build.aspx

------

先日マイクロソフトは新しいセキュリティ更新プログラム(MS14-059)をリリースしました。本更新プログラムは、Microsoft Update を使用するよう構成された環境に対して自動的に適用されます。該当のセキュリティ更新プログラムに関する情報はこちらです: https://technet.microsoft.com/ja-jp/library/security/ms14-059

残念ながら、本更新プログラムの適用によって、ASP.NET MVC3, 4 を使用した Web アプリケーションプロジェクトで、ビルドに失敗するようになります。失敗する際のエラーは以下の通りです(MVC4 の場合)。

アセンブリが見つかりませんでした"System.Web.Mvc,Version=4.0.0.0、Culture=neurtral,
PublicKeyToken=31bf3856ad364e35、processorArchitecture=MSIL

このエラーは、該当のプロジェクトがグローバルアセンブリキャッシュ(GAC)にあるアセンブリを参照する際に発生します。セキュリティ更新プログラムによって System.Web.Mvc.dll のアセンブリ バージョンがインクリメントされたために、プロジェクトの System.Web.Mvc.dll への参照が解決できなくなりました。

本問題を解決するためには次のいずれかの対処を実施します。

  1. (推奨) NuGET ギャラリーから Microsoft.ASPNET.MVC パッケージをインストールします(これによって当該アプリケーションの web.config に bindingRedirect要素が書き込まれます)。NuGet パッケージ マネージャーを操作するか、または Visual Studio の NuGet コンソールから以下のコマンドを実行します。

    >Install-Package Microsoft.AspNet.Mvc -Version <バージョン> -Project <プロジェクト名>
    ※ MVC 4 のバージョンは 4.0.40804.0、MVC 3 のバージョンは 3.0.50813.1 となります
     

  2. 手動で System.Web.MVC.dll への参照を更新します(この際、GAC 内の dll を参照しないようご注意ください)。参照を一旦削除し、Visual Studio で [参照の追加] – [アセンブリ] ->[拡張] にて Sysytem.Web.Mvc を選択します。バージョンが 4.0.0.1 となっている事をご確認ください。

どちらの場合でも、[参照設定] で System.Web.mvc.dll の [ローカル コピー] プロパティが true に設定されている事を確認してください。これによって、アプリケーションをデプロイできるよう、アセンブリがbin フォルダーに格納されます。なお、NuGet には [ローカルコピー] のプロパティをリセットしてしまうという問題があります。ご注意ください: https://nuget.codeplex.com/workitem/4344

Visual Studio 2012 以前の MVC プロジェクトテンプレートでは、System.Web.MVC.dll アセンブリを GAC またはアセンブリ参照のフォルダーのいずれかから参照していました。最新の MVC テンプレートは、NuGet パッケージのインストールによってアセンブリへの参照を追加しています。これが、対処策 1. が推奨の理由です。現在 NuGet ギャラリーの使用は一般的かと存じます。

なお、Visual Studio 2010 を使用して ASP.NET MVC3 プロジェクトを作成した場合も、同様の現象が発生する場合があります。これは該当のセキュリティ更新プログラムに関する情報にも以下の通り記載されています:

MVC 3.0 RTM がシステムにインストールされている状態で、更新プログラムをシステムにインストールしたところ、 Visual Studio 2010 で新しいプロジェクトを作成できなくなりました。この問題を解決する方法を教えてください。 Visual Studio 2010 用の ASP.NET MVC 3.0 テンプレートは、参照アセンブリ フォルダーにインストールされているアセンブリに依存します。MVC 3.0 用アセンブリの更新されたバージョンがインクリメントされるので、テンプレートが機能しなくなります。この問題を解決するには、Visual Studio 2010 用の MVC 3.0.1 ツール更新をインストールします。 

なぜアセンブリのバージョンをインクリメントしたかですが、これは既にサーバーに配置されているサードパーティ製 Web アプリケーションをセキュリティの脅威から守るためです。この場合、脆弱性のあるアセンブリはGAC に格納されている場合があり、そのアプリケーションでもセキュリティで保護されたアセンブリを実行させるためには、アセンブリのバージョンをインクリメントし、GAC に配置されたアセンブリも更新する必要がありました。

また、一部の ASP.NET MVC5 プロジェクトでも、本事象に関連した影響を受ける可能性があります。Visual Studio にて Web アプリケーションを実行した際に、次のようなエラーが発生する場合があります。

コンパイラエラーメッセージ : CS0234: 型または名前空間名 'Ajax' は名前空間 'System.Web.Mvc' に存在しません。アセンブリ参照が不足しています。

これは、System.Web.Mvc.dll アセンブリの参照設定で [ローカル コピー] が前述の NuGet の問題にてリセットされている可能性が高いです。

この場合、アセンブリがアプリケーションと共に配置されません。Visual Studio では、GAC にインストールされているアセンブリに対しては [ローカル コピー] を既定で false に設定します。次の MSDN ドキュメントを参照してください:

https://msdn.microsoft.com/ja-jp/library/vstudio/vslangproj.reference.copylocal.aspx
https://msdn.microsoft.com/ja-jp/library/ez524kew%28VS.80%29.aspx

この問題を修正するには、手動で [ローカル コピー] を true に変更してください。

最後に、ASP.NET MVC 4 アプリケーションが次のようなエラーを表示する場合があります。

ファイルまたはアセンブリを読み込めませんでした 'Newtonsoft.Json 、バージョン 4.5.0.0 Culture=Neutral PublicKeyToken=30ad4fe6b2a6aeed' またはその依存関係の 1 つ。

これは、セキュリティ更新プログラムによって更新されたバージョン固有の問題ではなく、ASP.NET MVC アセンブリが GAC にインストールされている場合に発生します。その場合、Newtonsoft.Json.dll アセンブリを解決することができません。アプリケーションのアセンブリ探索パス(bin フォルダーまたはそれと同等のフォルダー) にアセンブリをコピーする事で本問題を解決できます。Newtonsoft.Json 4.5.6 を NuGet ギャラリーからインストールできます。

------

以上、参考になれば幸いです。

ではまた。
d99でした。