我按照本教程進(jìn)行操作,以實(shí)現(xiàn)插件代碼的Java沙箱。插件代碼已獲得以下權(quán)限運(yùn)行:private PermissionCollection pluginPermissions() { Permissions permissions = new Permissions(); permissions.add(new FilePermission("/projects", "read,write,execute")); return permissions;} 它工作正常。但是,我希望允許插件啟動(dòng)一個(gè)進(jìn)程,這些進(jìn)程也將受到這些權(quán)限的限制。例如,只要腳本位于/ projects目錄中并且不能在其他任何地方訪問,它就可以通過運(yùn)行“ python test.py”命令來運(yùn)行python腳本。類似于以下代碼,其中cmnd是“ python”,mainFilePath是python腳本,位于受該進(jìn)程限制的目錄中。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; }如果我從插件運(yùn)行此代碼,則會(huì)收到以下異常: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)這表明我需要授予所有文件“執(zhí)行”權(quán)限。但是我只需要對(duì)指定目錄中的文件進(jìn)行限制。那么如何在允許ProcessBuilder在受限目錄中啟動(dòng)進(jìn)程的同時(shí)實(shí)現(xiàn)沙箱?
1 回答

慕碼人2483693
TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
您運(yùn)行命令python
(非限定),因此start()
不知道文件在哪里,因此檢查是否允許execute
訪問<<ALL FILES>>
。由于您不在,因此被拒絕。
如果您指定文件的完整(絕對(duì))路徑python
并授予對(duì)該python
文件的訪問權(quán)限,那么它將起作用。
有關(guān)SecurityManager.checkExec(String cmd)
權(quán)限檢查的說明,請(qǐng)參見的javadoc :
SecurityException
如果不允許調(diào)用線程創(chuàng)建子進(jìn)程,則拋出a 。通過
exec
class方法為當(dāng)前的安全管理器調(diào)用此方法Runtime
。此方法調(diào)用
checkPermission
與FilePermission(cmd,"execute")
權(quán)限,如果cmd是絕對(duì)路徑,否則,它調(diào)用checkPermission
與FilePermission("<<ALL FILES>>","execute")
。
添加回答
舉報(bào)
0/150
提交
取消