2012-05-31 2 views
4

현재이 프로젝트에 대한 사용자 지정 코드 액세스 보안 솔루션을 빌드하려고합니다. 사용자 지정 코드 액세스 보안을위한 IPermission 구현

그러므로 나는 같이 사용되어야 CustomPermissionAttribute 생성 :

[CustomPermissionAttribute(SecurityAction.Demand, Permission="PermMethodABC")] 
public void MethodABC() 
{ 
} 

속성의 CreatePermission() 작성하는 방법을 새로운 CustomPermission 인스턴스를 반환한다.

CustomPermission 클래스의 수요 방법

는 Thread.Current.CurrentPrincipial에 내 사용자 정의에 대해 IPrincipial 구현의 보안을 확인해야 다음 "조립 A"를 서명에

public sealed class CustomPermission : IPermission 
{ 
    private string _RequiredPermission; 
    ... 
    public void Demand() 
    { 
     ICustomPrincipial _pr = Thread.Current.CurrentPrincipial as ICustomPrincipial; 
     if (_pr == null) throw... 
     if (!_pr.HasPermission(_RequiredPermission)) throw... 
    } 
} 

public interface ICustomPrincipial : IPrincipial 
{ 
    bool HasPermission(string RequiredPermission); 
} 

은 위의 모든입니다.

부호 조립 B는 어셈블리의 ICustomPrincipial를 구현하는 다음 CustomPrincipial 구현을 포함

public sealed class CustomPrincipial : ICustomPrincipial 
{ 
    User _User; 
    ... 
    public bool HasPermission(string RequiredPermission) 
    { 
     if (_User has permission defined with "PermMethodABC") ... 
     return true/false; 
    } 
    ... 
} 

(이제 조립 A는 사용자 유형에 대해 알이 난에 CustomPrincipial 클래스를 배치합니다. 어셈블리 A, 그러면 사용자 물건을 가진 모든 어셈블리에도 서명해야합니다. 그렇지 않으면 어셈블리 A를 컴파일 할 수 없습니다.

응용 프로그램 시작시 CustomPrincipial의 새 인스턴스가 Thread.Current.CurrentPrincipial에 할당됩니다.

두 질문 :

  • 이 어셈블리의 공개 ICustomPermission 인터페이스로 인한 문제를 saftey 수 있을까요?

  • 모든 IPermission 멤버를 완전히 구현해야합니까? 특히 ToXML과 FromXML 메소드 ... 런타임에 MethodABC()에 액세스 할 때마다 CreatePermission() 메소드가 호출됩니다.

편집 : 등록 1 : 나는 다음과 같은 상황을 생각하고있다 "조립 C 것은"는 CustomPermissionAttribute로 보호 MethodXY가 포함되어 있습니다. 이 보호 된 메서드에 액세스하려면 공격자가 Assembly A & Assembly C에 대한 참조를 만들고 어셈블리 A의 공용 ICustomPrinciial 인터페이스 (-> HasPermission()이 항상 true를 반환 함)를 구현할 수있는 새 응용 프로그램을 만들 수 있습니다. 그는 자신의 Thread.Current.CurrentPrincipial에 구현의 인스턴스를 할당 할 수 있습니다. Assembly A의 Demand() Method가 Thread.Current.CurrentPrincipial을 검사하면 공격자가 MethodXY에 액세스 할 수 있습니다. 그게 가능한 상황일지도 몰라 ..!?

답변

1

어셈블리 A의 공용 ICustomPermission 인터페이스로 인한 안전 문제가있을 수 있습니까?

사용 권한을 신중하게 생각하면 Thread.Current.CurrentPrincipal은 대부분의 다른 프로그램에서 읽기 전용이어야하므로 우회가 불가능합니다. (적어도 MSDN 페이지에서 잠깐 살펴 보겠습니다.)

그러나 보안 문제와 마찬가지로 스스로 테스트하는 것이 가장 좋습니다.사용자 환경에서 실행되는 코드를 시도하고 작성하고 CurrentPrincipal을 우회하는 자체 방식을 구현하십시오.

모든 IPermission 멤버를 완전히 구현해야합니까? 특히 ToXML과 FromXML 메소드 ... 런타임에 MethodABC()에 액세스 할 때마다 CreatePermission() 메소드가 호출됩니다. 전체 구현의 msdn 페이지에 대한 예제가있다

, 그것을 할 너무 불쾌한 보이지 않는, 당신이 때문에 NotImplementedException에 나중에 문제가 발생하지 않습니다 보장 할 것입니다.

그러나 정상적인 작동 중에 어떤 메서드가 호출되는지 알기에 충분하지 않은데 IPermission으로 실험했습니다.

편집 : 이것은 더 많은 의견이지만 길어요.

중요한 점 중 하나는 코드에 교장을 수정할 수있는 권한이 있으면 권한을 우회하지 못하도록 막을 수 있다는 것입니다. SecurityPermissionFlag.ControlPrincipalCurrentPrincipal 요구 사항을 설정하는 권한입니다. Caspol.exe와 같은 도구를 사용하지 않는 한 모든 실행 파일은 기본적으로 완전 신뢰하에 실행됩니다.

기본적으로 .NET Framework는 사용자 지정 코드가 다른 방법으로 전달 될 때까지 완전히 신뢰할 수 있다고 가정합니다. 믿을 수없는 코드를 호출하는 경우 코드가 낮은 보안 자격 증명으로 실행되는지 확인하기위한 메커니즘이 있거나 신뢰할 수없는 실행 파일이 있으면 해당 보안 자격 증명을 낮출 수 있습니다. 그러나 시스템의 관리자는 사용자가 구현 한 모든 코드 액세스 보안을 우회 할 수있는 충분한 능력을 가지고 있습니다 (사용자가 IPrincipal 재정의로 주석 처리 한 것처럼).

이것이 설명되지 않으면 알려주세요. 자세한 내용을 추가 할 수 있습니다.

+0

안전에 따르면 : 나는 위의 게시물에서 가능한 상황을 언급했다. IPermission에 따르면 : 정상적인 작업 중에는 IsSubsetOf() 및 Demand()가 호출됩니다. – Christian