Por que o PL / Python não é confiável?

11

De acordo com os documentos:

O PL / Python está disponível apenas como uma linguagem "não confiável", o que significa que ele não oferece nenhuma maneira de restringir o que os usuários podem fazer nele e, portanto, é denominado plpythonu. Uma variante confiável plpython pode se tornar disponível no futuro se um mecanismo de execução seguro for desenvolvido no Python.

Por que exatamente é difícil desenvolver um mecanismo de execução seguro para Python, mas não para outras linguagens como Perl?

foobar0100
fonte

Respostas:

13

Tem a ver com o modelo de objeto do Python - sempre há uma maneira de obter uma referência a objetos que podem não ser seguros. Consulte a documentação do módulo rexec e o capítulo de execução restrita dos documentos para obter algumas informações sobre os problemas, bem como:

As limitações não têm nada a ver com o PostgreSQL, são inerentes à implementação do interpretador CPython ou, possivelmente, até à linguagem Python.

Algumas outras linguagens verificaram tempos de execução, como Perl, Java, JavaScript e Lua. A maioria deles enfrentou uma série de problemas de segurança, pois esses ambientes de execução confinados são muito difíceis de proteger contra todas as possíveis explorações de jailbreak.

Não há realmente nada impedindo o PostgreSQL de adicionar um interpretador Python semitrusted, pois o rexec é "bom o suficiente" para muitos propósitos. O PostgreSQL não tende a gostar apenas de apenas o tipo de bom o suficiente. Provavelmente, isso só será aceito se marcado como somente superusuário, mas você sempre poderá conceder acesso a ele para usuários específicos. Seria melhor do que Python não confiável.

Pessoalmente, acho que o PL / V8 ou similar é o futuro aqui e gostaria de vê-lo avançar para ser apoiado no núcleo.

Eu também explorei vagamente a idéia de um Mono confiável que pode carregar assemblies "seguros" escritos em C #, VB.NET, IronPython ou qualquer outra coisa, mas que não conseguiu fazer muito sobre esse tópico.

Craig Ringer
fonte
Eu nunca vi isso como uma razão pela qual é considerado não confiável. Por padrão, Java, V8, TCL, R e outros são considerados não confiáveis. A única razão Perl tem a confiança é bc eles enviam um especial de confiança versão do Perl com PostgreSQL postgresql.org/docs/11/plperl-trusted.html
TheSteve0
11
@ TheSteve0 Você pode não ter visto isso como tal, mas é por isso que é assim. O PostgreSQL costumava ter o plpythonu e foi removido após a descontinuação do rexecmódulo Python por ser inerentemente inseguro, conforme vinculado acima. Eu imagino que talvez um plpython usando PyPi possa entregar um modo restrito que a Pg possa usar. Não olhei para ver se há muito trabalho. Você também está incorreto em relação a uma "versão confiável confiável do Perl" - na verdade, é perfeitamente comum o Perl, o mesmo intérprete é usado para o plperl e o plperlu. A diferença é a configuração do tempo de execução.
Craig Ringer
@ TheSteve0 plperl configura as instâncias do interpretador Perl de maneira diferente no tempo de execução. Veja plperl.c para os detalhes de gorey, especificamente pp_require_safee plperl_trusted_init. Eu não sei o suficiente para ter muita opinião sobre a verdadeira segurança da execução restrita de Perl. Eu preferiria ver uma versão confiável do Lua ou obter uma melhor compreensão e adoção, um intérprete JavaScript confiável. Mas o que temos é menos por enquanto.
Craig Ringer
@ TheSteve0 BTW, a JVM Java usando código Java ou Groovy ou a VM Mono usando C # ou VB.NET parece fazer muito sentido, pois os dois tempos de execução têm recursos robustos de gerenciamento de segurança e sandbox. SecurityManager do Java, por exemplo. Mas, infelizmente, os dois tempos de execução usam modelos de execução de inicialização pesada, encadeados e compartilhados com tudo por padrão, que são inadequados para o modelo leve do processo leve do PostgreSQL, que não compartilha nada por padrão () - sem modelo exec. Eles não são realmente capazes de fork (). Portanto, não podemos usá-los de maneira muito eficaz no PostgreSQL.
Craig Ringer
Os leitores aqui pode estar interessado neste assunto GitHub que fiz sobre o projeto Mono re usando Mono em fork () ing tempos de execução: github.com/mono/mono/issues/11857
Craig Ringer