多くのフォーム キー、ファイル、または JSON ペイロード メンバーを含む ASP.NET 要求が例外が発生して失敗する

適用対象: .NET Framework 3.5 Service Pack 1Windows 7 Service Pack 1Windows 7 Enterprise

概要


Microsoft セキュリティ更新プログラム MS11-100 は、HTTP 要求内のフォーム キー、ファイル、および JSON メンバーの最大数を 1000 に制限します。この変更のために、ASP.NET アプリケーションは、1000 を超えるこれらの要素を含む要求を拒否します。このような種類の要求を実行する HTTP クライアントは拒否され、Web ブラウザーにエラー メッセージが表示されます。このエラー メッセージには通常 HTTP 500 ステータス コードが含まれています。この新しい制限は、アプリケーションごとに構成できます。構成手順については、「解決方法」を参照してください。


現象


数多くのフォーム キー、ファイル、または JSON ペイロードを含む ASP.NET 要求を実行すると、サーバーからエラー応答を受け取ります。サーバーのアプリケーション ログには、ASP.NET の特定のバージョンであるソース、およびイベント ID 1309 を含む警告エントリが記録されます。イベント ログには、次のいずれかのメッセージが含まれています。


メッセージ 1:
アプリケーション情報:
    アプリケーション ドメイン: /LM/W3SVC/1/ROOT/<アプリケーション ドメイン>
    信頼レベル: 中
    アプリケーションの仮想パス: <VDIR パス>
    アプリケーションのパス: <アプリケーションのパス>
コンピューター名:<コンピューター名>
プロセス情報:
    プロセス ID: 0001
    プロセス名: w3wp.exe
    アカウント名: IIS APPPOOL\DefaultAppPool

例外情報:
例外の種類: HttpException
    例外メッセージ: URL にエンコードされたフォーム データが有効ではありません。
  System.Web.HttpRequest.FillInFormCollection()
   System.Web.HttpRequest.get_Form()
   System.Web.HttpRequest.get_HasForm()
   System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
   System.Web.UI.Page.DeterminePostBackMode()
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 


メッセージ 2:
アプリケーション情報:
    アプリケーション ドメイン: /LM/W3SVC/1/ROOT/<アプリケーション ドメイン>
    信頼レベル: 中
    アプリケーションの仮想パス: <VDIR パス>
    アプリケーションのパス: <アプリケーションのパス>
    コンピューター名:<コンピューター名>

プロセス情報:
    プロセス ID: 0001
    プロセス名: w3wp.exe
    アカウント名: IIS APPPOOL\DefaultAppPool

例外情報:
例外の種類: InvalidOperationException
    例外メッセージ: オブジェクトの現在の状態に問題があるため、操作は有効ではありません。
   System.Web.HttpRequest.FillInFilesCollection()
   System.Web.HttpRequest.get_Files()
   FileUpload.Page_Load(Object sender, EventArgs e)
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   System.Web.UI.Control.OnLoad(EventArgs e)
   System.Web.UI.Control.LoadRecursive()
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint

メッセージ 3:
アプリケーション情報:
    アプリケーション ドメイン: /LM/W3SVC/1/ROOT/<アプリケーション ドメイン>
    信頼レベル: 中
    アプリケーションの仮想パス: <VDIR パス>
    アプリケーションのパス: <アプリケーションのパス>
    コンピューター名:<コンピューター名>

プロセス情報:
    プロセス ID: 0001
    プロセス名: w3wp.exe
    アカウント名: IIS APPPOOL\DefaultAppPool

例外情報:
例外の種類: InvalidOperationException
    例外メッセージ: オブジェクトの現在の状態に問題があるため、操作は有効ではありません。
   System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
   System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
   System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
   System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
   System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
   Failing.Page_Load(Object sender, EventArgs e)
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   System.Web.UI.Control.OnLoad(EventArgs e)
   System.Web.UI.Control.LoadRecursive()
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 


IIS のログ ファイルに次のようなエントリが表示されます。
2011-01-01 00:00:00 ::1 POST /machine/default.aspx - 80 - ::1 - 500 0 0 187




原因


セキュリティ情報 MS11-100 が提供するマイクロソフトセキュリティ更新プログラムは、ASP.NET が要求で受け入れるフォーム キー、ファイル、および JSON メンバーの既定の最大数を 1,000 に変更します。この変更は、マイクロソフトセキュリティ情報 MS11-100 に記載されているサービス拒否攻撃に関する脆弱性を解決するために行われました。


解決方法


フォーム キーまたはファイルのこの制限に達するアプリケーションの場合は、ASP.NET アプリケーションの構成ファイル内で ASP.NET appSetting aspnet:MaxHttpCollectionKeys を下に示すように変更できます。この設定により、「現象」に記載されているエラー メッセージ 1 およびエラー メッセージ 2 が解決します。
<configuration>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="1000" />
</appSettings>
</configuration>


注: x86 ベースのシステムで ASP.NET 1.1 を使用している場合は、DWORD 値を次のレジストリ キーに追加することによって設定が調整されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys
x64 ベースのシステムで ASP.NET 1.1 を使用している場合は、DWORD 値を次のレジストリ キーに追加することによって設定が調整されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0\MaxHttpCollectionKeys



JSON ペイロードのこの制限に達するアプリケーションの場合は、ASP.NET アプリケーションの構成ファイル内で ASP.NET appSetting aspnet:MaxJsonDeserializerMembers を下に示すように変更できます。この設定により、「現象」に記載されているエラー メッセージ 3 が解決します。
<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>



注: この値を既定の設定から増やすと、セキュリティ情報 MS11-100 に記載されているサービス拒否に関するサーバーの脆弱性が悪化します。


関連情報


セキュリティ情報 MS11-100 の詳細については、次の TechNet の資料を参照してください。詳細については、以下のサポート技術情報番号をクリックしてください。
2638420 [MS11-100] .NET Framework の脆弱性により、特権が昇格される (2011 年 12 月 29 日)