サービス拒否Denial of Service

サービス拒否は、メッセージを処理できなくしたり、メッセージ処理を大幅に遅延させたりするなど、システムに過大な負荷が生じた場合に発生します。Denial of service occurs when a system is overwhelmed in such a way that messages cannot be processed, or they are processed extremely slowly.

過度のメモリ消費Excess Memory Consumption

一意のローカル名、名前空間、またはプレフィックスを大量に含んだ XML ドキュメントを読み込むと、問題が発生する場合があります。A problem can occur when reading an XML document with a large number of unique local names, namespaces, or prefixes. XmlReader から派生したクラスを使用している場合、LocalNamePrefix、または NamespaceURI のいずれかのプロパティが項目ごとに呼び出され、それによって返された文字列が NameTable に追加されます。If you are using a class that derives from XmlReader, and you call either the LocalName, Prefix or NamespaceURI property for each item, the returned string is added to a NameTable. NameTable が保持するコレクションのサイズは決して減ることがありません。その結果、文字列ハンドルの実質的な "メモリ リーク" が発生する場合があります。The collection held by the NameTable never decreases in size, creating a virtual "memory leak" of the string handles.

回避事項を次に示します。Mitigations include:

  • NameTable からの派生クラスを作成し、最大サイズのクォータを指定しますDerive from the NameTable class and enforce a maximum size quota. (NameTable の使用を回避したり、サイズが上限に達したときに NameTable を切り替えたりすることはできません)。(You cannot prevent the use of a NameTable or switch the NameTable when it is full.)

  • 可能であれば、前述のプロパティを使用せずに、MoveToAttribute メソッドと IsStartElement メソッドを使用します。これらのメソッドでは、文字列が返されないため、NameTable コレクションがあふれてしまう問題を回避できます。Avoid using the properties mentioned and instead use the MoveToAttribute method with the IsStartElement method where possible; those methods do not return strings and thus avoid the problem of overfilling the NameTable collection.

悪質なクライアントにより過度のライセンス要求がサービスに送信されるMalicious Client Sends Excessive License Requests to Service

悪質なクライアントが過度のライセンス要求を実行してサービスを攻撃する場合、サーバーは過度のメモリを使用することになります。If a malicious client bombards a service with excessive license requests, it can cause the server to use excessive memory.

軽減策:LocalServiceSecuritySettingsクラスの次のプロパティを使用します。Mitigation: Use the following properties of the LocalServiceSecuritySettings class:

  • MaxCachedCookies : SecurityContextToken または SPNego ネゴシエーションの後にサーバーがキャッシュする、期限付きの SSL の最大数を制御します。MaxCachedCookies: controls the maximum number of time-bounded SecurityContextTokens that the server caches after SPNego or SSL negotiation.

  • IssuedCookieLifetime : SecurityContextTokens または SPNego ネゴシエーションに続いてサーバーが発行する SSL の有効期限を制御します。IssuedCookieLifetime: controls the lifetime of the SecurityContextTokens that the server issues following SPNego or SSL negotiation. サーバーは、この期間の SecurityContextToken をキャッシュします。The server caches the SecurityContextTokens for this period of time.

  • MaxPendingSessions: サーバーで確立されているが、そのアプリケーション メッセージが処理されていない、セキュリティで保護されたメッセージ交換の最大数を制御します。MaxPendingSessions: controls the maximum number of secure conversations that are established at the server but for which no application messages have been processed. このクォータは、クライアントが、セキュリティで保護されたメッセージ交換をサービスで確立しないようにします。それによって、サービスはクライアントごとの状態を保持できますが、それらの状態を使用することはありません。This quota prevents clients from establishing secure conversations at the service, thereby causing the service to maintain state per client, but never using them.

  • InactivityTimeout : サービスが、セキュリティで保護されたメッセージ交換を、その当事者のクライアントからのアプリケーション メッセージを受信しなくても確立したままにする最長時間を制御します。InactivityTimeout: controls the maximum time the service keeps a secure conversation alive without receiving an application message from the client for the conversation. このクォータは、クライアントが、セキュリティで保護されたメッセージ交換をサービスで確立しないようにします。それによって、サービスはクライアントごとの状態を保持できますが、それらの状態を使用することはありません。This quota prevents clients from establishing secure conversations at the service, thereby causing the service to maintain state per client, but never using them.

WSDualHttpBinding または二重カスタム バインディングにクライアント認証が必要になるWSDualHttpBinding or Dual Custom Bindings Require Client Authentication

既定では、WSDualHttpBinding のセキュリティは有効になっています。By default, the WSDualHttpBinding has security enabled. ただし、ClientCredentialType プロパティを None に設定してクライアント認証を無効にすると、第 3 のサービスで悪質なユーザーからサービス拒否攻撃を受ける可能性があります。It is possible, however, that if the client authentication is disabled by setting the ClientCredentialType property to None, a malicious user can cause a denial of service attack on a third service. これは、悪質なクライアントが、メッセージ ストリームを第 3 のサービスに送信するようサービスに指示できるためです。This can occur because a malicious client can direct the service to send a stream of messages to a third service.

これを防ぐには、このプロパティを None に設定しないようにします。To mitigate this, do not set the property to None. 二重メッセージ パターンを持つカスタム バインディングを作成する場合もこの可能性があることに注意してください。Also be aware of this possibility when creating a custom binding that has a dual message pattern.

監査イベント ログがいっぱいになる可能性があるAuditing Event Log Can Be Filled

悪意のあるユーザーに監査が有効になっていることを知られると、その攻撃者に監査エントリの書き込みにつながる無効なメッセージを送信される可能性があります。If a malicious user understands that auditing is enabled, that attacker can send invalid messages that cause audit entries to be written. このような方法で監査ログに書き込みが行われると、監査システムに障害が発生します。If the audit log is filled in this manner, the auditing system fails.

これを防ぐには、SuppressAuditFailure プロパティを true に設定し、イベント ビューアーのプロパティを使用して監査動作を制御します。To mitigate this, set the SuppressAuditFailure property to true and use the properties of the Event Viewer to control the auditing behavior. イベントビューアーを使用してイベントログを表示および管理する方法の詳細については、「イベントビューアー」を参照してください。For more information about using the Event Viewer to view and manage event logs, see Event Viewer. 詳細については、「監査」を参照してください。For more information, see Auditing.

Iauthorizationpolicy インターフェイスの無効な実装により、サービスが応答しなくなる可能性がありますInvalid Implementations of IAuthorizationPolicy Can Cause Service to Become Unresponsive

インターフェイスの障害のある実装に対してメソッドを呼び出すと、サービスが応答しなくなる可能性があります。Evaluate IAuthorizationPolicyCalling the Evaluate method on a faulty implementation of the IAuthorizationPolicy interface can cause the service to become unresponsive.

軽減策:信頼されたコードのみを使用します。Mitigation: Use only trusted code. つまり、ユーザーが記述しテストしたコード、または信頼されたプロバイダーが提供するコードのみを使用します。That is, use only code that you have written and tested, or that comes from a trusted provider. 十分な検討を行わずに、IAuthorizationPolicy の信頼されない拡張をユーザーのコードに接続することを許可しないでください。Do not allow untrusted extensions of IAuthorizationPolicy to be plugged into your code without due consideration. これは、サービスの実装で使用されるすべての拡張に当てはまります。This applies to all extensions used in a service implementation. WCF では、アプリケーションコードと、拡張ポイントを使用して接続されている外部コードを区別しません。WCF does not make any distinction between application code and foreign code that is plugged in using extensibility points.

Kerberos の最大トークン サイズの変更が必要になる場合があるKerberos Maximum Token Size May Need Resizing

クライアントが多数のグループ (実際の数はグループにより異なるが、約 900) に属している場合、メッセージ ヘッダーのブロックが 64 KB を超えると問題が発生する場合があります。If a client belongs to a large number of groups (approximately 900, although the actual number varies depending on the groups), a problem may occur when a message header's block exceeds 64 kilobytes. この場合、Microsoft サポートの記事で説明されているように、Kerberos トークンの最大サイズを増やすことができます。「Internet Explorer kerberos 認証は、IIS に接続しているバッファーが不足しているため機能しません」という記事に記載されています。In that case, you can increase the maximum Kerberos token size, as described in the Microsoft Support article "Internet Explorer Kerberos authentication does not work because of an insufficient buffer connecting to IIS." また、より大きな Kerberos トークンに対応するために、WCF メッセージの最大サイズを増やす必要がある場合もあります。You may also need to increase the maximum WCF message size to accommodate the larger Kerberos token.

自動登録によってコンピューターに同一サブジェクト名の証明書が複数発生するAutoenrollment Results in Multiple Certificates with Same Subject Name for Machine

自動登録は、証明Windows Server 2003Windows Server 2003書用にユーザーとコンピューターを自動的に登録する機能です。Autoenrollment is the capability of Windows Server 2003Windows Server 2003 to automatically enroll users and computers for certificates. この機能が有効になっているドメイン上にコンピューターがある場合、新しいコンピューターがネットワークに参加するたびに、クライアント認証を目的とする X.509 証明書が自動的に作成されローカル コンピューターの個人用証明書のストアに自動で挿入されます。When a machine is on a domain with the feature enabled, an X.509 certificate with the intended purpose of client authentication is automatically created and inserted into the local computer's Personal certificates store whenever a new machine is joined to the network. ただし、自動登録では、キャッシュに作成されたすべての証明書に同じサブジェクト名が使用されます。However, autoenrollment uses the same subject name for all certificates it creates in the cache.

影響として、自動登録を使用しているドメインで WCF サービスが開けないことがあります。The impact is that WCF services may fail to open on domains with autoenrollment. コンピューターの完全修飾ドメイン ネーム システム (DNS) 名を持つ証明書が複数あるため、既定サービスの X.509 資格情報検索の条件が不明確になり、このような問題が発生します。This occurs because the default service X.509 credential search criteria might be ambiguous because multiple certificates with the machine's fully qualified Domain Name System (DNS) name exist. この場合、1 つは自動登録で作成された証明書、もう 1 つは自己発行された証明書です。One certificate originates from autoenrollment; the other might be a self-issued certificate.

これを軽減するには、 <serviceCredentials >でより正確な検索条件を使用して、使用する証明書を正確に参照します。To mitigate this, reference the exact certificate to use by using a more precise search criterion on the <serviceCredentials>. たとえば、FindByThumbprint オプションを使用し、一意の拇印 (ハッシュ) により証明書を指定します。For example, use the FindByThumbprint option, and specify the certificate by its unique thumbprint (hash).

自動登録機能の詳細については、「 Windows Server 2003 での証明書の自動登録」を参照してください。For more information about the autoenrollment feature, see Certificate Autoenrollment in Windows Server 2003.

複数の代替サブジェクト名の最後が承認に使用されるLast of Multiple Alternative Subject Names Used for Authorization

まれなケースとして X.509 証明書に複数の代替サブジェクト名が含まれる場合、その代替サブジェクト名を使用して承認を行うと、承認は失敗する場合があります。In the rare case when an X.509 certificate contains multiple alternative subject names, and you authorize using the alternative subject name, authorization may fail.

ACL を使用して構成ファイルを保護するProtect Configuration Files with ACLs

CardSpace で発行されたトークンのコードおよび構成ファイルで、必須および省略可能な要求を指定できます。You can specify required and optional claims in code and configuration files for CardSpace issued tokens. これにより、対応する要素が、セキュリティ トークン サービスに送信される RequestSecurityToken メッセージに送出されます。This results in corresponding elements being emitted in RequestSecurityToken messages that are sent to the security token service. 攻撃者は、コードまたは構成を変更して必須またはオプションのクレームを削除でき、対象サービスへのアクセスが許可されていないトークンをセキュリティ トークン サービスに発行させることができます。An attacker can modify code or configuration to remove required or optional claims, potentially getting the security token service to issue a token that does not allow access to the target service.

軽減するには:構成ファイルを変更するには、コンピューターへのアクセスが必要です。To mitigate: Require access to the computer to modify the configuration file. アクセス制御リスト (ACL: Access Control List) を使用して構成ファイルをセキュリティで保護します。Use file access control lists (ACLs) to secure configuration files. WCF では、このようなコードが構成から読み込まれる前に、そのコードをアプリケーションディレクトリまたはグローバルアセンブリキャッシュに配置する必要があります。WCF requires that code be in the application directory or the global assembly cache before it will allow such code to be loaded from configuration. ディレクトリの ACL を使用してディレクトリをセキュリティで保護します。Use directory ACLs to secure directories.

1 つのサービスに対して、セキュリティで保護されたセッションが最大数に達するMaximum Number of Secure Sessions for a Service Is Reached

クライアントがサービスにより正常に認証され、セキュリティで保護されたセッションがサービスと共に確立されると、クライアントがセッションをキャンセルするか、セッションの期限が切れるまで、サービスはそのセッションを追跡します。When a client is successfully authenticated by a service and a secure session is established with the service, the service keeps track of the session until the client cancels it or the session expires. セッションが確立されるたびに、1 つのサービスで同時にアクティブにできるセッションは上限に近づいていきます。Every established session counts against the limit for the maximum number of active simultaneous sessions with a service. この上限に達した場合、1 つ以上のアクティブなセッションが期限切れになるかまたはクライアントによりキャンセルされるまで、そのサービスで新しいセッションの作成を試みるクライアントは拒否されます。When this limit is reached, clients that attempt to create a new session with that service are rejected until one or more active sessions expire or are canceled by a client. クライアントは 1 つのサービスで複数のセッションを保持できますが、その各セッションは上限に反映されます。A client can have multiple sessions with a service, and each one of those sessions counts toward the limit.

注意

ステートフルなセッションを使用する場合、前の段落は適用されません。When you use stateful sessions, the previous paragraph does not apply. ステートフルセッションの詳細については、「」を参照してください。セキュリティで保護されたセッションのセキュリティコンテキストトークンを作成します。For more information about stateful sessions, see How to: Create a Security Context Token for a Secure Session.

これを防ぐには、SecurityBindingElement クラスの SecurityBindingElement プロパティを設定して、アクティブなセッションの最大数とセッションの最長有効期間の制限を設定します。To mitigate this, set the limit for the maximum number of active sessions and the maximum lifetime for a session by setting the SecurityBindingElement property of the SecurityBindingElement class.

関連項目See also