본문 바로가기

IT 살이/03. 관리 - 보안 관리

AllowPartiallyTrustedCallers 어트리뷰트

로컬 PC 외부에서 들어오는 어셈블리는 로컬 PC의 어셈블리들과는 달리 권한에 있어서 제한을 받는다. 이렇게 완전한 권한을 부여받지 못한 어셈블리를 이름하여 부분적으로 신뢰를 받는 어셈블리(partially trusted assembly)라고 한다. FullTrust 권한을 부여받지 못했다면 Everything 권한 집합을 부여받은 어셈블리할지라도 부분적으로 신뢰를 받는 어셈블리에 속하게 된다.
.NET CLR은 기본적으로 강력한 이름의 어셈블리(strong named assembly)는 완전한 권한을 갖는 어셈블리만이 호출할 수 있도록 하고 있다. 그러나 강력한 이름의 어셈블리가 AllowPartiallyTrustedCallersAttribute(APTC) 어셈블리 어트리뷰트를 사용하게 되면 부분 신뢰의 어셈블리로부터의 호출도 허락하겠다는 의미인것이다.

--AssemblyInfo.cs

using System.Security;
[assembly:AllowPartiallyTrustedCallers]

GAC에 등록된 어셈블리가 이 어트리뷰트를 가지고 가지고 있다면 외부에서 들어온 어셈블리들도 GAC에 등록된 어셈블리를 사용할 수 있게 되는 것이다. APTC 어트리뷰트를 사용하려면 개발자는 있을 지도 모르는 보안문제에 대해서는 스스로가 모두 체크해야 한다. 그래서 필요하다면 클래스나 메소드 수준의 보안 요청을 해서 권한 체크를 해야 한다. 만약 중요한 자원에 대한 액세스를 포함하고 있는 어셈블리나 보안상 약점이 있는 어셈블리가 이 어트리뷰트를 포함하고 있다면 문제가 될 수도 있다. 그래서 .NET 프레임워크 1.0에 이 어트리뷰트의 추가 여부를 두고 가장 늦게까지 결정이 미뤄졌다고 한다. .NET 프레임워크 1.0 베타 버전에서는 아예 추가되지도 않았다고 한다.
.NET 어셈블리의 핵심 코드를 가지고 있는 어셈블리에서는 이 어트리뷰트를 사용하지 않고 있다. 부분 신뢰 환경의 애플리케이션을 작성할때는(애플리케이션에 FullTrust 권한을 부여했다면 상관없다), .NET 프레임워크의 어셈블리들중에서 APTC를 허용하는 어셈블리들을 확인하고 이 어셈블리들이 제공하는 기능의 범위내에서 애플리케이션을 작성해야 한다.

APTC 어셈블리 목록

웹 브라우저 임베딩 방식의스마트 클라이언트 애플리케이션을 제작할때는 <object>태그를 통해서 대상 어셈블리를 로딩하게 된다. 앞의 APTC 어셈블리 목록중에 ieexecremote.dll이라는 어셈블리가 있는데, 이 어셈블리가 <object>에 의해 최초 호출되는 어셈블리의 OnLoad() 호출하는 스택상에 존재한다. 따라서 <object>에 의해 호출되는 어셈블리는 APTC 어트리뷰트가 있어야 한다. 그리고 다시 이 어셈블리에 의해 참조되는 다른 어셈블리 또한 APTC가 표시되어야 한다는 것도 기억하길 바란다. 웹 페이지에서 태그<object>를 이용해서 어셈블리를 로딩하려고 할 때 대상 어셈블리는 약한 이름의 어셈블리(weakly named assembly)이던지 만약 어셈블리가 강력한 이름의 어셈블리(strongly named assembly)라면 AllowPartiallyTrustedCallersAttribute(APTC) 어트리뷰트를 추가해야 정상적인 로딩이 가능하다.
다시 한번 더 상기시키면, APTC 어트리뷰트는 강력한 이름의 어셈블리에만 적용된다. 약한 이름의 어셈블리는 이 어트리뷰트가 필요없다.

참조 문서

ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.VisualStudio.v80.ko/
dv_fxsecurity/html/dd66cd4c-b087-415f-9c3e-94e3a1835f74.htm(영문)

APTC 어셈블리 여부 확인 툴 제공
http://www.develop.com/technology/resourcedetail.aspx?id=843c6027-b697-469d-933b-014b61f7d500