我正在编写一些可以加载第三方程序集的c#.
如果第三方决定是恶意的,他们可以编写一个递归函数,最终会出现在StackOverflowException中,从而导致我的应用程序崩溃.
是否可以检测递归函数?
更新: 对于像while(true)或(;;)这样的不良状态,我已经有了解决方案.本质上,我在一个单独的线程中运行第三方代码,如果线程花费的时间超过固定的持续时间,我就拔掉插件.这不适用于递归,因为达到堆栈限制非常快.
更新: 也许我错误地表达了我所追求的解决方案.如果我最终得到大量故意恶意代码,我将更改应用程序以在单独的进程中运行第三方代码.但是在这个阶段,我假设代码只会导致问题,因为它编写得很糟糕.
接受的答案 我已经决定最好的方法是在一个单独的过程中运行第三方库.我可以运行多个进程实例,甚至可以跨进程对我的第三方库进行一种负载平衡.如果执行杀死其中一个进程的恶意代码,我应该能够检测到哪个库将其杀死,将该库标记为恶意,并使用所有非恶意库重新启动该进程.
感谢大家的好建议!
在一般情况下这样做并不容易.此外,递归是编程的有用工具,完全禁止它并不是一个好主意.
更好的想法是在另一个进程中运行程序集,并使用进程间通信机制从可信进程调用方法.
假设您找到了一种方法来执行不可能的操作并检测递归.大.这有帮助吗?没有.没有什么可以阻止敌对程序集简单地使用throw语句抛出异常.
此外,这是你遇到的最少的问题.如果你有不受信任的恶意代码,他们会比简单地抛出一个例外以消除这个过程更加肮脏.他们将试图窃取秘密信息,安装rootkit,你可以命名.敌对代码想要做的最后一件事就是抛出异常 ; 这样做会引起对恶意代码的注意.它会触发将要分析的自动报告.恶意代码的作者想要避免被发现,而不是大声地引起对攻击的注意!
如果您拥有部分受信任的第三方程序集,那么请使用我们为您提供的工具.不要试图自己解决不可能出现的问题,而是花费宝贵的时间使用Code Access Security系统来实现它的目的:处理部分信任代码.
您可能想要研究的是MEF,这是一个由VSTO团队设计的框架,用于处理可能具有部分信任的托管附加组件.(多年前我为MEF做了一些早期的设计和安全审查工作,但我很早就离开了团队,并且无论如何都不是专家.)
| 归档时间: |
|
| 查看次数: |
1368 次 |
| 最近记录: |