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

Rob*_*ert 5 c# recursion

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

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

是否可以检测递归函数?

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

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

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

感谢大家的好建议!

Meh*_*ari 8

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

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

  • 或者使用单独的AppDomain.如果它开始行为不端,你可以杀死整个AppDomain. (4认同)
  • @cdhowie:在单独的`AppDomain'中运行也不完全安全.有一些偷偷摸摸的方法来取消整个应用程序.例如,请参阅:http://stackoverflow.com/questions/3906282/can-i-prevent-an-uncaught-exception-in-another-appdomain-from-shutting-down-the-a通常,AppDomains隔离数据很好,但它们不隔离线程,这是问题的根源. (2认同)

Eri*_*ert 8

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

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

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

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

  • @Robert:对于安全性而言,持续80%是一种​​根本不好的态度.假设您的银行决定仅对其保险库发动80%的攻击.**有动力的攻击者会发现无保护的20%**.如果你想阻止攻击者取消你的进程,那么*不要在你的进程中运行他们的代码*.在自己的appdomain中运行它,甚至更好,在它自己的进程中运行它(甚至更好的是它自己的虚拟机.)去寻求100%的解决方案; 你想让攻击者伤害你的用户*不可能*. (2认同)