次の方法で共有


CA2109:表示するイベント ハンドラーを確認します

プロパティ
ルール ID CA2109
Title 表示するイベント ハンドラーを確認します
[カテゴリ] Security
修正が中断か中断なしであるか あり
.NET 8 では既定で有効 いいえ

原因

パブリックまたはプロテクトのイベント ハンドラー メソッドが検出されました。

注意

このルールは非推奨とされました。 最後に Microsoft.CodeAnalysis.NetAnalyzers 7.0.0 NuGet パッケージと .NET 7 SDK に付属しています。

アナライザーが警告した脅威 (特権イベント ハンドラーを特権イベント呼び出し元にフックする信頼されていない中間者) が、.NET Framework 4.5 以降存在していないため、ルールは削除されました。

規則の説明

外部から参照できるイベント処理メソッドは、レビューが必要なセキュリティ上の問題を示します。

絶対に必要な場合を除き、イベント処理メソッドを公開しないでください。 公開されたメソッドを呼び出すイベント ハンドラー、デリゲート型は、イベント シグネチャが一致する限り、任意のイベントに追加できます。 イベントは、任意のコードによって発生する可能性があり、ボタンのクリックなどのユーザー操作に応じて、信頼性の高いシステム コードによって頻繁に発生します。 イベント処理メソッドにセキュリティ チェックを追加しても、メソッドを呼び出すイベント ハンドラーがコードによって登録されるのを防ぐことはできません。

要求では、イベント ハンドラーによって呼び出されたメソッドを確実に保護することはできません。 セキュリティ要求は、呼び出し履歴の呼び出し元を調べることによって、信頼されていない呼び出し元からコードを保護するのに役立ちます。 イベント ハンドラーをイベントに追加するコードは、イベント ハンドラーのメソッドが実行されるときに、必ずしも呼び出し履歴に存在するとは限りません。 そのため、イベント ハンドラー メソッドが呼び出されたときに、呼び出し履歴に信頼性の高い呼び出し元しか存在しない可能性があります。 これにより、イベント ハンドラー メソッドによって行われた要求が成功します。 また、メソッドが呼び出されると、要求されたアクセス許可がアサートされる場合があります。 このような理由から、この規則の違反を修正しないというリスクは、イベント処理メソッドを確認した後にのみ評価することができます。 コードを確認するときは、次の点を考慮してください。

  • イベント ハンドラーは、アクセス許可のアサートやアンマネージド コードのアクセス許可の抑制など、危険または悪用可能な操作を実行しますか。

  • コードはいつでもスタック上で信頼性の高い呼び出し元のみを使用して実行できるため、コードに対するセキュリティ上の脅威はどのようなものですか。

違反の修正方法

この規則違反を修正するには、メソッドを確認し、次の内容を評価します。

  • イベント処理メソッドを非パブリックにすることはできますか。

  • すべての危険な機能をイベント ハンドラーから移動できますか。

  • セキュリティ要求が課された場合、他の方法でも実現できますか。

どのようなときに警告を抑制するか

この規則による警告を抑制するのは、セキュリティ レビューを慎重に行って、コードがセキュリティ上の脅威を引き起こさないことを確認してからです。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA2109
// The code that's violating the rule is on this line.
#pragma warning restore CA2109

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA2109.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

次のコードは、悪意のあるコードによって誤用される可能性のあるイベント処理メソッドを示しています。

public class HandleEvents
{
    // Due to the access level and signature, a malicious caller could 
    // add this method to system-triggered events where all code in the call
    // stack has the demanded permission.

    // Also, the demand might be canceled by an asserted permission.

    [SecurityPermissionAttribute(SecurityAction.Demand, UnmanagedCode = true)]

    // Violates rule: ReviewVisibleEventHandlers.
    public static void SomeActionHappened(Object sender, EventArgs e)
    {
        Console.WriteLine("Do something dangerous from unmanaged code.");
    }
}

関連項目