为了账号安全,请及时绑定邮箱和手机立即绑定

Java沙箱和ProcessBuilder

Java沙箱和ProcessBuilder

跃然一笑 2021-05-02 12:52:12
我按照本教程进行操作,以实现插件代码的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在受限目录中启动进程的同时实现沙箱?
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您运行命令python(非限定),因此start()不知道文件在哪里,因此检查是否允许execute访问<<ALL FILES>>。由于您不在,因此被拒绝。

如果您指定文件的完整(绝对)路径python 授予对该python文件的访问权限,那么它将起作用。

有关SecurityManager.checkExec(String cmd)权限检查的说明,请参见的javadoc :

SecurityException如果不允许调用线程创建子进程,则抛出a 。

通过execclass方法为当前的安全管理器调用此方法Runtime

此方法调用checkPermissionFilePermission(cmd,"execute")权限,如果cmd是绝对路径,否则,它调用checkPermissionFilePermission("<<ALL FILES>>","execute")


查看完整回答
反对 回复 2021-05-12
  • 1 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信