猿问

Java沙箱和ProcessBuilder

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


跃然一笑
浏览 172回答 1
1回答

慕码人2483693

您运行命令python(非限定),因此start()不知道文件在哪里,因此检查是否允许execute访问<<ALL FILES>>。由于您不在,因此被拒绝。如果您指定文件的完整(绝对)路径python&nbsp;并授予对该python文件的访问权限,那么它将起作用。有关SecurityManager.checkExec(String cmd)权限检查的说明,请参见的javadoc&nbsp;:SecurityException如果不允许调用线程创建子进程,则抛出a&nbsp;。通过execclass方法为当前的安全管理器调用此方法Runtime。此方法调用checkPermission与FilePermission(cmd,"execute")权限,如果cmd是绝对路径,否则,它调用checkPermission与FilePermission("<<ALL FILES>>","execute")。
随时随地看视频慕课网APP

相关分类

Java
我要回答