다음을 통해 공유


@@@Security transparent code should not reference non-public security critical members

업데이트: 2007년 11월

TypeName

SecurityTransparentCodeShouldNotReferenceNonpublicSecurityCriticalCode

CheckId

CA2129

범주

Microsoft.Security

변경 수준

주요 변경

원인

SecurityTransparentAttribute로 표시된 메서드는 SecurityCritical로 표시된 Public이 아닌 멤버를 호출합니다. SecurityTransparent는 메서드의 기본 지정 값입니다.

규칙 설명

.NET Framework 2.0에서는 투명성이라는 기능이 추가되었습니다. 개별 메서드, 필드, 인터페이스, 클래스 및 형식은 투명하거나 중요할 수 있습니다.

투명 코드에서 보안 권한을 상승시킬 수는 없습니다. 따라서 투명 코드에 부여되거나 요청된 권한은 코드를 통해 자동으로 호출자 또는 호스트 AppDomain에 전달됩니다. 권한 상승의 예로는 Asserts, LinkDemands, SuppressUnmanagedCode 및 안전하지 않은 코드가 있습니다.

투명 코드와 중요 코드를 분리하는 목적은 보안 감사 프로세스를 단순화하기 위한 것입니다. 악의적이고 신뢰할 수 없는 사용자가 공개적으로 사용할 가능성이 있으므로 감사는 일반적으로 공용 진입점에서 수행됩니다. 어셈블리의 작은 섹션을 중요 코드 섹션으로 표시하여 보안 감사를 공용 진입점 및 권한을 상승시키는 보안 중요 코드 섹션으로 축소할 수 있습니다. 그러나 정확하고 완전한 감사가 되려면 투명 코드와 중요 코드 사이의 경계를 가능한 한 강력하게 구분해야 합니다. 다른 방법은 투명 코드를 사용하여 내부 보안 중요 코드를 호출할 수 있도록 하는 것입니다. 그렇게 하려면 투명 코드를 더 강력하게 감사해야 합니다.

공용 언어 런타임 JIT(Just-In-Time) 컴파일러에서는 런타임에 투명 코드가 public이 아닌 보안 중요 코드를 참조 또는 호출하는지 확인합니다. 투명 코드가 public이 아닌 중요 코드를 호출하면 MethodAccessException 같은 예외가 throw됩니다. 이 예외는 다른 클래스의 private 멤버에 액세스하려는 클래스와 비슷하게 처리됩니다.

이 코드 분석 규칙은 투명/중요 혼합 어셈블리의 모든 메서드와 형식을 분석합니다. 또한 이 규칙은 SecurityTreatAsSafe로 표시되지 않은 public이 아닌 중요 코드에 대한 투명 코드의 모든 호출에 플래그를 지정합니다.

위반 문제를 해결하는 방법

이 문제를 해결하려면 public이 아닌 SecurityCritical 코드를 SecurityCritical로 호출하는 코드를 표시하거나 대상 메서드/형식을 SecurityTreatAsSafe로 표시합니다. 이렇게 하면 코드가 안전하고 감사된 public 코드로 처리되어 악의적인 목적으로부터 보호를 받을 수 있습니다.

경고를 표시하지 않는 경우

이 규칙에서는 메시지를 표시해야 합니다.

예제

다음 코드는 SecondSecurityMethod가 SecurityCritical인 private 메서드이므로 실패합니다. SecondSecurityMethod의 어설션에서 권한이 부여된 작업 및 호출의 전체 요청을 방지하여 FirstSecurityMethod로 이동함으로써 호출자에 대해 수행되는 보안 검사로 제한될 수 있는 보안 문제가 발생할 수 있습니다.

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        // SecurityTransparent
        public void FirstSecurityMethod()
        {
            SecondSecurityMethod();
        }

        [System.Security.SecurityCritical]
        private void SecondSecurityMethod()
        {
            // Assert permissions

            // do privileged actions, such as method call-outs
        }
    }
}

투명/중요 경계가 적용되지 않은 경우 FirstSecurityMethod는 보안 검사 없이 모든 SecondSecurityMethod의 작업을 수행할 수 있습니다.

한 가지 옵션은 메서드에 대해 코드 검토를 수행한 후, 해당 메서드가 권한 상승 및 악의적인 공격으로부터 안전하다고 간주되면 SecurityTreatAsSafe로 표시하는 것입니다.

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        // SecurityTransparent
        public void FirstSecurityMethod()
        {
            SecondSecurityMethod();
        }

        [System.Security.SecurityTreatAsSafe]
        [System.Security.SecurityCritical]
        private void SecondSecurityMethod()
        {
            // Assert permissions

            // do privileged actions, such as method call-outs
        }
    }
}

다른 옵션은 Method1도 중요 메서드로 설정하는 것입니다. 그러면 어셈블리의 중요 커널이 확장되고 보안 감사의 크기가 증가됩니다. 또한 적절한 위협 모델링 및 코드 흐름 분석이 수행됩니다.

using System;
using System.Security.Permissions;

namespace SecurityTestClassLibrary
{
    public class SecurityTestClass
    {
        [System.Security.SecurityCritical]
        public void FirstSecurityMethod()
        {
            SecondSecurityMethod();
        }

        [System.Security.SecurityCritical]
        private void SecondSecurityMethod()
        {
            // Assert permissions

            // do privileged actions, such as method call-outs
        }
    }
}

참고 항목

참조

SecurityTransparentAttribute

SecurityCriticalAttribute

SecurityTransparentAttribute

SecurityTreatAsSafeAttribute

System.Security