我有一个WCF服务与Mathematica内核通信,以评估任意表达式并获得结果。 (我的唯一目的是利用Mathematica作为使用SVG和XAML的静态图形的复杂图形布局引擎,但我的数学内核主机可以有一个非常简单的界面,可以评估任意Mathematica表达式:如果出现安全漏洞,可以导致任意代码注入。)
使用
var e = new Evidence();
e.AddHostEvidence(new Zone(SecurityZone.Trusted));
var pset = SecurityManager.GetDefaultSandbox(e);
导致我的应用程序由于后来的安全性异常而崩溃,因此我想确保删除单个权限类型。我没有详细了解安全异常的类型及其原因,我的程序链接到没有调试符号的商业库。
如何在商业库中调试执行?反射器或类似的工具可以帮助我吗?
如何获得有关安全例外的更好的堆栈跟踪? (当前沙盒应用程序的完整来源如下)
或
var pset = new PermissionSet(PermissionSet.Unrestricted); // set is empty o_O!
pset.RemovePermission(typeof(FileIOPermission)); // io permission still active
...
无济于事。
完整背景:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security;
using System.Security.Policy;
using System.Security.Permissions;
using System.Reflection;
using System.Runtime.Remoting;
class Sandboxer : MarshalByRefObject
{
const string uPath = @"..\..\..\KernelHost\bin\Debug";
static string aPath = Path.GetFullPath(uPath);
const string uAssembly = "KernelHost";
static void Main(string[] args)
{
var e = new Evidence();
e.AddHostEvidence(new Zone(SecurityZone.Trusted));
var pset = new PermissionSet(PermissionState.Unrestricted);
//pset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
//pset.AddPermission(new UIPermission(UIPermissionWindow.AllWindows, UIPermissionClipboard.AllClipboard));
//pset.AddPermission(new FileIOPermission(FileIOPermissionAccess.AllAccess, aPath));
//pset.SetPermission(new UIPermission(PermissionState.None));
pset.RemovePermission(typeof(UIPermission));
//pset.SetPermission(new FileIOPermission(PermissionState.None));
var ass = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();
var ads = new AppDomainSetup();
ads.ApplicationBase = aPath;
var sandbox = AppDomain.CreateDomain(
"Sandbox",
e,
ads,
pset,
ass);
Console.WriteLine(pset.Count);
foreach (IPermission p in pset)
{
Console.WriteLine(p.ToXml());
}
sandbox.ExecuteAssemblyByName("KernelHost");
}
}
答案 0 :(得分:3)
完全信任不仅仅是“一切”;它是“禁用检查” - 所以不,你不能拥有“完全信任,除了{foo}”,因为仍然没有检查。你将不得不拥有一个包容性的,尽管很大的套装。而且我确信我可以做一些非常讨厌的事情,而不是写文件......