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

適用先
.NET Framework 3.5 Service Pack 1 Windows 7 Service Pack 1 Windows 7 Enterprise Windows 7 Professional Windows 7 Ultimate Windows 7 Home Premium Windows 7 Home Basic Windows Server 2008 R2 Service Pack 1 Windows Server 2008 R2 Standard Windows Server 2008 R2 Enterprise Windows Server 2008 R2 Datacenter Windows Server 2008 Service Pack 2 Windows Server 2008 for Itanium-Based Systems Windows Server 2008 Datacenter Windows Server 2008 Enterprise Windows Server 2008 Standard Windows Server 2008 Web Edition Windows Vista Service Pack 2 Windows Vista Business Windows Vista Enterprise Windows Vista Home Basic Windows Vista Home Premium Windows Vista Starter Windows Vista Ultimate Windows Vista Enterprise 64-bit Edition Windows Vista Home Basic 64-bit Edition Windows Vista Home Premium 64-bit Edition Windows Vista Ultimate 64-bit Edition Windows Vista Business 64-bit Edition Microsoft Windows Server 2003 Service Pack 2 Microsoft Windows XP Professional x64 Edition Microsoft Windows XP Service Pack 3 Microsoft Windows XP Home Edition Microsoft Windows XP Professional

概要

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

現象

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

メッセージ 1:

アプリケーション情報:
アプリケーション ドメイン: /LM/W3SVC/1/ROOT/<App ドメイン>
信頼レベル: 中
アプリケーション仮想パス: <VDIR パス>
Application Path: <App Path>
マシン名: <Machine Name>
プロセス情報:
プロセス ID: 0001
プロセス名: w3wp.exe
アカウント名: IIS APPPOOL\DefaultAppPool

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

メッセージ 2:

アプリケーション情報:
アプリケーション ドメイン: /LM/W3SVC/1/ROOT/<App ドメイン>
信頼レベル: 中
アプリケーション仮想パス: <VDIR パス>
Application Path: <App Path>
マシン名: <Machine Name>

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

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

メッセージ 3:

アプリケーション情報:
アプリケーション ドメイン: /LM/W3SVC/1/ROOT/<App ドメイン>
信頼レベル: 中
アプリケーション仮想パス: <VDIR パス>
Application Path: <App Path>
マシン名: <Machine Name>

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

例外情報:
例外の種類: InvalidOperationException
例外メッセージ: オブジェクトの現在の状態のため、操作は無効です。
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
at System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
at Failing.Page_Load(Object sender, EventArgs e)
at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
at 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 の記事を参照してください。

マイクロソフト セキュリティ情報 MS11-100 - 重大 詳細については、以下の「サポート技術情報」 (Microsoft サポート技術情報) をクリックしてください。

2638420 MS11-100: .NET Framework の脆弱性により特権の昇格が発生する可能性がある: 2011 年 12 月 29 日