セキュリティの警告
セキュリティ警告は、より安全なライブラリとアプリケーションをサポートします。この警告によって、プログラムにセキュリティ上の欠陥が含まれるのを防ぐことができます。この警告のいずれかを無効にする場合、明確にコードに理由を記載し、開発プロジェクトの指定されたセキュリティ管理者にも報告します。
このセクションの内容
規則 |
Description |
---|---|
メソッドに渡された文字列引数から構築された文字列を使用して System.Data.IDbCommand.CommandText プロパティが設定されています。この規則では、文字列引数にユーザー入力が含まれていることが想定されています。ユーザー入力から構築された SQL コマンド文字列には、SQL 注入攻撃に対する脆弱性があります。 |
|
アセンブリ内の RuntimeCompatibilityAttribute でマークされていないメンバーまたは RuntimeCompatibility(WrapNonExceptionThrows = false) でマークされているメンバーには、System.Exception を処理する catch ブロックがあり、その直後に汎用 catch ブロックはありません。 |
|
メソッドが強制セキュリティを使用しています。また、そのメソッドで、確認要求がアクティブな場合でも変更できるステータス情報または戻り値を使用して、アクセス許可を構築している可能性があります。できる限り、宣言セキュリティを使用します。 |
|
外部から参照できる型に、変更可能な参照型である、外部から参照可能な読み取り専用のフィールドがあります。変更可能な型とは、インスタンス データを変更できる型です。 |
|
配列を含むフィールドに読み取り専用 (Visual Basic では ReadOnly) 修飾子を適用すると、そのフィールドで参照先の配列を変更できません。ただし、読み取り専用フィールドに格納された配列の要素は変更できます。 |
|
メソッドによってアクセス許可がアサートされますが、呼び出し元に対してセキュリティ チェックが実行されていません。セキュリティ チェックを実行せずにセキュリティ アクセス許可をアサートすると、悪用される可能性があるセキュリティの弱点がコード内に残る場合があります。 |
|
PermitOnly メソッドと CodeAccessPermission.Deny セキュリティ アクションは、.NET Framework のセキュリティについて高度な知識を持っている場合にのみ使用してください。コードにこのセキュリティ アクションを使用する場合、セキュリティを再確認する必要があります。 |
|
パブリックまたはプロテクトの値型が、データ アクセスまたはリンク確認要求で保護されています。 |
|
パブリックまたはプロテクトのイベント ハンドラー メソッドが検出されました。イベント ハンドラー メソッドは、絶対に必要な場合を除き公開しないでください。 |
|
ポインターがプライベート、内部、読み取り専用のいずれでもありません。悪意のあるコードで、ポインターの値が変更される可能性があります。結果的に、メモリの任意の位置にアクセスされたり、アプリケーション エラーやシステム障害の原因になります。 |
|
パブリック型またはプロテクト型に、パブリック フィールドが含まれ、リンク確認要求で保護されています。リンク確認要求で保護されている型のインスタンスに対するアクセス権がコードにある場合、その型のフィールドにアクセスするためにリンク確認要求に適合する必要はありません。 |
|
メソッドでは、同じアクションについて、メソッド レベルと型レベルの宣言セキュリティの両方を指定することはできません。 |
|
この規則では、アンマネージ コードでまだ使用されているのに、アンマネージ リソースが終了されたときに発生する可能性のあるエラーを検出します。 |
|
APTCA (AllowPartiallyTrustedCallers) 属性が完全に信頼されたアセンブリにあり、部分的に信頼された呼び出し元を許可しない別のアセンブリのコードをアセンブリが実行する場合、セキュリティ上の弱点になります。 |
|
APTCA (AllowPartiallyTrustedCallers) 属性が完全に信頼されたアセンブリにあり、アセンブリの型が部分的に信頼された呼び出し元を許可しない型から継承する場合、セキュリティ上の弱点になります。 |
|
COM 相互運用機能またはプラットフォーム呼び出し機能を使用するアンマネージ コードを実行するメンバーの場合、SuppressUnmanagedCodeSecurityAttribute によって、既定のセキュリティ システムの動作が変わります。この属性は、主にパフォーマンスを向上するために使用されますが、パフォーマンスが向上するとセキュリティ上のリスクも高くなります。 |
|
継承可能なパブリック型により、internal (Visual Basic では Friend) インターフェイスのオーバーライド可能なメソッド実装が提供されます。この規則違反を修正するには、アセンブリの外側でメソッドがオーバーライドされないようにします。 |
|
この型には、System.Runtime.Serialization.SerializationInfo オブジェクトおよび System.Runtime.Serialization.StreamingContext オブジェクトを使用するコンストラクター (シリアル化コンストラクターのシグネチャ) があります。このコンストラクターはセキュリティ チェックで保護されていませんが、型に含まれる標準コンストラクターの 1 つ以上は保護されています。 |
|
システムで静的コンストラクターが呼び出されてから、型の最初のインスタンスが作成されるか、静的メンバーが参照されます。静的コンストラクターがプライベートである場合、システム以外のコードから呼び出すことができます。コンストラクターで実行される操作によっては、これによって予期しない動作が発生することがあります。 |
|
パブリック メンバーまたはプロテクト メンバーはリンク確認要求を含み、セキュリティ チェックを実行しないメンバーから呼び出されています。リンク確認要求では、直接の呼び出し元のアクセス許可しかチェックされません。 |
|
この規則は、メソッドをその基本メソッド (別の型のインターフェイスまたは仮想メソッド) とマッチングし、それぞれについてリンク確認要求を比較します。この規則に違反すると、悪意のある呼び出し元が、保護されていないメソッドを呼び出すだけで、リンク確認要求を省略できます。 |
|
パブリック メソッドまたはプロテクト メソッドに try/finally ブロックが含まれています。この finally ブロックはセキュリティの状態をリセットすると思われますが、それ自体が finally ブロックで囲まれていません。 |
|
シールされていないパブリックな型がリンク確認要求によって保護され、オーバーライド可能なメソッドを持っています。その型またはメソッドが継承確認要求によって保護されていません。 |
|
完全に透過的なアセンブリにクリティカルなコードを含めることはできません。この規則では、完全に透過的なアセンブリを分析し、型、フィールド、およびメソッドのレベルで注釈の SecurityCritical を検出します。 |
|
この規則では、完全に透過的なアセンブリまたは透過的/クリティカル混在のアセンブリ内のすべてのメソッドと型を分析し、宣言的または強制的に使用されている Assert にフラグを設定します。 |
|
SecurityTransparentAttribute でマークされたメソッドが、SecurityCritical とマークされたパブリックでないメンバーを呼び出しています。この規則では、透過的/クリティカル混在のアセンブリ内のすべてのメソッドと型を分析し、透過的なコードからパブリックでないセキュリティ クリティカルなコードへの呼び出しのうち SecurityTreatAsSafe が適用されていないものにフラグが設定されます。 |
実行時に検索の必要がない値がコンパイラのインライン定数に設定されているため、定数値に対して透過性は適用されません。透過的なコードからは定数にアクセスできないとコード レビューアーが考えることがないよう、定数フィールドは透過的セキュリティなフィールドとして定義する必要があります。 |
|
---|---|
データ型は型の等価性に関与し、型自身、または型のメンバーあるいはフィールドが、SecurityCriticalAttribute 属性でマークされます。この規則は、すべての重要な型、または型の等価性に関与する重要なメソッドあるいはフィールドが定義されたすべての型に対して適用されます。こうした型が CLR によって検出されると、CLR による型の読み込みが失敗し、実行時に TypeLoadException が発生します。通常は、tlbimp やコンパイラによって型の等価性を実装するのではなく、ユーザーが手動で実装した場合に、この規則が適用されます。 |
|
SecurityCriticalAttribute でマークされている型およびメンバーを Silverlight アプリケーション コードで使用することはできません。セキュリティが重要な型やメンバーは、.NET Framework for Silverlight クラス ライブラリの信頼されているコードからのみ使用できます。派生クラスにおけるパブリックな構築または保護された構築の透過性は、基本クラスと同程度以上である必要があるため、アプリケーション内のクラスを、SecurityCritical としてマークされたクラスから派生させることはできません。 |
|
この警告は、SecurityCriticalAttribute でマークされているデリゲートを、透過的メソッドまたは SecuritySafeCriticalAttribute でマークされているメソッドにバインドするメソッドに対して適用されます。この警告は、透過的なデリゲートまたはセーフ クリティカルなデリゲートを、クリティカル メソッドにバインドするメソッドに対しても適用されます。 |
|
この規則は、SecurityCriticalAttribute でマークされているメソッドが、透過的メソッドまたは SecuritySafeCriticalAttribute でマークされているメソッドをオーバーライドするときに適用されます。また、透過的メソッドまたは SecuritySafeCriticalAttribute が適用されたメソッドが、SecurityCriticalAttribute が適用されたメソッドをオーバーライドした場合も、この規則が適用されます。この規則は、仮想メソッドをオーバーライドする場合やインターフェイスを実装する場合に適用されます。 |
|
LinkDemands は、レベル 2 のセキュリティ規則セットでは使用が推奨されていません。LinkDemands を使用して Just-In-Time (JIT) コンパイル時にセキュリティを適用するのではなく、メソッド、型、およびフィールドに SecurityCriticalAttribute 属性を設定します。 |
|
透過性属性は、大きいスコープのコード要素から小さいスコープの要素に適用されます。大きいスコープのコード要素の透過性属性は、最初の要素に含まれているコード要素の透過性属性よりも優先されます。たとえば、SecurityCriticalAttribute 属性でマークされたクラスに SecuritySafeCriticalAttribute 属性でマークされたメソッドを含めることはできません。 |
|
メソッドに検証できないコードが含まれているか、メソッドから参照渡しで型が返されます。この規則は、透過的セキュリティ コードが、検証できない MSIL (Microsoft Intermediate Language) を実行しようとすると適用されます。ただし、規則には完全な IL 検証ツールは含まれていないため、代わりにヒューリスティックを使用して、ほとんどの MSIL 検証違反が検出されます。 |
|
CA2138: 透過的メソッドは、SuppressUnmanagedCodeSecurity 属性を持つメソッドを呼び出してはならない |
SuppressUnmanagedCodeSecurityAttribute 属性が適用されたメソッドを、透過的セキュリティ メソッドが呼び出します。 |
CA2139: 透過的メソッドは、HandleProcessCorruptingExceptions 属性を使用してはならない |
この規則は、HandleProcessCorruptedStateExceptionsAttribute 属性を使用してプロセス破損状態例外を処理しようとする、すべての透過的メソッドに対して適用されます。プロセス破損状態例外は、CLR バージョン 4.0 に分類される例外です (AccessViolationException など)。HandleProcessCorruptedStateExceptionsAttribute 属性はセキュリティ クリティカルなメソッドでのみ使用できる属性で、透過的メソッドに適用された場合は無視されます。 |
SecurityCriticalAttribute 属性が適用されたコード要素は、セキュリティ上重要になります。透過的なメソッドでセキュリティ上重要な要素を使用することはできません。透過データ型でセキュリティ上重要な型を使用しようとすると、TypeAccessException、MethodAccessException、FieldAccessException のいずれかの例外が発生します。 |
|
透過的メソッドは、AllowPartiallyTrustedCallersAttribute (APTCA) 属性が適用されていないアセンブリ内のメソッドを呼び出します。また、透過的セキュリティ メソッドは、データ型またはメソッドに対する LinkDemand の要件を満たします。 |
|
この規則は、アクセスするために LinkDemands を要求する透過的メソッドに対して適用されます。透過的セキュリティ コードでは、操作のセキュリティ検証を行うことができないため、アクセス許可を要求できません。 |
|
透過的セキュリティ コードでは、操作のセキュリティ検証を行うことができないため、アクセス許可を要求できません。透過的セキュリティ コードは、フル アクセス要求を使用して、セキュリティ上の決定を行う必要があります。セーフ クリティカルなコードでは、透過的なコードを使用してフル アクセス要求を行うことはできません。 |
|
透過的なコードはセキュリティ上重要な操作を実行できないため、透過的なコードのセキュリティ レビューは、クリティカル コードのセキュリティ レビューほど完全ではありません。バイト配列から読み込まれるアセンブリは透過的なコード内で認識されない場合がありますが、監査を必要とする、クリティカルなコード、またはさらに重要であるセーフ クリティカルなコードがそのバイト配列に含まれる可能性があります。 |
|
CA2145: 透過的メソッドを SuppressUnmanagedCodeSecurityAttribute で修飾してはならない |
SuppressUnmanagedCodeSecurityAttribute 属性で修飾されたメソッドには、それを呼び出すメソッドに対して適用される暗黙的な LinkDemand があります。この LinkDemand では、呼び出し元のコードがセキュリティ クリティカルなコードである必要があります。SuppressUnmanagedCodeSecurity を使用するメソッドに SecurityCriticalAttribute 属性を設定すると、メソッドの呼び出し元に対してこの要件がより明確になります。 |
派生型に透過的セキュリティ属性が設定されていて、この属性が基本型または実装されたインターフェイスほど重要ではない場合に、この規則が適用されます。クリティカルな基本型から派生したり、クリティカルなインターフェイスを実装したりできるのは、クリティカルなデータ型だけです。また、セーフ クリティカルな基本型から派生したり、セーフ クリティカルなインターフェイスを実装したりできるのは、クリティカルまたはセーフ クリティカルなデータ型だけです。 |
|
SecurityTransparentAttribute とマークされたコードには、アサートに必要なアクセス許可が付与されません。 |
|
この規則は、P/Invoke などを使用してネイティブ コードを直接呼び出すすべての透過的メソッドに対して適用されます。この規則に違反すると、レベル 2 の透過性モデルで MethodAccessException が発生し、レベル 1 の透過性モデルで UnmanagedCode に対するフル アクセス要求が発生します。 |