@@@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
}
}
}