2

샌드 박스 처리 된 app-domain에 예외 문제가 있습니다. 샌드 박스에서 실행되는 코드는 보안이 투명합니다. 부분적으로 신뢰할 수있는 발신자를 허용하고 sanboxed 코드에 기능을 제공하는 유틸리티 dll이 있습니다. 그 메소드는 SecuritySafeCritical입니다. 예외가 발생할 때까지 모든 것이 잘 작동합니다.샌드 박스 AppDomain 교차 어셈블리 예외 처리

샌드 박스에서 실행되는 코드는 try-catch 블록에 의해 보호되므로 티를 throw하면 응용 프로그램이 다운되지 않습니다.

보안 trasparent dll의 코드에서 예외가 발생하면 모두 정상입니다. 샌드 박스 코드가 신뢰할 수있는 유틸리티 DLL의 메소드를 호출하고, 그 코드가 발생하는 경우에는, 다음과 같은 상황이 발생합니다 내가 디버거 디버거 나누기에 나는 경우

:

An exception of type 'Blah' occurred in Trusted.dll but was not handled in user code 

그 자체로 어느입니다 OK,하지만 예외가 내 시도-catch 블록에 의해 체포되어 형 'ㅋ'이 아닌,하지만은 다음과 같습니다

[System.Security.SecurityException] = {"Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."} 

내 생각은 그 부분 신뢰에 대한 신뢰할 수있는 어셈블리에서 예외이 "누출" 코드는 보안 문제입니다. 두 번째 추측은 부분적으로 신뢰할 수있는 코드가 예외를 잡아서 보안 문제를 일으킬 수 있으므로 전파가 차단되므로이 문제가 문제로 간주된다는 것입니다. 프레임 워크가 실제로 위의 예외를 발생시키는 "SecurityPermission"을 어설 션하려고 시도 할 때 분명하지 않습니다.

내 질문 :이 사건을 어떻게 처리해야합니까? "깔끔한"방법으로 작동하도록하는 방법이 있습니까? (그렇다면 신뢰할 수있는 부분 코드에서부터 모든 부분으로 예외가 이동하는 예외적 인 경우), 그렇다면 안전한 방법으로 어떻게해야합니까? (분명히 나는 ​​맹목적으로 되돌릴 필요없이 사용 권한을 주장하고 싶지 않습니다!)

나는 신뢰할 수있는 도우미에 예외를 기록하고, 던져 버리고, 보안 예외를 잡아 원래의 예외를 다시 던져 버립니다. 그러나 나는 그것들을 구부리기보다는 "규칙들"을 따르는 더 깨끗한 해결책이 있는지 궁금해하고있었습니다.

또한 교차 어셈블리 예외 처리에 대한 내 추측이 맞다면!

답변

0

그래서, 그것이 heisenbug이었다 밝혀졌다, 또는 내가 디버거 내부에 내 코드를 실행하면 어쩌면 그 반대 ...

문제에만 나타납니다. 예외를 깨고 디버거에서 다시 시작하는 행위는 샌드 박스에 의해 좋아지지 않는 것으로 보입니다. 디버거 밖에서는 숙제 (어셈블리가 신뢰할 수 있고 도메인 신뢰할 수있는 어셈블리 목록에 추가되고 부분적으로 신뢰할 수있는 호출자 등을 추가 할 수 있음)가 제공된 경우 모두 예상대로 작동합니다.

또 다른 문제는 주목할만한 가치가 있습니다 : 예외를 저장하고 호출하는 appdomain에보고하려는 경우 예외는 [Serializable]이어야합니다. System.Exception하지만 ISerializable이므로 직렬화 생성자 (BlahException (SerializationInfo info, StreamingContext context))를 구현하고 매개 변수를 base()로 전달해야합니다.