Как построить безопасную (ограниченную экосистему) архитектуру на основе плагинов (в Kotlin) - PullRequest
1 голос
/ 09 февраля 2020

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

interface PluginI {
    val core: CoreApplication   // Means of communication with core app, this obj is sent by core app by constructor

    fun version(): Double
    suspend fun load(pluginConfiguration: PluginConfiguration)
    suspend fun run()
}

Но как плагин должен быть ограничен какой-либо областью, такой как защита от возможного разрушения, взлома или сбоя основного приложения? Особенно следует ограничить использование чего-либо из классов javm stati c, таких как System, например, некоторые приложения для взлома могут использовать System.getRuntime().exec() для выполнения эксплойтов в оболочке.

Песочница не является решением, или это? Потому что это просто разрывает соединение между основным приложением и плагином.

Я ищу решение, которое дает только общий объект, из которого основное приложение связывается с плагином и отправляет некоторую информацию, которую хочет такие как дата / время или что-то, что не может повредить время выполнения.

1 Ответ

1 голос
/ 13 февраля 2020

Создание изолированной среды в java практически невозможно, с java 9+ вы можете использовать модули, чтобы сделать это немного проще ... особенно если вы хотите разрешить какие-то отражения.

Но разрешить размышления иначе очень сложно и рискованно, и все, что вы делаете, должно определенно работать как белый список, черные списки просто «не работают» (иначе, я не верю, что кто-нибудь сможет найти все, что нужно включить, и не забывайте обновлять его при обновлении любых ваших зависимостей).

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

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

Также просто помните, что независимо от того, что вы делаете, кто-то может вызвать нестабильность работы вашего приложения, особенно если вы разрешите любой тип ввода-вывода или собственную многопоточность. , Но плагин все еще может выделять огромный объем памяти или просто запускать бесконечно l oop - или фактически одновременно оба;) И в java нет никакого способа либо принудительно остановить поток, либо ограничить объем выделенной памяти из некоторого кода.
Единственное частичное решение для этого, которое я мог бы увидеть, - это использовать java агент для инструментирования кода каждого плагина и добавления проверки вызовов, если поток был прерван внутри какого-либо кода, который может работать слишком долго.
То же самое было бы возможно с распределениями.
Но тогда вы также должны быть на 100% уверены, что ни один из перечисленных в списке методов не может l oop или выделить слишком много сразу.

По существу: не .

Это хорошее решение (без агента), если вы можете немного доверять плагину, но вы просто хотите установить некоторые правила, чтобы избежать плохих практик. Это не остановит того, кто хочет что-то сломать, но остановит типичного программиста от создания неочищенного кода.

Если вам нужно запустить ненадежный код ... либо запустите его в реальной изолированной программной среде на уровне ОС, например посмотрите на движок сферы и общайтесь с ним только безопасным способом.
Или используйте другой язык, который предлагает вам сделать то же, что указано выше, но гораздо проще, например Lua. http://lua-users.org/wiki/SandBoxes Затем вы можете запустить такой язык из java, используя скрипт-движок https://github.com/luaj/luaj Но даже тогда трудно быть на 100% уверенным, что он будет работать правильно, и что нет дыры, которые кто-то найдет и использует, поскольку это не займет много времени, если злоумышленнику потребуется только нагрузка на процессор / память, достаточную для разрушения основного приложения.

...