Microsoft MVP성태의 닷넷 이야기
오류 유형: 268. Win32 핸들 관련 CLR4 보안 오류 사례 [링크 복사], [링크+제목 복사],
조회: 20432
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

Win32 핸들 관련 CLR4 보안 오류 사례

만약, CLR4 보안 모델에서 APTCA 환경인 경우,

.NET CLR4 보안 모델 - 3. CLR4 보안 모델에서의 APTCA 역할
; https://www.sysnet.pe.kr/2/0/1682

System.Security.SecuritySafeCritical 특성을 지정하지 않는다면 다음과 같은 식의 예외가 발생할 수 있습니다.

System.MethodAccessException was caught
  HResult=-2146233072
  Message=Attempt by method 'Microsoft.Win32.NamedPipe.CreateClient(System.String, Microsoft.Win32.PipeDirection)' to access method 'Microsoft.Win32.NamedPipe.CreateFile(System.String, UInt32, UInt32, IntPtr, UInt32, UInt32, IntPtr)' failed.
  Source=Jennifer5
  StackTrace:
       at Microsoft.Win32.NamedPipe.CreateClient(String pipeName, PipeDirection direction)
       at MyApp.Test(String exePath)
  InnerException: 

또한 NamedPipe I/O 관련해서 비동기로 메서드를 작성하는 경우,

using (ManualResetEvent completed = new ManualResetEvent(false))
{
    FileStream fsStream = _pipeStream;
    _pipeStream.BeginWrite(sendBuffer, 0, sendBuffer.Length, (ar) =>
    {
        try
        {
            fsStream.EndWrite(ar);
        }
        catch { }

        if (completed.SafeWaitHandle.IsClosed == false)
        {
            completed.Set();
        }

    }

    WaitHandle.WaitAny(new WaitHandle[] { completed, _exitEvent }, maxWaitMillisecond, false);
}

람다 메서드 안에서 SafeWaitHandle 속성 접근 시 다음과 같은 예외가 발생하게 됩니다.

System.MethodAccessException occurred
HResult=-2146233072
Message=Attempt by security transparent method 'Microsoft.Win32.NamedPipe+<>c__DisplayClassa.<WriteString>b__7(System.IAsyncResult)' to access security critical method 'System.Threading.WaitHandle.get_SafeWaitHandle()' failed.

Assembly 'TestDll, Version=5.0.5.0, Culture=neutral, PublicKeyToken=...' is marked with the AllowPartiallyTrustedCallersAttribute, and uses the level 2 security transparency model. Level 2 transparency causes all methods in AllowPartiallyTrustedCallers assemblies to become security transparent by default, which may be the cause of this exception.
Source=Jennifer5
StackTrace:
at Microsoft.Win32.NamedPipe.<>c__DisplayClassa.<WriteString>b__7(IAsyncResult ar)
InnerException:


이런 경우, 람다 메서드에는 System.Security.SecuritySafeCritical 특성을 지정할 수 없으므로 별도의 메서드로 정의하는 수고를 감내해야 합니다.

참고로, System.MethodAccessException 예외 뿐만 아니라 System.FieldAccessException 같은 예외도 발생할 수 있습니다.

System.FieldAccessException occurred
  HResult=-2146233081
  Message=Attempt by method 'Microsoft.Win32.NamedPipe.Close()' to access field 'Microsoft.Win32.NamedPipe._pipeHandle' failed.
  Source=TestDll
  StackTrace:
       at Microsoft.Win32.NamedPipe.Close()
  InnerException: 

정리해 보면, "CLR4 보안 모델 + APTCA" 환경에서 System.MethodAccessException, System.FieldAccessException과 같은 식의 ...AccessException 예외가 발생한다면 System.Security.SecuritySafeCritical 특성 지정을 고려하시면 됩니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 1/21/2015]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 76  77  78  79  [80]  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11969정성태7/2/201920668Math: 63. C# - 3층 구조의 신경망파일 다운로드1
11968정성태7/1/201927389오류 유형: 551. Visual Studio Code에서 Remote-SSH 연결 시 "Opening Remote..." 단계에서 진행되지 않는 문제 [1]
11967정성태7/1/201921503개발 환경 구성: 446. Synology NAS를 Windows 10에서 iSCSI로 연결하는 방법
11966정성태6/30/201920370Math: 62. 활성화 함수에 따른 뉴런의 출력을 그리드 맵으로 시각화파일 다운로드1
11965정성태6/30/201920953.NET Framework: 846. C# - 2차원 배열을 1차원 배열로 나열하는 확장 메서드파일 다운로드1
11964정성태6/30/201922020Linux: 20. C# - Linux에서의 Named Pipe를 이용한 통신
11963정성태6/29/201921716Linux: 19. C# - .NET Core Unix Domain Socket 사용 예제
11962정성태6/27/201919287Math: 61. C# - 로지스틱 회귀를 이용한 선형분리 불가능 문제의 분류파일 다운로드1
11961정성태6/27/201919445Graphics: 37. C# - PLplot - 출력 모음(Family File Output)
11960정성태6/27/201920497Graphics: 36. C# - PLplot의 16색 이상을 표현하는 방법과 subpage를 이용한 그리드 맵 표현
11959정성태6/27/201921587Graphics: 35. matplotlib와 PLplot의 한글 처리
11958정성태6/25/201926073Linux: 18. C# - .NET Core Console로 리눅스 daemon 프로그램 만드는 방법 [6]
11957정성태6/24/201923821Windows: 160. WMI 쿼리를 명령행에서 간단하게 수행하는 wmic.exe [2]
11956정성태6/24/201923024Linux: 17. CentOS 7에서 .NET Core Web App 실행 환경 구성 [1]
11955정성태6/20/201921121Math: 60. C# - 로지스틱 회귀를 이용한 분류파일 다운로드1
11954정성태6/20/201919463오류 유형: 550. scp - sudo: no tty present and no askpass program specified
11953정성태6/20/201917426오류 유형: 549. The library 'libhostpolicy.so' required to execute the application was not found in '...'
11952정성태6/20/201918467Linux: 16. 우분투, Centos의 Netbios 호스트 이름 풀이 방법
11951정성태6/20/201921651오류 유형: 548. scp 연결 시 "Permission denied" 오류 및 "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!" 경고
11950정성태6/18/201922463.NET Framework: 845. C# - 윈도우 작업 관리자와 리소스 모니터의 메모리 값을 구하는 방법
11949정성태6/18/201917659오류 유형: 547. CoreCLR Profiler 예제 프로젝트 빌드 시 컴파일 오류 유형
11948정성태6/17/201919572Linux: 15. 리눅스 환경의 Visual Studio Code에서 TFS 서버 연동
11947정성태6/17/201922007Linux: 14. 리눅스 환경에서 TFS 서버 연동
11946정성태6/17/201922876개발 환경 구성: 445. C# - MathNet으로 정규 분포를 따르는 데이터를 생성, PLplot으로 Histogram 표현파일 다운로드1
11945정성태6/17/201920465Linux: 13. node.js에서 syslog로 출력하는 방법
11944정성태6/16/201926760Linux: 12. Ubuntu 16.04/18.04에서 node.js 최신 버전 설치 방법
... 76  77  78  79  [80]  81  82  83  84  85  86  87  88  89  90  ...