4

介绍:

我目前正在用 C/C++ 开发一个文档分类器软件,我将使用朴素贝叶斯模型进行分类。但是我希望用户使用他们想要的任何算法(或者我将来想要的),因此我将架构中的算法部分分离为一个插件,该插件将附加到主应用程序@应用程序启动。因此,任何用户都可以将自己的算法编写为插件并将其与我的应用程序一起使用。

问题陈述:

我打算开发这个的方法是将用户想要使用的每个算法都制作成一个 DLL 文件并放入一个特定的目录中。一开始,我的应用程序将搜索该目录中的所有 DLL 并加载它们。

我的问题:

(1) 如果恶意代码被制作为 DLL(并且将具有插件框架要求的相同功能)并放入我的插件目录怎么办?在这种情况下,我的应用程序会认为它是一个插件并选择它并调用它的函数,因此恶意代码很容易让我的整个应用程序崩溃(在最坏的情况下可能使我的应用程序成为恶意代码启动器!!!) .

(2) 使用 DLL 是实现插件设计模式的唯一方法吗?(不仅是因为害怕恶意插件,而且出于好奇,这是一个普遍的问题:))

(3)我认为很多软件都是用插件模型编写的,以实现可扩展性,如果是这样,它们如何防御这种攻击?

(4) 总的来说,您如何看待我决定使用插件模型进行可扩展性的决定(您认为我应该考虑其他替代方案吗?)

谢谢

-微内核:)

4

7 回答 7

6
  1. 不要担心恶意插件。如果有人设法将恶意 DLL 潜入该文件夹,他们可能也有能力直接执行内容。

  2. 作为 DLL 的替代方案,您可以连接 Python 或 Lua 等脚本语言,并允许使用脚本插件。但也许在这种情况下你需要编译代码的速度?

    对于嵌入Python,请参见此处。这个过程不是很困难。您可以静态链接到解释器,因此用户不需要在他们的系统上安装 Python。但是,任何非内置模块都需要随您的应用程序一起提供。

    但是,如果语言对您来说并不重要,嵌入Lua可能更容易,因为它是专门为该任务设计的。请参阅其手册的这一部分

  3. 见 1。他们没有。

  4. 使用插件模型听起来像是一个很好的解决方案,前提是此时缺乏可扩展性确实一个问题。如果事实证明确实有需求,对当前模型进行硬编码并稍后添加插件接口可能会更容易。它很容易添加,但一旦人们开始使用它就很难删除。

于 2010-05-10T12:18:50.390 回答
4

恶意代码并不是 DLL 的唯一问题。即使是一个善意的 DLL 也可能包含一个可能导致整个应用程序崩溃或逐渐泄漏内存的错误。

以高级语言加载模块在一定程度上降低了风险。例如,如果您想了解嵌入 Python,文档在此处

另一种方法是在单独的进程中启动插件。它确实需要您付出更多的努力来实施,但它更安全。Google 的 Chrome 网络浏览器使用了单独的进程方法,并且他们有一个描述架构的文档

基本思想是为插件编写者提供一个库,其中包含与主应用程序通信的所有逻辑。这样,插件作者就有了他们使用的 API,就像他们在编写 DLL 一样。维基百科有一个很好的进程间通信(IPC)方法列表

于 2010-05-10T13:39:32.433 回答
3

1) 如果你的插件文件夹中有恶意 dll,你可能已经被入侵了。

2)不,您可以从文件中动态加载汇编代码,但这只是重新发明轮子,只需使用 DLL。

3) Firefox 扩展没有,即使它的 javascript 插件也没有。我所知道的其他一切都使用来自动态库的本机代码,因此无法保证安全。然后 Chrome 再次拥有 NaCL,它对二进制代码进行广泛的分析,如果不能 100% 确定它没有违反边界,则拒绝它,尽管我确信随着时间的推移它们会有越来越多的漏洞.

4)插件很好,只需将它们限制为可信任的人。或者,您可以使用 LUA、Python、Java 等安全语言,并将文件加载到该语言中,但仅将其限制为不会损害您的程序或环境的 API 子集。

于 2010-05-10T12:27:33.470 回答
3

(1) 您能否使用操作系统安全设施来防止未经授权访问搜索或加载 DLL 的文件夹?这应该是你的第一种方法。

否则:运行威胁分析——风险是什么,已知的攻击媒介是什么等。

(2) 不一定。如果您想要编译插件,这是最直接的——这主要是性能问题、对操作系统功能的访问等。如前所述,请考虑脚本语言。

(3) 通常通过写“防止恶意代码执行,限制对插件文件夹的访问”。

(4) 有相当多的额外成本——即使使用您还不熟悉的插件框架。它增加了以下成本:

  • 核心应用程序(插件功能)
  • 插件(更高的隔离度)
  • 安装
  • 调试 + 诊断(仅在某些插件组合中出现的错误)
  • 管理(用户必须知道并管理插件)

只有当

  • 安装/更新主软件比更新插件复杂得多
  • 单个组件需要单独更新(例如,用户可以组合不同版本的插件)
  • 其他人为您的主应用程序开发插件

(将代码移动到 DLL 中还有其他好处,但它们与插件本身无关)

于 2010-05-10T12:34:17.277 回答
1

如果恶意代码被制作成 DLL 怎么办

通常,如果您不信任 dll,则无法以一种或另一种方式加载它。

这对于几乎任何其他语言都是正确的,即使它是被解释的。

Java 和一些语言非常努力地限制用户可以做什么,这只是因为它们在虚拟机中运行。

所以不行。DLL 加载的插件只能来自受信任的来源。

使用 DLL 是实现插件设计模式的唯一方法吗?

你也可以在你的代码中嵌入一些解​​释器,例如 GIMP 允许在 python 中编写插件。

但是请注意,由于任何解释语言的性质,这会慢得多。

于 2010-05-10T12:20:13.960 回答
1

我们有一个非常相似的产品,它使用模块来扩展功能。

我们做两件事:

  1. 我们使用 BPL 文件,这些文件实际上是 DLL。这是来自 Borland/Codegear/Embarcadero 在 C++ Builder 中的一项特定技术。我们利用一些 RTTI 类型的特性来发布一个类似于 main (argv[]) 的简单 API,因此可以将任意数量的参数压入堆栈并由 DLL 弹出。

  2. 我们还将 PERL 嵌入到我们的应用程序中,以处理本质上更具业务逻辑的事物。

我们的软件是会计/ERP 套件。

于 2010-05-10T16:32:50.507 回答
0

查看现有的插件架构,看看是否有任何可以重用的东西。http://git.dronelabs.com/ethos/about/是我在谷歌搜索 glib + 插件时遇到的一个链接。glib 本身可能更容易开发插件架构。Gstreamer 使用 glib 并且有一个非常好的插件架构,可能会给你一些想法。

于 2010-05-10T16:53:26.010 回答