.NET 2.0에서 무단 코드가 내 어셈블리에 액세스하는 것을 방지하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/421137

  •  05-07-2019
  •  | 
  •  

문제

.NET 1.X에서는 사용할 수 있습니다 strongNameIdentityPermissionAttribute 어셈블리에서 서명 한 코드 만 귀하의 어셈블리에 액세스 할 수 있는지 확인하십시오. MSDN 문서에 따르면

.NET Framework 버전 2.0 이상에서, 전화 어셈블리에 완전한 신뢰를 갖는 경우 신원 권한에 대한 요구는 효과적이지 않습니다.

이는 완전한 신뢰를 가진 모든 응용 프로그램이 내 보안 요구를 우회 할 수 있음을 의미합니다.

.NET 2.0에서 무단 코드가 내 어셈블리에 액세스하는 것을 방지하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

에릭의 제안에 따라, 나는 열쇠를 직접 확인함으로써 그것을 해결했다. 보호하고 싶은 코드에서 다음 호출을 추가하고

EnsureAssemblyIsSignedByMyCompany( Assembly.GetCallingAssembly() );

그런 다음 해당 방법의 구현이 다음과 같습니다

  /// <summary>
  /// Ensures that the given assembly is signed by My Company or Microsoft.
  /// </summary>
  /// <param name="assembly"></param>
  private static void EnsureAssemblyIsSignedByMyCompany( Assembly assembly )
  {
     if ( assembly == null )
        throw new ArgumentNullException( "assembly" );

     byte[] pubkey = assembly.GetName().GetPublicKeyToken();
     if ( pubkey.Length == 0 )
        throw new ArgumentException( "No public key token in assembly." );

     StringBuilder builder = new StringBuilder();
     foreach ( byte b in pubkey )
     {
        builder.AppendFormat( "{0:x2}", b );
     }
     string pkString = builder.ToString();
     if ( pkString != "b77a5c561934e089" /* Microsoft */ &&
          pkString != "abababababababab" /* Ivara */ )
     {
        throw new ArgumentException( "Assembly is not signed by My Company or Microsoft. You do not have permission to call this code." );
     }
  }

** 무고한 사람들을 보호하기 위해 이름과 열쇠가 변경되었습니다. 실명이나 회사와의 유사성은 단지 우연의 일치 일뿐입니다.*

다른 팁

이 기사를 참조하십시오 :
http://blogs.msdn.com/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

특히이 부분 :

최근 .NET 버전의 .NET에서 "Full Trust는 Full Trust를 의미합니다". 즉, 완전히 신뢰할 수있는 코드는 실제로 서명되었는지 여부에 관계없이 "이 키와 함께 서명"과 같은 것들에 대한 요구를 포함하여 모든 요구를 충족시킵니다.

보안 시스템의 치명적인 결함이 아닙니까? 완전히 신뢰할 수있는 코드는 항상 신뢰할 수있는 능력이있었습니다. 완전히 신뢰할 수있는 코드는 주어진 어셈블리와 관련된 증거를 제어 할 수 있기 때문입니다. 증거를 통제 할 수 있다면 Microsoft에서 온 것처럼 보이는 어셈블리를 위조 할 수 있습니다. (그리고 과정에서 이미 악의적 인 풀 트러스트 코드가 있다면 이미 잃어버린 것입니다. Microsoft 서명 조립품을 가장 할 필요는 없습니다. 이미 사용자가 할 수있는 모든 일을 할 수있는 힘이 있습니다.)

분명히 .NET 디자이너는이 속성이 .NET 1.X의 전체 신뢰 코드에도 효과적이지 않다고 생각했습니다.

Joel이 지적했듯이 CAS와 관련하여 운이 좋지 않습니다. 그러나 Assembly.getCallingAssembly ()를 사용하여 보호 해야하는 모든 방법으로 직접 확인을 수행하여 호출 코드가 포함 된 어셈블리를 참조 한 다음 해당 어셈블리의 강한 이름을 수동으로 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top