gpt4 book ai didi

Java 沙箱和 ProcessBuilder

转载 作者:行者123 更新时间:2023-12-02 11:03:13 26 4
gpt4 key购买 nike

我关注了这个tutorial为插件代码实现java沙箱。插件代码使用以下权限运行:

private PermissionCollection pluginPermissions() {
Permissions permissions = new Permissions();
permissions.add(new FilePermission("/projects", "read,write,execute"));
return permissions;
}

效果很好。但是,我想允许插件启动一个进程,该进程也将受到这些权限的限制。例如,只要脚本位于/projects 目录中并且不访问其他任何地方,它就应该能够通过运行命令“python test.py”来运行 python 脚本。就像下面的代码,其中 cmnd 是“python”,mainFilePath 是 python 脚本,位于仅限进程的目录中。

public static File startProcess(String cmnd, String mainFilePath, String directory){
try {
ProcessBuilder pb =
new ProcessBuilder( cmnd, mainFilePath);

pb.directory(new File(directory));
File f = pb.directory();
System.out.println(f.exists());

File log = new File(directory,"log.txt");

pb.redirectErrorStream(true);
pb.redirectOutput(ProcessBuilder.Redirect.appendTo(log));

Process p = pb.start();
return log;
}catch (Exception e){
e.printStackTrace();
}
return null;
}

如果我从插件运行此代码,我会收到以下异常:

java.security.AccessControlException: access denied ("java.io.FilePermission" "<<ALL FILES>>" "execute")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkExec(SecurityManager.java:799)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1018)
at engine.LogHelper.startProcess(LogHelper.java:28)
at engine.ZEngine.build(ZEngine.java:13)
at Main.main(Main.java:29)

这表明我需要授予所有文件“执行”权限。但我只需要对指定目录中的文件进行限制。那么如何实现沙箱同时允许ProcessBuilder在受限目录中启动进程呢?

更新:

插件权限现在如下:

permissions.add(new FilePermission("/Users/ziadalhalabi/IdeaProjects/JarDummy/projects/-", "read,write"));            
permissions.add(new FilePermission("/Users/ziadalhalabi/IdeaProjects/JarDummy/projects/", "read,write,execute"));
permissions.add(new FilePermission("/usr/local/bin/python", "execute"));

它可以工作,但 python 脚本能够读取目录之外的文件。我希望将沙箱应用于 python 脚本中的任何内容。

最佳答案

您运行命令python (不合格),所以start()不知道文件在哪里,因此请检查是否允许 execute访问<<ALL FILES>> 。因为您不是,所以它被拒绝。

如果您指定 python 的完整(绝对)路径授予对 python 的访问权限文件,它就会工作。

参见 SecurityManager.checkExec​(String cmd) 的javadoc权限检查说明:

Throws a SecurityException if the calling thread is not allowed to create a subprocess.

This method is invoked for the current security manager by the exec methods of class Runtime.

This method calls checkPermission with the FilePermission(cmd,"execute") permission if cmd is an absolute path, otherwise it calls checkPermission with FilePermission("<<ALL FILES>>","execute").

关于Java 沙箱和 ProcessBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51175107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com