Лучший способ реализации инфраструктуры плагинов - являются ли DLL единственными способами (проект C / C ++)? - PullRequest
4 голосов
/ 10 мая 2010

Введение

В настоящее время я занимаюсь разработкой программного обеспечения для классификации документов на C / C ++ и буду использовать наив-байесовскую модель для классификации. Но я хотел, чтобы пользователи использовали любой алгоритм, который они хотят (или я хочу в будущем), поэтому я решил отделить часть алгоритма в архитектуре как плагин, который будет присоединен к основному запуску app @ app. Следовательно, любой пользователь может написать свой собственный алгоритм в качестве плагина и использовать его с моим приложением.

Постановка задачи:

Способ, которым я намереваюсь разработать это, состоит в том, чтобы каждый из алгоритмов, которые пользователь хочет использовать, был превращен в файл DLL и помещен в определенный каталог. И в начале, мое приложение будет искать все библиотеки DLL в этом каталоге и загружать их.

Мои вопросы:

(1) Что делать, если вредоносный код создается в виде DLL (и будет иметь те же функции, что и инфраструктура плагинов) и помещаться в каталог моих плагинов? В этом случае мое приложение будет считать, что это плагин, и выбирает его, и вызывает его функции, поэтому вредоносный код может легко уничтожить все мое приложение (в худшем случае мое приложение может стать вредоносным средством запуска кода !!!) .

(2) Является ли использование DLL единственным способом реализации шаблона проектирования плагинов? (Не только из-за страха перед злонамеренным плагином, но и из общего любопытства :))

(3) Я думаю, что многие программные продукты написаны с моделью плагинов для расширяемости, если так, как они защищаются от таких атак?

(4) В целом, что вы думаете о моем решении использовать модель плагина для расширяемости (как вы думаете, мне следует рассмотреть любые другие альтернативы?)

Спасибо

-MicroKernel:)

Ответы [ 7 ]

6 голосов
/ 10 мая 2010
  1. Не беспокойтесь о вредоносных плагинах. Если кому-то удалось проникнуть в эту папку вредоносную DLL-библиотеку, он, вероятно, также имеет право напрямую выполнять какие-либо действия.

  2. В качестве альтернативы DLL вы можете подключить язык сценариев, такой как Python или Lua, и разрешить скриптовые плагины. Но, может быть, в этом случае вам нужна скорость скомпилированного кода?

    Для встраивания Python см. здесь . Процесс не очень сложный. Вы можете статически связываться с интерпретатором, поэтому пользователям не нужно устанавливать Python в своей системе. Однако любые не встроенные модули необходимо будет поставлять вместе с вашим приложением.

    Однако, если язык не имеет для вас большого значения, встраивание Lua , вероятно, проще, потому что он был специально разработан для этой задачи. См. этот раздел своего руководства.

  3. См. 1. Они не.

  4. Использование модели плагина звучит как хорошее решение, при условии, что отсутствие расширяемости действительно является проблемой на данный момент. Возможно, будет проще жестко закодировать вашу текущую модель и добавить интерфейс плагина позже, если окажется, что на самом деле есть спрос на нее. Его легко добавить, но трудно удалить, как только люди начали его использовать.

4 голосов
/ 10 мая 2010

Вредоносный код - не единственная проблема с DLL. Даже в деликатных DLL-файлах может содержаться ошибка, которая может привести к сбою всего приложения или постепенной утечке памяти.

Загрузка модуля на языке высокого уровня несколько снижает риск. Если вы хотите узнать о встраивании Python, например, документация находится здесь .

Другой подход заключается в запуске плагина в отдельном процессе. Это требует немного больше усилий с вашей стороны, но гораздо безопаснее. Подход с использованием отдельных процессов используется веб-браузером Google Chrome, и у них есть документ, описывающий архитектуру .

Основная идея заключается в предоставлении библиотеки для авторов плагинов, которая включает в себя всю логику для связи с основным приложением. Таким образом, у автора плагина есть API, который они используют, как если бы они писали DLL. В Википедии есть хороший список способов межпроцессного взаимодействия (IPC) .

3 голосов
/ 10 мая 2010

(1) Можете ли вы использовать средства обеспечения безопасности ОС, чтобы предотвратить несанкционированный доступ к папке, в которой производится поиск или загрузка DLL-файлов? Это должен быть ваш первый подход.

В противном случае: выполните анализ угроз - каков риск, каковы известные векторы атак и т. Д.

(2) Не обязательно. Это самое прямолинейное решение, если вам нужны скомпилированные плагины - в основном это вопрос производительности, доступа к функциям ОС и т. Д. Как уже упоминалось, рассмотрим языки сценариев.

(3) Обычно, написав «чтобы предотвратить выполнение вредоносного кода, ограничьте доступ к папке плагина».

(4) Существуют некоторые дополнительные расходы - даже при использовании инфраструктуры плагинов, с которой вы еще не знакомы. это увеличивает стоимость:

  • базовое приложение (функциональность плагина)
  • Плагины (намного более высокая изоляция)
  • установка
  • отладка + диагностика (ошибки, возникающие только при определенной комбинации плагинов)
  • администрирование (пользователи должны знать и управлять плагинами)

Это платит только если

  • Установка / обновление основного программного обеспечения намного сложнее, чем обновление плагинов
  • отдельные компоненты должны обновляться индивидуально (например, пользователь может комбинировать разные версии плагинов)
  • другие люди разрабатывают плагины для вашего основного приложения

(Есть и другие преимущества перемещения кода в DLL, но они не относятся к плагинам как таковым)

3 голосов

1) Если в папке вашего плагина есть вредоносная dll, вы, вероятно, уже взломаны.

2) Нет, вы можете динамически загружать код сборки из файла, но это будет просто изобретать колесо, просто используйте DLL.

3) Расширения Firefox этого не делают, даже с его плагинами javascript. Все остальное, что я знаю, использует нативный код из динамических библиотек, и поэтому невозможно гарантировать безопасность. С другой стороны, в Chrome есть NaCL, который проводит расширенный анализ двоичного кода и отклоняет его, если он не может быть на 100% уверен, что он не нарушает границы, а что нет, хотя я уверен, что со временем у них будет все больше и больше уязвимостей. .

4) Плагины в порядке, просто ограничьте их доверенными людьми. В качестве альтернативы вы можете использовать безопасный язык, такой как LUA, Python, Java и т. Д., И загружать файл на этот язык, но ограничивать его только подмножеством API, которое не повредит вашей программе или среде.

1 голос
/ 10 мая 2010

У нас очень похожий продукт, в котором используются модули для расширения функциональности.

Мы делаем две вещи:

  1. Мы используем файлы BPL, которые являются DLL-файлами под обложками. Это специальная технология от Borland / Codegear / Embarcadero в C ++ Builder. Мы используем некоторые возможности RTTI-типа для публикации простого API, аналогичного основному (argv []), поэтому любое количество параметров может быть помещено в стек и удалено из DLL.

  2. Мы также встраиваем PERL в наше приложение для вещей, которые по своей природе более логичны.

Наше программное обеспечение представляет собой пакет учета / ERP.

1 голос
/ 10 мая 2010

Что делать, если вредоносный код создан как DLL

Как правило, если вы не доверяете dll, вы не можете загрузить его так или иначе.

Это будет правильным почти для любого другого языка, даже если он интерпретируется.

Java и некоторые языки очень тяжело ограничивают возможности пользователей, и это работает только потому, что они работают на виртуальной машине.

Так нет. Загружаемые Dll плагины могут поступать только из доверенных источников.

Является ли использование DLL единственным способом реализации шаблона проектирования плагинов?

Вы также можете встроить некоторый интерпретатор в ваш код, например, GIMP позволяет писать плагины в питоне.

Но следует учитывать тот факт, что это будет намного медленнее, потому что, если природа любого интерпретируемого языка.

0 голосов
/ 10 мая 2010

Посмотрите на существующие архитектуры плагинов и посмотрите, есть ли что-нибудь, что вы можете использовать повторно. http://git.dronelabs.com/ethos/about/ - это одна ссылка, с которой я столкнулся, когда гуглял glib + плагин. сам glib может облегчить разработку архитектуры плагинов. Gstreamer использует glib и имеет очень хорошую архитектуру плагинов, которая может дать вам некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...