Чому PL / Python не довіряють?


11

Згідно з документами:

PL / Python доступний лише як "недовірена" мова, це означає, що він не пропонує жодного способу обмеження того, що можуть робити в ньому користувачі, і тому називається plpythonu. Довірений варіант plpython може стати доступним у майбутньому, якщо в Python буде розроблений захищений механізм виконання.

Чому саме важко розробити захищений механізм виконання для Python, але не для інших мов, таких як Perl?

Відповіді:


13

Це стосується об'єктної моделі Python - завжди є спосіб отримати посилання на об'єкти, які можуть бути небезпечними. Перегляньте документацію модуля rexec та розділ із обмеженим виконанням документів, щоб отримати інформацію про проблеми, а також:

Обмеження не мають нічого спільного з PostgreSQL його самості, вони притаманні реалізації інтерпретатора CPython або, можливо, навіть самій мові Python.

Деякі інші мови перевіряли час виконання, наприклад Perl, Java, JavaScript та Lua. Більшість із них стикаються з низкою питань безпеки, оскільки такі обмежені середовища виконання дуже важко захистити від усіх можливих подій у в'язниці.

Насправді ніщо не заважає PostgreSQL додавати напівнавірений інтерпретатор Python, оскільки rexec є "досить хорошим" для багатьох цілей. PostgreSQL, як правило, не захоплюється лише - здебільшого, добротним, досить добрим - можливо, хоча. Це, мабуть, буде прийнято лише в тому випадку, якщо він позначений лише для суперпользователя, але ви завжди зможете надати доступ до нього певним користувачам. Це було б краще, ніж ненадійний Python.

Особисто я думаю, що PL / V8 або подібне - це майбутнє тут, і я хотів би, щоб він рухався до того, щоб підтримувати його в ядрі.

Я також невиразно досліджував ідею надійного Mono, яке може завантажувати "безпечні" збірки, написані на C #, VB.NET, IronPython чи іншому, але не змогли багато зробити з цієї теми.


Я ніколи не бачив це як причину, чому це вважається ненадійним. За замовчуванням Java, V8, TCL, R та інші вважаються ненадійними. Єдина причина, якій Perl довіряють, - це те, що вони
надсилають

1
@ TheSteve0 Ви, можливо, не бачили його як такого, але саме тому так і є. PostgreSQL використовував plpythonu, і він був видалений після знецінення rexecмодуля Python як власне незахищеного, як пов'язано вище. Я думаю, що, можливо, PLpython, що використовує PyPi, зможе надати обмежений режим, який тоді може використовувати Pg. Я не дивився, чи є багато роботи. Ви також неправильно ставитесь до "спеціальної довіреної версії Perl" - це насправді абсолютно звичайний Perl, той же перекладач використовується для plperl та plperlu. Різниця полягає в конфігурації виконання.
Крейг Рінгер

@ TheSteve0 plperl налаштовує випадки інтерпретатора Perl по-різному під час виконання. Див plperl.c для деталей Gorey, в зокрема , pp_require_safeі plperl_trusted_init. Я не знаю достатньо, щоб мати багато думок щодо справжньої безпеки обмеженого виконання Perl. Я хотів би побачити надійну версію Lua або покращити розум і прийняття, довірений інтерпретатор JavaScript. Але те, що ми маємо, є на сьогоднішній день.
Крейг Рінгер

@ TheSteve0 BTW, Java JVM, що використовує код Java або Groovy, або Mono VM з використанням C # або VB.NET, здається, мають багато сенсу, оскільки обидва періоди виконання мають надійну функцію пісочниці та управління безпекою. Наприклад, SecurityManager Java. Але, на жаль, обидва періоди виконання використовують важкі моделі запуску, потокові, спільно використовувані за замовчуванням моделі виконання, які погано підходять для легкого процесу PostgreSQL, розділеного нічим не за замовчуванням fork () - без моделі exec. Вони насправді не можуть розщедритися (). Тому ми не можемо використовувати їх дуже ефективно в PostgreSQL.
Крейг Рінгер

Читачів тут може зацікавити цей випуск GitHub, який я зробив у проекті Mono, використовуючи Mono in fork () ing runtimes: github.com/mono/mono/isissue/11857
Крейг Рінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.