2013-02-01 55 views
2

我正在尝试在我的项目中使用libsandbox。我能够在此沙箱中完美地运行c/C++程序。 为了运行C/C++程序,首先我必须编译的代码为:静态和动态链接沙盒

g++ -lm --static <filename> 2> err.txt 

然后我需要运行sample sandbox program与上述编译的代码。

请注意标志--static,我上面说是相当--static important.The重要性体现在以下两个计算器回答Link1Link2

现在,我想用这个沙箱对于Java以及Python。 但我不知道gcc/g ++ - 静态相当于python和java。

请问以下工作?

javac --static <filename> 2> err.txt 

    python --static <filename> 2>err.txt 

我再说一遍,我很困惑,我不知道在Java或Python相当于--static。

谢谢!

+1

作为一种解释型语言,Python不会执行任何链接,静态或其他。 – kindall

+1

Java也没有。所有这些绑定都是在运行时。你能解释你在做什么,为什么? –

+0

@PeterLawrey:先生,我刚刚编辑了我的问题,以反映--static的重要性。 –

回答

3

可以用libsandbox对Python解释器进行沙盒处理。您需要处理一些系统调用,比如加载共享库和导入默认的python模块。的pysandbox在Python3解释工作示例可以在理查德·洛布的CodeRunner项目中找到,

https://github.com/trampgeek/CodeRunner

Java有其自己的安全机制。所以没必要将Java虚拟机包装在沙箱中。

免责声明:我是libsandbox的作者。

+1

@ritesh_nitw:它们是用于将警告转化为错误并显示所有错误的编译器标志。你可以在这里阅读http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html – uyetch

+0

@ard:谢谢:) –

+0

嗨,在沙箱中运行python仍然是我的一个问题。运行C/C++很简单,我只需要编写'python Sample2.py a.out',其中a.out是可执行文件。 但在python中没有可执行文件。当我在命令行中键入'python Sample2.py python userscript.py'时,沙箱不工作.userscript.py是我想在沙箱中运行的用户程序。在沙盒中没有适当的文档来运行用户python程序。谢谢! –

-2

对于Java,看起来你唯一的选择是使用静态绑定到它的JNI包装器。可能有这样一个包装,但如果你可以写一个。

+0

静态绑定_what_?你不链接到'libsandbox'。 OP询问静态链接的原因是因为当您排除任何动态代码加载时,您可以使用更简单,更清洁的沙箱,对于C和C++代码而言,这意味着您必须静态链接所有库而不是共享。 – abarnert

+0

@abarnert要使用JNI,您必须提供一个DLL或SO。这可以将其他库静态绑定到它。 –

+0

是的,但将其他库静态绑定到它会有什么意义?使用沙盒可执行文件的静态链接的全部原因是你可以将'SYS_open'这样的东西加入黑名单。但是如果你这样做,JNI就无法工作(而且JVM本身也不会)。 – abarnert

3

我认为你混淆了两件事。您的Python程序在libsandbox正在讨论的意义上不是可执行文件。可执行文件是Python解释器。

因此,您无法使用libsandbox沙盒化Python脚本。

可以,但是,沙箱的Python解释器。您可以使用与其他可执行文件相同的方式来执行此操作。或者:

  • 创建Python解释器的静态构建(包含您需要编译的任何C扩展模块),然后在沙箱中运行它。这并不容易,但它是可行的,并且Python源代码树和其他地方的信息可能会有所帮助。
  • 使用更宽松的沙盒,允许标准解释器完成所需的任何事情(可能包括动态加载扩展模块,具体取决于您是否需要),但不能再使用它。

无论哪种方式,你会需要一些反复试验来找出你可以和不能禁止什么,以及如何将Python代码不同位映射到系统调用,依此类推。并且会有一些你无法阻止脚本执行的事情,因为不需要Python代码执行的同一个系统调用对于解释器本身来说是必需的。

对Java有效的情况也是如此。 JVM是可执行文件,而不是你的程序。而且你真的不能静态链接JVM,所以你只有第二种选择。

当然,除非您使用gcj将Java代码编译为本机代码而不是JVM代码。在这种情况下,您实际上使用与gccg++相同的后端,并且您只需使用--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?不知道你的实际用例,我甚至不能猜测这些问题的答案。但是,如果你没有立即回答所有问题,你就不会完成任何有用的工作。

+1

在我请求你提供几条建议之前,让我说点什么。 无论何时我试图编译程序(我想在沙箱中运行)而没有“--static”,沙箱都不起作用。因此,再次 - 静止是非常关键的,,这超出了我的理解。 我在脑海中有两个问题: (a)对于java和python,如果我编译为w/o“--static”,沙盒将工作(b)同一个开发人员有一个名为pysandbox的沙箱http:/ /openjudge.net/~liuyu/Project/LibSandbox。因此,为了在沙箱中运行python代码,pysandbox更容易吗? 谢谢! –

+0

...如果你不明白为什么你需要'--static'开头,也许你应该先弄清楚。 – kindall

+0

@ kindall:是的,我同意。但说实话,我已经提到过,我对静态的思路并不清楚。我已经发布了两个链接在stackoverflow,我从哪里学到了它在沙箱中的重要性。 –