CA2138: 透過的メソッドは、SuppressUnmanagedCodeSecurity 属性を持つメソッドを呼び出してはならない
TypeName |
TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods |
CheckId |
CA2138 |
カテゴリ |
Microsoft.Security |
互換性に影響する変更点 |
あり |
原因
SuppressUnmanagedCodeSecurityAttribute 属性が適用されたメソッドを、透過的セキュリティ メソッドが呼び出します。
規則の説明
この規則は、P/Invoke (プラットフォーム呼び出し) 呼び出しを使用するなどの方法で、ネイティブ コードを直接呼び出す透過的メソッドに対して適用されます。 SuppressUnmanagedCodeSecurityAttribute 属性が設定された P/Invoke メソッドと COM 相互運用メソッドでは、呼び出し元のメソッドに対して LinkDemand が実行されます。 透過的セキュリティ コードは LinkDemands を満たすことができないため、SuppressUnmanagedCodeSecurity 属性が設定されたメソッドを呼び出すことも、SuppressUnmanagedCodeSecurity 属性が設定されたクラスのメソッドを呼び出すこともできません。 メソッドは失敗するか、要求がフル アクセス要求に変換されます。
この規則に違反すると、レベル 1 の透過的セキュリティ モデルでは MethodAccessException が発生し、レベル 1 の透過性モデルでは UnmanagedCode に対するフル アクセス要求が発生します。
違反の修正方法
この規則違反を修正するには、SuppressUnmanagedCodeSecurityAttribute 属性を削除し、SecurityCriticalAttribute 属性または SecuritySafeCriticalAttribute 属性をメソッドに適用する必要があります。
警告を抑制する状況
この規則による警告は抑制しないでください。
使用例
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class CallSuppressUnmanagedCodeSecurityClass
{
[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool Beep(uint dwFreq, uint dwDuration);
public void CallNativeMethod()
{
// CA2138 violation - transparent method calling a method marked with SuppressUnmanagedCodeSecurity
// (this is also a CA2149 violation as well, since this is a P/Invoke and not an interface call).
Beep(10000, 1);
}
}
}