繁体   English   中英

是否可以在不受信任的程序集(c#)中检测递归函数?

[英]Is it possible to detect a recursive function in an untrusted assembly (c#)?

我正在编写一些可以加载第三方程序集的c#。

如果第三方决定是恶意的,他们可以编写一个递归函数,最终会出现在StackOverflowException中,从而导致我的应用程序崩溃。

是否可以检测递归函数?

更新:对于像while(true)或(;;)这样的不良状态,我已经有了解决方案。 本质上,我在一个单独的线程中运行第三方代码,如果线程花费的时间超过固定的持续时间,我就拔掉插件。 这不适用于递归,因为达到堆栈限制非常快。

更新:也许我错误地表达了我所追求的解决方案。 如果我最终得到大量故意恶意代码,我将更改应用程序以在单独的进程中运行第三方代码。 但是在这个阶段,我假设代码只会导致问题,因为它编写得很糟糕。

接受的答案我已经决定最好的方法是在一个单独的过程中运行第三方库。 我可以运行多个进程实例,甚至可以跨进程对我的第三方库进行一种负载平衡。 如果执行杀死其中一个进程的恶意代码,我应该能够检测到哪个库将其杀死,将该库标记为恶意,并使用所有非恶意库重新启动该进程。

感谢大家的好建议!

在一般情况下这样做并不容易。 此外,递归是编程的有用工具,完全禁止它并不是一个好主意。

更好的想法是在另一个进程中运行程序集,并使用进程间通信机制从可信进程调用方法。

假设您找到了一种方法来执行不可能的操作并检测递归。 大。 这有帮助吗? 没有。没有什么可以阻止敌对程序集简单地使用throw语句抛出异常

此外,这是你遇到的最少的问题。 如果你有不受信任的恶意代码,他们会比简单地抛出一个例外以消除这个过程更加肮脏。 他们将试图窃取秘密信息,安装rootkit,你可以命名。 敌对代码想要做的最后一件事就是抛出异常 ; 这样做会引起对恶意代码的注意。 它会触发将要分析的自动报告。 恶意代码的作者想要避免被发现,而不是大声地引起对攻击的注意!

如果您拥有部分受信任的第三方程序集,那么请使用我们为您提供的工具 不要试图自己解决不可能出现的问题,而是花费宝贵的时间使用Code Access Security系统来实现它的目的:处理部分信任代码。

您可能想要研究的是MEF,它是由VSTO团队设计的框架,用于处理可能具有部分信任的托管附加组件。 (多年前我为MEF做了一些早期的设计和安全审查工作,但我很早就离开了团队,并且无论如何都不是专家。)

您可以在程序集上使用反射并对其进行反编译,以便在您真正担心的情况下查看代码。

http://www.red-gate.com/products/dotnet-development/reflector/

另一种方法是基本上测试组件并针对它运行一些单元类型的测试。

如果您在visual studio中调试应用程序并禁用“只是我的代码”,您将能够在“调用堆栈”中看到递归调用。 这是在.net中查找stackoverflow异常的根本原因的一般建议

好吧,在单独的线程中运行恶意程序集可以降低此类问题的风险。 但是,恶意线程可能很难或无法关闭,因此最好在单独的进程中运行恶意代码(由您自己的代码托管)。 这给你一些能力:

  1. 由于您托管了恶意代码,因此可以对其进行安全限制。
  2. 代码可以低于默认优先级运行,从而降低程序或操作系统本身锁定的可能性。
  3. 如果出现任何问题,你可以杀死这个过程。

总而言之,在加载不受信任的代码时,我通常不会将拒绝服务攻击等视为主要问题,因为如果恶意代码导致我的应用程序停止工作,我将停止使用恶意代码。 当邪恶的代码正在做一些非常脏的事情时,我不知道我会担心。

最后,始终存在不允许用户将C#代码附加到应用程序的核选项。 您始终可以使用自己的特殊脚本语言来授予用户访问所需应用程序的任何部分的权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM