CA2116: APTCA メソッドは APTCA メソッドのみを呼び出すことができます
TypeName |
AptcaMethodsShouldOnlyCallAptcaMethods |
CheckId |
CA2116 |
[カテゴリ] |
Microsoft.Security |
互換性に影響する変更点 |
あり |
原因
System.Security.AllowPartiallyTrustedCallersAttribute 属性を持つアセンブリのメソッドが、この属性を持たないアセンブリのメソッドを呼び出しています。
規則の説明
既定で、厳密な名前を持つアセンブリのパブリック メソッドまたはプロテクト メソッドは、完全信頼の リンク確認要求 によって暗黙的に保護されているため、完全信頼の呼び出し元のみが厳密な名前のアセンブリにアクセスできます。AllowPartiallyTrustedCallersAttribute (APTCA) 属性でマークされた厳密な名前のアセンブリには、この保護がありません。この属性によってリンク確認要求が無効になり、イントラネットまたはインターネットからのコード実行など、アセンブリは完全信頼を持たない呼び出し元からもアクセスできるようになります。
APTCA 属性が完全信頼のアセンブリにあり、部分信頼の呼び出し元を許可しない別のアセンブリのコードをアセンブリが実行する場合、セキュリティ上の弱点になります。M1 と M2 という 2 つのメソッドが次の条件に適合する場合、悪意のある呼び出し元は、M1 メソッドを使用すると、M2 を保護する暗黙的な完全信頼のリンク確認要求を省略できます。
M1 が、APTCA 属性を持つ完全信頼のアセンブリで宣言されたパブリック メソッドである場合。
M1 が M1 のアセンブリ外にある M2 メソッドを呼び出す場合。
M2 のアセンブリに APTCA 属性がないため、部分信頼の呼び出し元またはその呼び出し元の代理によって実行できない場合。
部分信頼の呼び出し元 X は、M1 メソッドを呼び出すことで、M1 から M2 を呼び出すことができます。M2 には APTCA 属性がないため、直接の呼び出し元 (M1) は、完全信頼のリンク確認要求に適合する必要があります。M1 には完全信頼があるため、このチェックに適合します。X は、信頼されていない呼び出し元から M2 を保護するリンク確認要求の適合に加わっていないため、セキュリティ上のリスクがあります。したがって、APTCA 属性を持つメソッドから、属性を持たないメソッドは呼び出さないでください。
違反の修正方法
APCTA 属性が必要な場合、確認要求を使用して、完全信頼のアセンブリに呼び出すメソッドを保護します。要求する正確なアクセス許可は、メソッドで公開する機能によって変わります。可能であれば、完全信頼の確認要求でメソッドを保護することで、基になる機能が部分信頼の呼び出し元に公開されないようにします。可能でない場合、公開される機能を効果的に保護するアクセス許可を選択します。確認要求の詳細については、「確認要求」を参照してください。
警告を抑制する状況
この規則による警告を安全に抑制するには、破壊的な方法で使用できる重要な情報、操作、またはリソースに呼び出し元がアクセスすることを、使用しているメソッドで公開される機能によって直接的または間接的に許可しないようにします。
使用例
次の例では、2 つのアセンブリと 1 つのテスト アプリケーションを使用して、この規則で検出されるセキュリティ上の脆弱性を説明します。1 つ目のアセンブリ (上記の説明では M2) に APTCA 属性はなく、部分信頼の呼び出し元はアクセスできません。
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This code is compiled into a strong-named
// assembly that requires full trust and does
// not allow partially trusted callers.
namespace AptcaTestLibrary
{
public class ClassRequiringFullTrust
{
public static void DoWork()
{
Console.WriteLine("ClassRequiringFullTrust.DoWork was called.");
}
}
}
2 つ目のアセンブリ (上記の説明では M1) は完全信頼で、部分信頼の呼び出し元を許可しています。
using System;
using System.Security;
using System.Security.Permissions;
using System.Reflection;
// This assembly executes with full trust and
// allows partially trusted callers.
[assembly:AllowPartiallyTrustedCallers]
namespace AptcaTestLibrary
{
public class AccessAClassRequiringFullTrust
{
public static void Access()
{
// This security check fails if the caller
// does not have full trust.
NamedPermissionSet pset= new NamedPermissionSet("FullTrust");
// This try-catch block shows the caller's permissions.
// Correct code would either not catch the exception,
// or would rethrow it.
try
{
pset.Demand();
}
catch (SecurityException e)
{
Console.WriteLine("Demand for full trust:{0}", e.Message);
}
// Call the type that requires full trust.
// Violates rule AptcaMethodsShouldOnlyCallAptcaMethods.
ClassRequiringFullTrust.DoWork();
}
}
}
テストのアプリケーション (上記の説明では X) は、部分的に信頼されています。
using System;
using AptcaTestLibrary;
// If this test is run from the local computer, it gets full trust by default.
// Remove full trust.
[assembly:System.Security.Permissions.PermissionSetAttribute(
System.Security.Permissions.SecurityAction.RequestRefuse, Name="FullTrust")]
namespace TestSecLibrary
{
class TestApctaMethodRule
{
public static void Main()
{
// Indirectly calls DoWork in the full-trust class.
ClassRequiringFullTrust testClass = new ClassRequiringFullTrust();
testClass.Access();
}
}
}
この例を実行すると、次の出力が生成されます。
関連規則
CA2117: APTCA 型は APTCA 基本型のみを拡張することができます
参照
概念
部分的に信頼されているコードから .NET Framework アセンブリを呼び出すことができる