我认为你混淆了两件事。您的Python程序在libsandbox
正在讨论的意义上不是可执行文件。可执行文件是Python解释器。
因此,您无法使用libsandbox
沙盒化Python脚本。
你可以,但是,沙箱的Python解释器。您可以使用与其他可执行文件相同的方式来执行此操作。或者:
- 创建Python解释器的静态构建(包含您需要编译的任何C扩展模块),然后在沙箱中运行它。这并不容易,但它是可行的,并且Python源代码树和其他地方的信息可能会有所帮助。
- 使用更宽松的沙盒,允许标准解释器完成所需的任何事情(可能包括动态加载扩展模块,具体取决于您是否需要),但不能再使用它。
无论哪种方式,你会需要一些反复试验来找出你可以和不能禁止什么,以及如何将Python代码不同位映射到系统调用,依此类推。并且会有一些你无法阻止脚本执行的事情,因为不需要Python代码执行的同一个系统调用对于解释器本身来说是必需的。
对Java有效的情况也是如此。 JVM是可执行文件,而不是你的程序。而且你真的不能静态链接JVM,所以你只有第二种选择。
当然,除非您使用gcj
将Java代码编译为本机代码而不是JVM代码。在这种情况下,您实际上使用与gcc
和g++
相同的后端,并且您只需使用--static
以确保libgcj
和其他所有内容都获得静态链接。你可能仍然遇到问题,因为libgcj
在覆盖范围内比libc
做得更多...但是这个概念与C代码相同。 (JVM本身有自己的访问模型,你可能可以用类加载器中的反射来构建一些东西,以便在Java API级别上而不是在Linux系统调用API上对沙盒程序进行处理。我不知道这样的事情已经存在)
每当我试图编译程序(我想在沙箱中运行),而“--static”沙箱没有work.So,再 - 静止是非常关键的,这是超出我的知识。
很可能,您的实际代码不会打开任何文件,因此您使用的是禁用打开文件的默认沙盒设置。但是,如果你动态地链接你的程序,它必须打开.so
文件来链接它们 - 这是行不通的,因为你的沙盒被配置为禁止它。
如果您静态链接相同的程序,问题就会消失,因为它不再需要打开任何.so
s来运行。简而言之,就是沙盒静态链接的关键。你甚至在你的问题的评论中解释了这一点,所以我无法想象你怎么理解它,除非你甚至不明白你为什么要禁止SYS_open
以及这意味着什么。
(a)对于Java和Python,将沙箱的工作,如果我编译的w/o “--static”
是,沙箱会工作得很好。这意味着,如果您使用默认配置,它将禁止您打开文件。这意味着您的Java或Python程序将失败,因为VM /解释器必须打开(以及其他方式)您的程序才能运行它。
即使静态链接解释器或JVM也无济于事。你必须得到你的程序的静态链接到可执行文件的实际字节码。这不是不可能的,但可能远远超出了你想要考虑的任何事情。
正确的做法是弄清楚你试图禁止什么系统调用,以及为什么,并适当配置沙箱。默认配置不适用于您。
(B)有一个由同一个开发商openjudge.net/~liuyu/Project/LibSandbox称为pysandbox沙箱
pysandbox
仅仅是一个配置和启动一个沙盘更简单的方法。你不要在你的沙盒代码中使用它。 (有一个不同pysandbox
通过在Python中的沙箱代码另一家开发商。这可能是对你有用,但它是不一样的事,作为一个系统调用沙箱。)
在这一点上,我不确定你甚至不知道你在做什么。为什么你想在第一个地方使用你的代码?你知道你的代码需要什么样的访问来完成它需要做的事吗?如果你知道你想要做什么,你确定系统级的沙箱是正确的级别来执行它,而不是像RestrictedPython
?不知道你的实际用例,我甚至不能猜测这些问题的答案。但是,如果你没有立即回答所有问题,你就不会完成任何有用的工作。
作为一种解释型语言,Python不会执行任何链接,静态或其他。 – kindall
Java也没有。所有这些绑定都是在运行时。你能解释你在做什么,为什么? –
@PeterLawrey:先生,我刚刚编辑了我的问题,以反映--static的重要性。 –