CA2116: APTCA 메서드는 APTCA 메서드만 호출해야 합니다.

항목
RuleId CA2116
범주 Microsoft.Security
주요 변경 내용 주요 변경

원인

System.Security.AllowPartiallyTrustedCallersAttribute 특성이 있는 어셈블리의 메서드에서 해당 특성이 없는 어셈블리의 메서드를 호출합니다.

참고 항목

이 규칙은 더 이상 사용되지 않습니다. 자세한 내용은 사용되지 않는 규칙을 참조하세요.

규칙 설명

기본적으로 강력한 이름의 어셈블리에 있는 public 또는 protected 메서드는 완전 신뢰를 위한 링크 요청으로 암시적으로 보호됩니다. 완전히 신뢰할 수 있는 호출자만 강력한 이름의 어셈블리에 액세스할 수 있습니다. AllowPartiallyTrustedCallersAttribute(APTCA) 특성으로 표시된 강력한 이름의 어셈블리에는 이 보호가 없습니다. 이 특성은 링크 요청을 사용하지 않도록 설정하여 인트라넷이나 인터넷에서 실행되는 코드와 같이 완전 신뢰가 없는 호출자가 어셈블리에 액세스할 수 있도록 합니다.

완전히 신뢰할 수 있는 어셈블리에 APTCA 특성이 있고 이 어셈블리가 부분적으로 신뢰할 수 있는 호출자를 허용하지 않는 다른 어셈블리의 코드를 실행하는 경우 보안 익스플로잇이 가능합니다. 두 메서드 M1M2가 다음 조건을 충족하는 경우 악성 호출자는 M1 메서드를 사용하여 M2를 보호하는 암시적 완전 신뢰 링크 요청을 무시할 수 있습니다.

  • M1은 APTCA 특성이 있는, 완전히 신뢰할 수 있는 어셈블리에서 선언된 public 메서드입니다.

  • M1M1 어셈블리 외부에서 M2 메서드를 호출합니다.

  • M2 어셈블리에는 APTCA 특성이 없으므로 부분적으로 신뢰할 수 있는 호출자가 어셈블리를 실행하거나 호출자 대신 실행해서는 안 됩니다.

부분적으로 신뢰할 수 있는 호출자 XM1 메서드를 호출하여 M1M2를 호출하도록 할 수 있습니다. M2에는 APTCA 특성이 없으므로 직접 실행 호출자(M1)가 완전 신뢰를 위한 링크 요청을 충족해야 합니다. M1에는 완전 신뢰가 있으므로 이 검사를 충족합니다. X가 신뢰할 수 없는 호출자로부터 M2를 보호하는 링크 요청을 충족하는 데 참여하지 않으므로 보안상 위험합니다. 따라서 APTCA 특성이 있는 메서드는 해당 특성이 없는 메서드를 호출해서는 안 됩니다.

위반 문제를 해결하는 방법

APTCA 특성이 필요한 경우 요청을 사용하여 완전 신뢰 어셈블리를 호출하는 메서드를 보호합니다. 요청하는 정확한 권한은 메서드에서 노출하는 기능에 따라 달라집니다. 가능한 경우 완전 신뢰를 위한 요청으로 메서드를 보호하여 기본 기능이 부분적으로 신뢰할 수 있는 호출자에게 노출되지 않도록 합니다. 불가능한 경우 노출된 기능을 효과적으로 보호하는 권한 집합을 선택합니다.

경고를 표시하지 않는 경우

이 규칙의 경고를 안전하게 표시하지 않으려면 메서드에서 노출하는 기능을 통해 직접 또는 간접적으로 호출자가 안전하지 않은 방식으로 사용될 수 있는 중요한 정보, 작업 또는 리소스에 액세스할 수 없도록 해야 합니다.

예 1

다음 예제에서는 어셈블리 2개와 테스트 애플리케이션을 사용하여 이 규칙으로 검색된 보안 취약성을 보여 줍니다. 첫 번째 어셈블리에는 APTCA 특성이 없으므로 부분적으로 신뢰할 수 있는 호출자가 액세스할 수 없어야 합니다(이전 토론에서 M2로 표시됨).

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();
     }
   }
}

예 3

테스트 애플리케이션(이전 토론에서 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();
      }
   }
}

이 예제는 다음과 같은 출력을 생성합니다.

Demand for full trust:Request failed.
ClassRequiringFullTrust.DoWork was called.

참고 항목