我试图在我的项目中使用libsandbox。我能够在这个沙箱中完美地运行c / c ++程序。 为了运行c / c ++程序,首先我必须将代码编译为:
g++ -lm --static <filename> 2> err.txt
然后我必须使用上面编译的代码运行sample sandbox program。
请注意我上面使用的标志 - 静态非常重要.-static的重要性反映在以下两个stackoverflow答案Link1,Link2中
现在,我想将此沙箱用于java以及python。 但我不知道 gcc / g ++ --static 相当于python和java。
以下是否有效?
javac --static <filename> 2> err.txt
python --static <filename> 2>err.txt
我再说一遍,我很困惑,因为我不知道java或python中的--static等效。
谢谢!
答案 0 :(得分:3)
我认为你混淆了两件事。在libsandbox
正在讨论的意义上,您的Python程序不是可执行文件。可执行文件是Python解释器。
因此,您无法使用libsandbox
沙箱化Python脚本。
,然而,沙盒Python解释器。您执行此操作的方式与沙箱任何其他可执行文件相同。之一:
无论哪种方式,你都需要一些试验和错误来弄清楚你能做什么和不能做什么,以及如何将不同的Python代码映射到系统调用,等等。并且有些事情你无法阻止你的脚本做,因为你不希望Python代码执行的同一个系统调用对于解释器本身是必要的。
Java实际上也是如此。 JVM是可执行文件,而不是您的程序。而你真的无法静态链接JVM,所以你只有第二个选项。
当然,除非您使用gcj
将Java代码编译为本机代码而不是JVM代码。在这种情况下,您实际上使用与gcc
和g++
相同的后端,并且只需使用--static
来确保libgcj
,其他所有内容都会静态链接。你可能仍会遇到问题,因为libgcj
在libc
之下做了更多的事情......但这个概念与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包装器。可能已经有这样的包装,但是如果你可以写一个。