防止不受信任的 C# 代码启动新线程或黑名单/白名单 API
Posted
技术标签:
【中文标题】防止不受信任的 C# 代码启动新线程或黑名单/白名单 API【英文标题】:Prevent untrusted C# code from starting new threads OR blacklist/whitelist APIs 【发布时间】:2011-04-01 03:04:00 【问题描述】:我正在实现一个将加载和执行第 3 方代码的应用程序。
虽然 .NET 沙盒很好,但我找不到阻止代码启动新线程的方法。
这是一个问题,因为 AFAIK 我们无法枚举并安全地中止它们以卸载沙盒 AppDomain - 我们必须退出整个过程。
如何禁止 Thread.Start 或(更好的)白名单/黑名单特定的 CLR API?
【问题讨论】:
【参考方案1】:您需要创建一个脚本环境,而不是运行已编译的代码。在这种环境下,您可以解析出不受支持/不需要的关键字。
http://msdn.microsoft.com/en-us/library/ms974577.aspx
http://osherove.com/blog/2004/2/17/make-your-net-application-support-scripting-a-practical-appr.html
http://www.codeproject.com/KB/library/Dotnet_Scriptor.aspx
可能有一些方法可以限制在 AppDomain 中运行的代码的权限,这就是您所说的沙盒吗?
Good example of use of AppDomain
如果 CPU 和内存出现“坏事”,您可能会强制卸载 AppDomain。
最近在 .net 4 中,我注意到但没有调查 HostProtection 权限...
System.Security.Permissions hostprotectionattribute
=== 编辑 ===
看起来设置了安全权限的 CLR 托管将是可行的方法。链接...
What is CLR hosting?
http://msdn.microsoft.com/en-us/library/hbzz1a9a(v=vs.90).aspx
http://msdn.microsoft.com/en-us/library/h846e9b3(v=vs.90).aspx
http://msdn.microsoft.com/en-us/library/system.security.permissions.securitypermission(v=vs.90).aspx
【讨论】:
这将导致严重的性能损失。我正在创建一个分布式计算环境,速度也很重要,2x 惩罚(C# vs C++)是可以的,而 10-20x(基于 DLR 和/或解释语言)不是。那我宁愿用V8 JS引擎,它比DLR更快...... 说得通...如何将主机保护属性应用于您正在查看调用 3rd 方 dll 的代码部分。即自影响螺纹和外螺纹? 我现在正在研究非托管的 .NET 托管 API,比如这些 - ***.com/questions/3269290/… ,并像 Terrarium 那样手动检查 DLL(参见 terrarium2.codeplex.com/SourceControl/changeset/view/… ),这是一个丑陋的黑客,但似乎可以诀窍 这要求我查看非托管主机,这并不理想,但可以。 随着罗斯林的出现,这也许值得重新审视。以上是关于防止不受信任的 C# 代码启动新线程或黑名单/白名单 API的主要内容,如果未能解决你的问题,请参考以下文章
在运行不受信任的用户代码时阻止 Node.js 中的系统调用