沙盒AppDomain中的线程安全性

我有一个应用程序域来托pipe不受信任的代码/程序集。 我用安全属性解决了所有安全问题,效果很好。 不受信任的代码在专用线程上运行。 CLR是2.0。 这就是我AppDomainShell AppDomainSeed ,壳牌运行在主域,种子是信任的代理/助手在不受信任的域。

我有兴趣限制创build新线程和改变优先级 。 目前我的不受信任的程序集可以通过创build10k个线程来设置ThreadPriority.Highest或终止操作系统。 有SecurityPermissionFlag.ControlThread,但可以防止像Abort()这样的高级操作。

我在看Thread类的实现,对于那些简单的操作,C#API没有声明性的安全性,其余的实现是本地的。

我想我可以使用一些Win32函数来禁止在操作系统级别。 但是操作系统如何识别不可信任的线程/代码/程序集呢? SetThreadPrincipal() ?

有什么CLR的API可以被滥用? 我更喜欢解决scheme,而不需要安装和便携式单声道: – / hmmm。

任何其他的想法欢迎。 谢谢!

我在考虑另一种解决方案。 不可信装配的CIL静态分析。 我可以搜索所有的方法,属性,构造函数。 识别对类型的引用。 如果我发现引用的线程类型,我抛出安全异常和卸载大会。

我很喜欢Jb Evain的工作。 他创造了单音塞西尔 ,但这是相当重的。 他还用.NET反思起草了CIL阅读器 。

我用CIL Reader创建了Linq 。 用法看起来像这样。

var myAssembly = typeof (Program).Assembly; foreach (Type usedType in myAssembly.GetUsedTypes()) { if (typeof (Thread).IsAssignableFrom(usedType) || typeof (ThreadPool).IsAssignableFrom(usedType) || typeof (ThreadPriority).IsAssignableFrom(usedType) ) { throw new SecurityException("Thread usage is banned here!"); } } 

线程在单个进程中运行,并且您应该安全,因为您的不可信代码无法更改进程的优先级。 (有关详细信息,请参阅此处的MSDN。)

我不确定,即使在一个进程中创建10k线程也一定会杀死Windows – 至少,不是Windows NT以上的任何版本的Windows。 你的进程几乎肯定会停止运行,但是,所以你可能要考虑两个进程,并使用远程或WCF等机制在它们之间进行通信。

也许HostProtectionAttribute是正确的限制线程操作不受信任的代码?