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

时间:2015-06-09 14:17:32

标签: coldfusion jvm-arguments java-security cfadmin

我想创建一个安全的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);

或使用java.lang.ProcessBuilder

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

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

1 个答案:

答案 0 :(得分:6)

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

1。在运行时指定其他策略文件,而不是更改默认的java.policy文件。为了实现这一点,我们使用CFAdmin接口将以下参数添加到JVM参数,或者将其附加到jvm.args文件中的jvm.config行:

  

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

jre\bin\内部有一个名为policytool.exe的精美GUI实用程序,可让您轻松高效地管理策略条目。

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

    grant codeBase "file:///D:/proj/secTestProj/main/-"{
        permission java.io.FilePermission 
        "<<ALL FILES>>", "read, write, delete";
    };

这里我们将FilePermission的所有文件设置为read, write, delete,不包括列表中的execute,因为我们不希望使用java运行时执行任何类型的文件。

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

我真的希望在政策文件中使用deny规则,以便使我们使用的grant规则更容易,但不幸的是,这并非如此。如果需要实施一组复杂的安全策略,可以使用Prograde库,该库实现带有拒绝规则(stack ref.)的策略文件。 您当然可以将<<ALL FILES>>替换为单个文件并相应地设置权限,或者为了更好的控制,可以使用<<ALL FILES>>和单个文件权限的组合。

参考文献:Default Policy Implementation and Policy File SyntaxPermissions in JDKControlling Applications

这种方法解决了我们的核心问题:通过指定文件允许的权限来拒绝使用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);

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

permission java.lang.RuntimePermission "setSecurityManager";
permission java.lang.RuntimePermission "createSecurityManager";
permission java.lang.RuntimePermission "usePolicy";

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

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