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)并将参数向下传递给基址()