为什么不信任PL / Python?


11

根据文档:

PL / Python仅作为一种“不受信任的”语言提供,这意味着它不提供任何限制用户可以执行的操作的方式,因此被称为plpythonu。如果在Python中开发了安全的执行机制,则将来可能会使用受信任的变体plpython。

为什么要为Python开发安全的执行机制而不是为Perl这样的其他语言开发安全的执行机制到底为什么呢?

Answers:


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受到信任的唯一原因是因为他们随PostgreSQL发布了Perl的特殊受信任版本postgresql.org/docs/11/plperl-trusted.html
TheSteve0

1
@ TheSteve0您可能没有这样看,但这就是为什么这样。PostgreSQL曾经有plpythonu,并且由于Python rexec模块固有的不安全性而被弃用(如上链接),因此将其删除。我想也许使用PyPi的plpython可能能够提供Pg随后可以使用的受限模式。我没有看是否有很多工作。您也对“ Perl的特殊受信任版本”不正确-实际上这是完全普通的Perl,对于plperl和plperlu使用相同的解释器。区别在于运行时配置。
克雷格·林格

@ TheSteve0 plperl在运行时以不同的方式配置Perl解释器实例。有关gorey的详细信息,请参阅plperl.c,尤其是pp_require_safeplperl_trusted_init。对于受限制的Perl执行的真正安全性,我知之甚少。我希望看到一个受信任的Lua版本,或者希望获得更好的使用和共享,一个受信任的JavaScript解释器。但是目前我们所拥有的。
克雷格·林格

@ TheSteve0 BTW,使用Java或Groovy代码的Java JVM或使用C#或VB.NET的Mono VM似乎很有意义,因为这两个运行时都具有强大的沙箱和安全性管理功能。以Java的SecurityManager为例。但是不幸的是,这两个运行时都使用了重量级启动,线程化,默认共享的执行模型,这些模型不适合PostgreSQL的轻量级进程默认无共享的fork()-without-exec模型。它们不是真的可以fork()。因此,我们不能在PostgreSQL中非常有效地使用它们。
克雷格·林格

此处的读者可能对我在Mono项目上使用在fork()ing运行时中使用Mono的Mono项目所做的GitHub问题感兴趣:github.com/mono/mono/issue/11857
Craig Ringer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.