静态和动态链接沙箱

时间:2013-02-01 19:15:25

标签: java python sandbox static-linking dynamic-linking

我试图在我的项目中使用libsandbox。我能够在这个沙箱中完美地运行c / c ++程序。 为了运行c / c ++程序,首先我必须将代码编译为:

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

然后我必须使用上面编译的代码运行sample sandbox program

请注意我上面使用的标志 - 静态非常重要.-static的重要性反映在以下两个stackoverflow答案Link1Link2

现在,我想将此沙箱用于java以及python。 但我不知道 gcc / g ++ --static 相当于python和java。

以下是否有效?

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

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

我再说一遍,我很困惑,因为我不知道java或python中的--static等效。

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

,然而,沙盒Python解释器。您执行此操作的方式与沙箱任何其他可执行文件相同。之一:

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

无论哪种方式,你都需要一些试验和错误来弄清楚你能做什么和不能做什么,以及如何将不同的Python代码映射到系统调用,等等。并且有些事情你无法阻止你的脚本做,因为你不希望Python代码执行的同一个系统调用对于解释器本身是必要的。

Java实际上也是如此。 JVM是可执行文件,而不是您的程序。而你真的无法静态链接JVM,所以你只有第二个选项。

当然,除非您使用gcj将Java代码编译为本机代码而不是JVM代码。在这种情况下,您实际上使用与gccg++相同的后端,并且只需使用--static来确保libgcj,其他所有内容都会静态链接。你可能仍会遇到问题,因为libgcjlibc之下做了更多的事情......但这个概念与C代码相同。

(JVM本身有自己的访问模型,你可以在类加载器中使用反射来构建一些东西来在Java API层而不是linux系统调用API上沙箱化Java程序。我不知道是不是这样的事情已经存在。)


  

每当我尝试编译程序(我想在沙盒中运行)而没有“--static”时,沙箱就不起作用了。所以,再次--static是非常关键的,这是我所不知道的

最有可能的是,您的实际代码不会打开任何文件,因此您使用的是禁止打开文件的默认沙箱设置。但是,如果您动态链接您的程序,它必须打开.so文件以链接它们 - 这不起作用,因为您的沙箱配置为禁止它。

如果您静态链接同一个程序,问题就会消失,因为它不再需要打开任何.so来运行。简而言之,这是沙箱的静态链接点。你甚至在对你的问题的评论中解释了这一点,所以我无法想象你怎么理解它,除非你甚至不理解你为什么要禁止SYS_open以及这意味着什么。

  

(a)对于java和python,如果我编译w / o“--static”,沙箱是否可以工作

是的,沙盒可以正常工作。这意味着,如果您使用默认配置,它将禁止您打开文件。这意味着您的Java或Python程序将失败,因为VM /解释器必须打开(以及其他)程序来运行它。

即使是静态链接解释器或JVM也无济于事。您必须将程序的实际字节码静态链接到可执行文件中。并非不可能,但可能远远超出你想要的任何目标。

正确的做法是确切地弄清楚你想要禁止的系统调用,以及为什么,并适当地配置沙箱。默认配置不适合您。

  

(b)同一个开发者openjudge.net/~liuyu/Project/LibSandbox有一个名为pysandbox的沙箱

pysandbox只是一种配置和启动沙箱的简单方法。您不要在沙盒代码中使用它。 (另一个开发人员有一个不同的 pysandbox,它们在Python级别对您的代码进行沙盒化。这可能对您有用,但它与系统调用沙箱不同。)


此时,我不确定你是否知道自己要做什么。为什么要首先对代码进行沙盒化?您知道代码需要什么样的访问才能完成它需要做的事情?如果你知道你想要做什么,你确定一个系统级别的沙箱是强制执行它的正确级别,而不是RestrictedPython之类的东西吗?在不知道您的实际用例的情况下,我甚至无法猜测这些问题的答案。但如果你没有立即得到所有这些答案的答案,你就不会有任何有用的东西。

答案 1 :(得分:3)

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

https://github.com/trampgeek/CodeRunner

Java有自己的安全机制。因此,不必将Java VM包装在沙箱中。

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

答案 2 :(得分:-2)

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