【问题标题】:C#: how can I sanitize arbitrary code to prevent malicious attacks?C#:如何清理任意代码以防止恶意攻击?
【发布时间】:2018-04-14 20:32:41
【问题描述】:

我有一个 C++ 程序,它允许用户输入任意 C#(.NET 兼容)脚本,然后在运行时对其进行解释,并允许用户通过我的程序的 C#(.NET)在一定程度上自定义我的程序的功能) API。

当用户将他们的工作保存在我的程序中时,他们的脚本会与他们的文件一起保存,并在下次运行程序并加载他们的文件时自动执行/解释。

显然,如果用户想用恶意代码破坏他们自己的机器,那么他们的权力就更大了。但是,由于我的软件的性质,它们很有可能让用户彼此共享文件……因此用户可能会向其他用户发送恶意代码(通过这个 C# 脚本接口)。

一些变通方法可能是在文件包含脚本时警告用户,在自动执行之前等……但这仍然留下错误的空间……如果用户错误地忽略了此类警告,他们仍然保持打开状态去攻击。

有没有办法获取一堆任意 C# 代码,并确定它是否包含可用于删除/重命名/移动/修改/损害系统文件的任何代码?基本上是一种确保某些任意 c# 代码不会尝试更改系统上的任何文件的方法?或者可能是一种简单地防止解释器加载任何文件访问 .NET 程序集的方法?

【问题讨论】:

  • 你可以看看What is a partially trusted assembly/application/code/etc in .NET?——虽然我对partial trust知之甚少,不知道它是否对你有帮助。
  • 您可能想阅读以下内容:docs.microsoft.com/en-us/dotnet/framework/misc/…,但请注意,目前不鼓励在您的场景中使用它。尽管如此,我还是会说它总比没有好。
  • 如果您的程序真的只允许有能力的用户为自己编写 C# 脚本,那么可能根本没有必要清理脚本 - 毕竟他们会故意破坏自己而不是其他人。另一方面,如果您有类似插件系统的东西,其中可能会加载和执行不受信任的 3rd 方代码,那么 C# 脚本不是一个好方法。正如其他人所指出的,不推荐部分信任,因为它存在太多漏洞。相反,Javascript 或 Lua 等嵌入式脚本语言正是为此目的而开发的。

标签: c#


【解决方案1】:

没有已知的方法可以做到这一点。部分信任不起作用,并且在几年前被弃用为信任边界。如果代码真的是恶意的,那么你就是在为共享打开一个很大的安全漏洞。

处理它的一种方法是创建一个共享站点,您可以在其中阻止在该站点上编写脚本。您可以自动阻止带有“互联网标记”的文件上的脚本,并使其不是单击按钮,而是允许加载单个软件的真正复杂的步骤,包括例如查看 C# 代码。你可以看看 chrome 对不受信任的证书做了什么作为例子。

最终你只是打开了一个安全漏洞,并不能真正插入恶意代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2014-06-16
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多