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

时间:2010-12-22 04:09:51

标签: c# recursion

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

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

是否可以检测递归函数?

更新 对于像while(true)或(;;)这样的不受欢迎的场景,我已经有了解决方案。本质上,我在一个单独的线程中运行第三方代码,如果线程花费的时间超过固定的持续时间,我就拔掉插件。由于极快地达到堆栈限制,这对递归效果不佳。

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

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

感谢大家的好建议!

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:0)

如果您真的很担心,可以在程序集上使用反射并对其进行反编译以查看代码。

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

另一种选择是基本上测试程序集并对其运行一些单元类型的测试。

答案 3 :(得分:0)

如果您在visual studio中调试应用程序并禁用“只是我的代码”,您将能够在“调用堆栈”中看到递归调用。这是在.net

中查找stackoverflow异常的根本原因的一般建议

答案 4 :(得分:0)

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

  1. 由于您托管了恶意代码,因此可以对其进行安全限制。
  2. 代码可以低于默认优先级运行,从而减少锁定程序或操作系统本身的可能性。
  3. 如果出现任何问题,你可以杀死这个过程。
  4. 所有这一切,我通常不会认为拒绝服务攻击等是加载不受信任的代码时的主要问题,因为如果恶意代码导致我的应用程序停止工作,我将停止使用邪恶的代码。当邪恶的代码正在做一些非常脏的事情时,我不知道我会担心。

    最后,总是存在核选项,即不允许用户将C#代码附加到您的应用程序。您可以随时使用自己的特殊脚本语言,以便用户访问您所需的应用程序的任何部分。