2

我在沙盒應用程序域中遇到了一些異常問題。 在沙箱中運行的代碼是安全透明的。 我有一個實用的dll,它允許部分信任的調用者,併爲sanboxed代碼提供功能。它的方法是SecuritySafeCritical。 一切運作良好,直到我們遇到例外。沙盒AppDomain交叉程序集異常處理

在沙箱中運行的代碼受try-catch塊的保護,所以如果ti拋出它不會導致應用程序關閉。

如果安全trasparent dll中的代碼拋出異常一切正常。但是,如果沙盒代碼調用受信任程序的DLL的方法,那代碼拋出,將發生以下情況:

如果我在調試器,調試器符:

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

這本身就是OK,但隨後的異常由我try-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.ExceptionISerializable,因此您需要實現序列化構造函數(BlahException (SerializationInfo info, StreamingContext context)並將參數向下傳遞給基址()