我按照本教程进行操作,以实现插件代码的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 回答
![?](http://img1.sycdn.imooc.com/545861b80001d27c02200220-100-100.jpg)
慕码人2483693
TA贡献1860条经验 获得超9个赞
您运行命令python
(非限定),因此start()
不知道文件在哪里,因此检查是否允许execute
访问<<ALL FILES>>
。由于您不在,因此被拒绝。
如果您指定文件的完整(绝对)路径python
并授予对该python
文件的访问权限,那么它将起作用。
有关SecurityManager.checkExec(String cmd)
权限检查的说明,请参见的javadoc :
SecurityException
如果不允许调用线程创建子进程,则抛出a 。通过
exec
class方法为当前的安全管理器调用此方法Runtime
。此方法调用
checkPermission
与FilePermission(cmd,"execute")
权限,如果cmd是绝对路径,否则,它调用checkPermission
与FilePermission("<<ALL FILES>>","execute")
。
添加回答
举报
0/150
提交
取消