如何在某些java类或包上限制createObject()?

Anu*_*rag 11 coldfusion jvm-arguments cfadmin java-security

我想创建一个安全的ColdFusion环境,我正在使用多个沙箱配置.使用友好的管理员界面可轻松实现以下任务:

  • 限制CFtags如:cfexecute,cfregistry和cfhttp.
  • 禁用对内部ColdFusion Java组件的访问.
  • 仅通过第三方资源访问某些服务器和端口范围.

而其他人则相应地使用Web服务器的配置.

问题:

所以我对设置感到满意只是为了以后遇到,无论应用于cfexecute标签的限制如何,都可以用来java.lang.Runtime轻松地执行系统文件或脚本;

String[] cmd = {"cmd.exe", 'net stop "ColdFusion 10 Application Server"'};
Process p = Runtime.getRuntime().exec(cmd);
Run Code Online (Sandbox Code Playgroud)

或使用java.lang.ProcessBuilder:

ProcessBuilder pb = new ProcessBuilder("cmd.exe", 'net stop "ColdFusion 10 Application Server"');
....
Process myProcess = pb.start();
Run Code Online (Sandbox Code Playgroud)

问题是我找不到任何允许我禁用这两个类的解决方案:java.lang.Runtime&java.lang.ProcessBuilderfor the createObject().对于注释:我已经在sanbox和os权限中尝试过文件限制,但不幸的是它们似乎只在I/O文件操作上工作,我不能搞乱系统库的安全策略,因为它们可能在内部使用通过ColdFusion.

Anu*_*rag 6

根据@ Leigh和@ Miguel-F的有用建议,我尝试了实现Security ManagerPolicy.结果如下:

1.在运行时指定其他策略文件,而不是更改默认java.policy文件.要启用此功能,我们使用CFAdmin接口将以下参数添加到JVM参数,或者将其附加到文件中的jvm.argsjvm.config:

-Djava.security.manager -Djava.security.policy ="c:/policies/myRuntime.policy"

里面有一个漂亮的GUI工具jre\bin\policytool.exe,让您轻松高效地管理策略项.

2.我们已强制执行安全管理器并提供了我们的自定义安全策略文件,其中包含:

    grant codeBase "file:///D:/proj/secTestProj/main/-"{
        permission java.io.FilePermission 
        "<<ALL FILES>>", "read, write, delete";
    };
Run Code Online (Sandbox Code Playgroud)

这里我们设置要从列表中排除的FilePermission所有文件,因为我们不希望使用java运行时执行任何类型的文件.read, write, deleteexecute

注意:如果我们希望将策略应用于所有应用程序而不管源是什么,则可以将代码库设置为空字符串.

我真的希望deny在策略文件中使用规则来使事情变得更容易,类似于grant我们正在使用的规则,但不幸的是.如果需要实施一组复杂的安全策略,可以使用Prograde库,该库实现具有拒绝规则的策略文件(堆栈引用).您肯定可以替换<<ALL FILES>>为单个文件并相应地设置权限,或者为了更好的控制使用组合<<ALL FILES>>和单个文件权限.

参考:默认策略实现和策略文件语法,JDK控制应用程序中的权限

这种方法解决了我们的核心问题:通过指定文件允许的权限来拒绝使用java运行时执行文件.在其他方法中,我们可以Security Manager直接在我们的应用程序中实现从那里定义策略文件,而不是在我们的JVM args中定义它.

//set the policy file as the system securuty policy
System.setProperty("java.security.policy", "file:/C:/java.policy");
// create a security manager
SecurityManager sm = new SecurityManager();
//alternatively, get the current securiy manager using System.getSecuriyManager() 
//set the system security manager
System.setSecurityManager(sm);
Run Code Online (Sandbox Code Playgroud)

为了能够设置它,我们需要在策略文件中使用这些权限:

permission java.lang.RuntimePermission "setSecurityManager";
permission java.lang.RuntimePermission "createSecurityManager";
permission java.lang.RuntimePermission "usePolicy";
Run Code Online (Sandbox Code Playgroud)

在应用程序中使用Security Manager对象有其自身的优点,因为它公开了许多有用的方法例如:CheckExec(String cmd)它检查是否允许调用线程创建子进程.

//perform the check
try{
  sm.checkExec("notepad.exe");
}
catch(SecurityException e){
  //do something...show warning.
}
Run Code Online (Sandbox Code Playgroud)