2012-08-09 2 views
19

수십 명의 고객에게 거의 1 년 동안 배포 된 상당히 안정적인 서버 응용 프로그램 버전이 있습니다.보안 투명 방법으로 시도 X의 보안 중요 방법에 액세스하지 못함

한 새로운 고객 최근 설치 응용 프로그램 및 다음과 같은 오류를 얻고있다 :

System.MethodAccessException: Attempt by security transparent method [SomeMethod] to access security critical method [SomeOtherMethod] failed.

것으로 someMethod 및 SomeOtherMethod 모두 .NET 4에 내장되어 내가 쓴 어셈블리의 방법이 있으며, 내부에 그것을 실행하는 Windows 서비스. 차이가 나는 경우 SomeOtherMethod는 .NET 2.0에 대해 작성된 타사 어셈블리 (EntLib 4.1)의 형식을 참조합니다. EntLib 4.1 코드를 보면 SecurityTransparent와 APTC 특성을 모두 사용하고 있지만 다른 클라이언트에서는 문제가 발생하지 않은 것으로 나타났습니다.

이 어셈블리는 .NET 2.0 CLR에서 업그레이드되었지만 오래 전부터 사용되었습니다. 이 정확한 코드는 다른 고객에게 잘 실행되고 있으며 APTC 속성을 명시 적으로 사용하고 있지 않으며 SecurityCritical 속성을 어디에서나 사용하고 있습니다.

이로 인해 구성 문제이거나 .NET Framework 패치 문제 일 가능성이 있습니다. 이 변경 사항을 초래할 수있는 .NET 용 패치가 출시 되었습니까? 기본적으로 꺼져 있지만 고객이 사용하도록 설정할 수있는 이러한 유형의 검사를 시행하는 구성 설정이 있습니까?

마지막으로 한 점. 내 서비스는 SSRS RDLC를 사용하여 PDF를 생성합니다. 때문에 .NET 4의 일부 변경에, 나는 다음과 같은 설정을 통해 기존 보안 정책을 사용하도록 서비스를 강제해야한다 : 자세한 내용은

<runtime> 
    <NetFx40_LegacySecurityPolicy enabled="true" /> 
    </runtime> 

나는이 작업을 수행해야하는 이유에,이 유래 게시물을 참조 : Very High Memory Usage in .NET 4.0

중요한 것은 다른 모든 고객에게도 마찬가지입니다. 이 고객 만이 문제를 겪고 있습니다.

답변

20

한숨과 같이, 엔터프라이즈 라이브러리를 담당하는 Microsoft Patterns and Practices 팀에서 채택한 패턴과 사례는 상당히 슬프다. 음, 예외는 정확합니다. "Meh로 장식 된 코드에서"보안을 확실히 확인합니다. "로 장식 된 메서드를 호출 할 수 없습니다. 보안을 확인하지 않으므로 확인을 위해 CPU주기를 불편하게하지 마십시오. . Java에서 사용되는 예외 사양뿐만 아니라 예외에 대한 비례가 있습니다. CAS는 매우 유용하지만 예외를 진단하는 것은 큰 골치 거리이며 사용자가 소유하지 않아 수정할 수없는 코드가 포함되는 경우가 많습니다. .NET 4.에서 더 이상 사용되지 않는 이유가 있습니다.

편집 완료. 이 문제를 해결하기 위해 CAS가 왜 시행되고 있는지 알아야합니다. 가장 간단한 설명은 서비스가 완전한 신뢰로 실행되지 않는다는 것입니다. 에 대한 가장 단순한 설명은 클라이언트가 로컬 하드 드라이브에 서비스를 설치하지 않았다는 것입니다.입니다. 또는 일반적으로 로컬 어셈블리에서도 모드를 신뢰하지 않는 코드를 실행하고 있습니다. 매우 편집증적인 관리자는이를 선호 할 수 있습니다. Caspol.exe는 명령 행 옵션이 CAS만큼 신비한 도구 인 Caspol.exe로 구성해야합니다. 신뢰할 수없는 위치 설명에서 냄비 촬영을 한 고객은이 blog post과 같이 Caspol을 실행해야합니다. 또는 단순히 서비스를 로컬로 배포하여 기본 "Ie thee"가 적용되도록하십시오.

OP에서 발견 한 실제 이유 : 편집 신뢰할 수없는 인터넷이나 네트워크 위치에서 파일을 다운로드 할 때 파일에 추가되는 alternate data stream을주의하십시오. 파일은 "ZoneId"값으로 어디에서 왔는지 추적하는 "Zone.Identifier"라는 스트림을 가져옵니다. 저장 위치에서 파생 된 신뢰를 무시하는 것은이 값입니다.보통 인터넷 영역에 넣습니다. 탐색기를 사용하여 파일을 마우스 오른쪽 단추로 클릭하고 "차단 해제"를 클릭하여 해당 스트림을 제거하십시오. 당신이 경우에는 파일 :

+1

이것은 의미가 있습니다. 나는 오늘 이것을 확인하고있다. 필자의 전나무는 실제로 Windows에서 전자 메일이나 IE를 통해 안전하지 않은 것으로 다운로드 된 파일에 플래그를 지정하는 기능으로 인해 어셈블리가 차단되고 있다고 생각했습니다. 나는이 물기를 전에 가지고 있었다. – RMD

+3

귀하의 답변은 매우 도움이되었습니다. 실제로 물건들을 껌으로 막아 버리는 것이 차단 된 것으로 밝혀졌습니다. 파일 차단을 제거하면 (등록 정보 -> 차단 해제) 문제가 해결되었습니다. – RMD

+2

@RMD 감사합니다. 젠장, 윈도우. – JefClaes

9

를 신뢰할 수있는 확신 후에 내가이 문제에 대한 내 솔루션 게시 다른 사람을 도움 : 제거,

1)의 AssemblyInfo.cs에을 /를 [조립 : SecurityTransparent]를 댓글을 달았습니다 선.

2) 클래스와 네트워크 연결 확립 내 경우, 실제 작업은 [SecuritySafeCritical]로 표시되었다 않는 방법 :

[SecuritySafeCritical] 
public class NetworkConnection : IDisposable 
{ 
    [SecuritySafeCritical] 
    public NetworkConnection(string networkName, NetworkCredential credentials) 
    { 
     ............. 
    } 
} 

3) [SecurityCritical]로 발신자 클래스 및 방법이었다 시장 : 나는 어떤 패키지는 주요 웹 사이트 프로젝트에 바인딩 System.Web.Mvc 어셈블리 버전을 무시 솔루션에 NuGet 패키지를 관리 할 때 내 경우

[SecurityCritical] 
public class DBF_DAO : AbstractDAO 
{ 
    [SecurityCritical] 
    public bool DBF_EsAccesoExclusivo(string pTabla, ref ArrayList exepciones) 
    { 
     .... 
     using (new NetworkConnection(DBF_PATH, readCredentials)) 
     { 
      .... 
     } 
    } 
} 
+0

감사합니다. Jhollman. 나는 같은 문제를 만났다. 이게 도움이되었습니다 – TrieuH

0

는이 문제였다. 4.0.0.0으로 다시 설정하십시오 (5.0을 설치했습니다). Mvc v4.0이 설치되어 있고 GAC를 통해 액세스 할 수 있기 때문에 변경 사항을 변경하지 않았습니다. 다시 설정

8

ServiceModelEx 라이브러리를 사용하는 동안 다운로드 한 WCF 샘플을 http://www.idesign.net/에서 실행하는 동안 비슷한 문제가 발생했습니다. 나는 ServiceModelEx 프로젝트

//[assembly: AllowPartiallyTrustedCallers] 

에있는 AssemblyInfo.cs에서 아래 라인을 주석 처리하고 나를 위해 일했다.

+0

ClickOnce를 통해 배포 된 WinForms 앱에서 라이브러리를 사용하고있었습니다. ClickOnce는 위에 설명 된 @ hans-passat와 같은 CAS가있는 짐승입니다. 다행히도 위의 줄을 주석으로 처리하여 라이브러리를위한 소스 코드를 만들었습니다. – bizl

+0

우수한, 그것은 나를 위해 일했다!! –

+0

고마워요. 많은 검색을 한 후에 저에게 효과적이었습니다. 어셈블리 중 일부가 AssemblyInfo.cs/.vb 파일 내에이 지시문을 갖고 있고 일부가 .net이 혼란스러워하는 경우가 아닌 것 같습니다. 모든 인스턴스를 제거하면 문제가 해결 될 것입니다. – CResults