¿Por qué PL / Python no es de confianza?

11

Según los documentos:

PL / Python solo está disponible como un lenguaje "no confiable", lo que significa que no ofrece ninguna forma de restringir lo que los usuarios pueden hacer en él y, por lo tanto, se llama plpythonu. Una variante confiable plpython podría estar disponible en el futuro si se desarrolla un mecanismo de ejecución seguro en Python.

¿Por qué exactamente es difícil desarrollar un mecanismo de ejecución seguro para Python pero no para otros lenguajes como Perl?

foobar0100
fuente

Respuestas:

13

Tiene que ver con el modelo de objetos de Python: siempre hay una manera de obtener una referencia a los objetos que podrían ser inseguros. Consulte la documentación del módulo rexec y el capítulo de ejecución restringida de los documentos para obtener información sobre los problemas, así como:

Las limitaciones no tienen nada que ver con PostgreSQL en sí mismo, son inherentes a la implementación del intérprete CPython o posiblemente incluso al lenguaje Python.

Algunos otros idiomas han verificado tiempos de ejecución, como Perl, Java, JavaScript y Lua. La mayoría de ellos se han enfrentado a una serie de problemas de seguridad, ya que estos entornos de ejecución confinados son muy difíciles de proteger contra todos los posibles ataques de jailbreak.

Realmente no hay nada que impida que PostgreSQL agregue un intérprete de Python semitrusted, ya que rexec es "lo suficientemente bueno" para muchos propósitos. Sin embargo, PostgreSQL no tiende a interesarse en solo, en su mayoría, un poco lo suficientemente bueno. Probablemente solo se acepte si se marca solo como superusuario, pero siempre se puede otorgar acceso para usuarios específicos. Sería mejor que Python no confiable.

Personalmente, creo que PL / V8 o similar es el futuro aquí, y me gustaría ver que se mueva hacia ser compatible con el núcleo.

También he explorado vagamente la idea de un Mono confiable que pueda cargar ensamblajes "seguros" escritos en C #, VB.NET, IronPython o lo que sea, pero no he podido hacer mucho sobre ese tema.

Craig Ringer
fuente
Nunca he visto esto como una razón por la cual se considera no confiable. Por defecto, Java, V8, TCL, R y otros se consideran no confiables. La única razón por la que se confía en Perl es porque envían una versión especial de confianza de Perl con PostgreSQL postgresql.org/docs/11/plperl-trusted.html
TheSteve0
1
@ TheSteve0 Puede que no lo hayas visto como tal, pero es por eso que es así. PostgreSQL solía tener plpythonu, y se eliminó después de la depreciación del rexecmódulo Python como inherentemente inseguro, como se vincula anteriormente. Me imagino que tal vez un plpython que usa PyPi podría entregar un modo restringido que Pg podría usar. No he buscado ver si hay mucho trabajo. También es incorrecto acerca de una "versión especial confiable de Perl": de hecho, es Perl perfectamente normal, el mismo intérprete se usa para plperl y plperlu. La diferencia es la configuración del tiempo de ejecución.
Craig Ringer
@ TheSteve0 plperl configura las instancias del intérprete Perl de manera diferente en tiempo de ejecución. Ver plperl.c para los detalles gorey, específicamente pp_require_safey plperl_trusted_init. No sé lo suficiente como para tener una gran opinión sobre la verdadera seguridad de la ejecución restringida de Perl. Preferiría ver una versión confiable de Lua u obtener una mejor distribución mental y adopción, un intérprete de JavaScript confiable. Pero lo que tenemos es plperl por ahora.
Craig Ringer el
@ TheSteve0 BTW, Java JVM con código Java o Groovy, o Mono VM con C # o VB.NET parecería tener mucho sentido ya que ambos tiempos de ejecución tienen características de gestión de seguridad y sandbox robustas. SecurityManager de Java, por ejemplo. Pero desafortunadamente, ambos tiempos de ejecución usan modelos de ejecución de inicio pesado, roscado, compartido de todo por defecto que no se ajustan bien al proceso ligero de PostgreSQL fork-nothing-by-default fork (), sin el modelo exec. No son realmente capaces (). Por lo tanto, no podemos usarlos de manera muy efectiva en PostgreSQL.
Craig Ringer el
Los lectores aquí podrían estar interesados ​​en este tema de GitHub que hice en el proyecto Mono usando Mono en fork () ing runtimes: github.com/mono/mono/issues/11857
Craig Ringer