防止不受信任的 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的主要内容,如果未能解决你的问题,请参考以下文章

将不受信任的java代码限制为单个线程[重复]

在运行不受信任的用户代码时阻止 Node.js 中的系统调用

如何阻止不受信任的证书?

防止不受信任的客户端使用 REST API 的登录/注册端点

执行不受信任的代码

证书服务重装后,没法启动,提示:“已处理证书链,但是在不受信任提供程序信任的根证书中终止