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ウェブブラウザで使用されており、アーキテクチャを説明するドキュメントがあります。

基本的な考え方は、メインアプリと通信するためのすべてのロジックを含むプラグインライター用のライブラリを提供することです。このように、プラグインの作成者は、DLLを作成しているかのように、使用するAPIを使用できます。ウィキペディアには、プロセス間通信(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)OSのセキュリティ機能を利用して、DLLの検索や読み込み元のフォルダへの不正アクセスを防止できますか?それがあなたの最初のアプローチであるべきです。

それ以外の場合:脅威分析を実行します-リスクは何か、既知の攻撃ベクトルは何かなど。

(2)必ずしもそうとは限りません。コンパイルされたプラグインが必要な場合は、これが最も簡単です。これは主に、パフォーマンス、OS機能へのアクセスなどの問題です。すでに述べたように、スクリプト言語を検討してください。

(3)通常、「悪意のあるコードの実行を防ぐために、プラグインフォルダへのアクセスを制限する」と記述します。

(4)まだ慣れていないプラグインフレームワークを使用している場合でも、かなりの追加コストがかかります。それはコストを増加させます:

  • コアアプリケーション(プラグイン機能)
  • プラグイン(はるかに高い分離)
  • インストール
  • デバッグ+診断(プラグインの特定の組み合わせでのみ発生するバグ)
  • 管理(ユーザーはプラグインを知って管理する必要があります)

それは次の場合にのみ支払います

  • メインソフトウェアのインストール/更新は、プラグインの更新よりもはるかに複雑です
  • 個々のコンポーネントを個別に更新する必要があります(たとえば、ユーザーが異なるバージョンのプラグインを組み合わせる場合があります)
  • 他の人があなたのメインアプリケーション用のプラグインを開発します

(コードをDLLに移動することには他にも利点がありますが、プラグイン自体には関係ありません)

于 2010-05-10T12:34:17.277 に答える
1

悪意のあるコードがDLLとして作成された場合はどうなりますか

一般的に、dllを信頼していない場合は、何らかの方法でロードすることはできません。

これは、たとえそれが解釈されたとしても、他のほとんどすべての言語に対して正しいでしょう。

Javaおよび一部の言語は、ユーザーが実行できることを制限するために非常に困難な作業を行います。これは、仮想マシンで実行されるためにのみ機能します。

だからいいえ。DLLがロードされたプラグインは、信頼できるソースからのみ取得できます。

プラグインデザインパターンを実装するために利用できる唯一の方法はDLLを使用していますか?

コードにインタプリタを埋め込むこともできます。たとえば、GIMPではPythonでプラグインを記述できます。

ただし、インタプリタ言語の性質上、これははるかに遅くなることに注意してください。

于 2010-05-10T12:20:13.960 に答える
1

モジュールを使用して機能を拡張するという点で、非常によく似た製品があります。

私たちは2つのことをします:

  1. 裏でDLLであるBPLファイルを使用します。これは、C++Builder内のBorland/Codegear/Embarcaderoの特定のテクノロジーです。いくつかのRTTIタイプの機能を利用して、メイン(argv [])に似た単純なAPIを公開し、DLLによって任意の数のパラメーターをスタックにプッシュしてポップオフできるようにします。

  2. また、本質的にビジネスロジックであるもののために、PERLをアプリケーションに組み込みます。

私たちのソフトウェアは会計/ERPスイートです。

于 2010-05-10T16:32:50.507 に答える
0

既存のプラグインアーキテクチャを見て、再利用できるものがあるかどうかを確認してください。http://git.dronelabs.com/ethos/about/は、glib+プラグインをグーグルで検索しているときに出くわしたリンクの1つです。glib自体は、プラグインアーキテクチャの開発が容易な場合があります。Gstreamerはglibを使用しており、いくつかのアイデアを提供する可能性のある非常に優れたプラグインアーキテクチャを備えています。

于 2010-05-10T16:53:26.010 に答える