我按照本教程进行操作,以实现插件代码的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在受限目录中启动进程的同时实现沙箱?
慕码人2483693
相关分类