다음을 통해 공유


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

TypeName

AptcaMethodsShouldOnlyCallAptcaMethods

CheckId

CA2116

범주

Microsoft.Security

변경 수준

주요 변경

원인

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

규칙 설명

기본적으로 강력한 이름을 가진 어셈블리의 public 또는 protected 메서드는 완전 신뢰 링크 요청에 의해 암시적으로 보호됩니다. 완전 신뢰 호출자만 강력한 이름의 어셈블리에 액세스할 수 있습니다. APTCA(AllowPartiallyTrustedCallersAttribute) 특성으로 표시된 강력한 이름의 어셈블리에는 이러한 보호 기능이 없습니다. 이 특성을 사용하면 링크 요청이 사용되지 않으므로 인트라넷 또는 인터넷을 통해 코드를 실행하는 것처럼 완전 신뢰 권한이 없는 호출자가 어셈블리에 액세스할 수 있게 됩니다.

완전 신뢰 어셈블리에 APTCA 특성이 있고 이 어셈블리가 부분 신뢰 호출자를 허용하지 않는 다른 어셈블리의 코드를 실행하면 보안상 위험할 수 있습니다. 두 메서드 M1 및 M2가 다음 조건에 해당하면 악의적인 호출자가 M1 메서드를 사용하여 M2 메서드를 보호하는 암시적인 완전 신뢰 링크 요청을 건너뛸 수 있습니다.

  • M1이 APTCA 특성을 가진 완전 신뢰 어셈블리에 선언된 public 메서드입니다.

  • M1이 M1의 어셈블리 외부에 있는 M2 메서드를 호출합니다.

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

부분 신뢰 호출자 X는 M1 메서드를 호출할 수 있습니다. 이렇게 하면 M1에서 M2를 호출합니다. M2에 APTCA 특성이 없으므로 직접 호출자(M1)가 완전 신뢰 링크 요청을 충족해야 합니다. 여기서는 M1에 완전 신뢰 권한이 있으므로 이 검사가 충족됩니다. 그러나 X는 신뢰할 수 없는 호출자로부터 M2를 보호하는 링크 요청을 만족하지 않으므로 보안상 위험할 수 있습니다. 따라서 APTCA 특성이 있는 메서드는 이 특성이 없는 메서드를 호출하면 안 됩니다.

위반 문제를 해결하는 방법

APCTA 특성이 필요하면 요청을 사용하여 완전 신뢰 어셈블리로 호출하는 메서드를 보호합니다. 요청할 정확한 권한은 메서드에서 노출하는 기능에 따라 다릅니다. 가능하면 완전 신뢰 요청으로 메서드를 보호하여 내부 기능이 부분 신뢰 호출자에게 노출되지 않도록 합니다. 그렇지 않을 경우에는 노출된 기능을 효율적으로 보호할 수 있는 권한 집합을 선택합니다. 요청에 대한 자세한 내용은 요청을 참조하십시오.

경고를 표시하지 않는 경우

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

예제

다음 예제에서는 두 개의 어셈블리와 테스트 응용 프로그램을 사용하여 이 규칙을 통해 감지되는 보안 문제를 보여 줍니다. 첫 번째 어셈블리에는 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.");
      }
   }
}

두 번째 어셈블리는 완전 신뢰되므로 부분 신뢰 호출자를 허용합니다(이전 설명의 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 어셈블리

부분 신뢰 코드에서 라이브러리 사용

요청

링크 요청

기타 리소스

데이터 액세스 및 모델링