2013-07-08 28 views
1

我想禁止在AccessController.doPriviliged()方法中创建线程。下面的方法创建并运行线程。我用-Djava.security.manager运行这个。根据这个链接,如果modifyThreadGroup没有被授予,那么线程创建应该被禁止?AccessController doPrivileged可以在modifyThreadGroup未被授予时创建线程吗?

http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html

谁能开导我,为什么发生这种情况,并使用AccessController的不允许线程创建正确的方法是什么?

// .java.policy in $UserHome: 

grant codeBase "file:/C:/-" { 
    permission java.security.AllPermission; 
}; 


public class ThreadTest { 
    public void testModifyThreadGroup() { 

    // grant no permissions 
    Permissions perms = new Permissions(); 

    ProtectionDomain domain = new ProtectionDomain(
      new CodeSource(null, (Certificate[]) null), perms); 
    AccessControlContext _accessControlContext = new AccessControlContext(
      new ProtectionDomain[] { domain }); 

    try { 
     AccessController.doPrivileged(new PrivilegedExceptionAction(){ 
      @Override 
      public Object run() { 
       try { 
        // modifyThreadGroup not granted, so should not be able 
        // to call Thread constructor??? 
        Thread t = new Thread(new Runnable() { 
         @Override 
         public void run() { 
          System.out.println("Thread.run()"); 
         } 
        }); 
        t.run(); 
       } catch (Exception ex) { 
        System.out.println("Error running thread: " + ex); 
       } 
       return null; 
     }}, _accessControlContext); 
    } catch(Exception e) { 
     System.out.println("Access Error running doPrivileged: " + e); 
    } 
    } 
} 

回答

3

创建或启动一个线程时所做的唯一检查是检查,看看是否调用线程是否有权修改该线程组。这并不像你想的那样检查调用线程是否具有“modifyThreadGroup”权限。

取而代之的是它(by default)总是授予访问权限,除非有问题的ThreadGroup是系统线程组,在这种情况下,会检查“modifyThreadGroup”权限。有问题的ThreadGroup几乎从不是系统线程组。

您将不得不使用自己的实现来扩展SecurityManager,并对自己的实现进行一些检查。您应该可以编写自己的新许可。

import java.security.AccessControlContext; 
import java.security.AccessController; 
import java.security.CodeSource; 
import java.security.Permissions; 
import java.security.PrivilegedExceptionAction; 
import java.security.ProtectionDomain; 
import java.security.cert.Certificate; 

public class QuickTest { 

    public static class NoThreadsSecurityManager extends SecurityManager { 

     public void checkAccess(ThreadGroup g) { 
      super.checkAccess(g); 
      checkPermission(new RuntimePermission("exitVM")); 
     } 

    } 

    public static class SimpleRunnable implements PrivilegedExceptionAction<Object> { 
     @Override 
     public Object run() { 
      try { 
       Thread t = new Thread(new Runnable() { 
        @Override 
        public void run() { 
         System.out.println("Thread.run()"); 
        } 
       }); 
       t.start(); 
       t.join(); 
      } catch (Exception ex) { 
       System.out.println("Error running thread: " + ex); 
      } 
      return null; 
     } 
    } 

    public void testModifyThreadGroup() { 

     // grant no permissions 
     Permissions perms = new Permissions(); 

     ProtectionDomain domain = new ProtectionDomain(new CodeSource(null, (Certificate[]) null), perms); 
     AccessControlContext _accessControlContext = new AccessControlContext(new ProtectionDomain[] { domain }); 

     try { 
      AccessController.doPrivileged(new SimpleRunnable(), _accessControlContext); 
     } catch (Exception e) { 
      System.out.println("Access Error running doPrivileged: " + e); 
     } 

     new SimpleRunnable().run(); 

    } 

    public static void main(String[] args) { 
     System.setSecurityManager(new NoThreadsSecurityManager()); 
     new QuickTest().testModifyThreadGroup(); 
    } 

} 
+2

谢谢!从你链接的文档中:“需要更严格策略的应用程序应该重写此方法,如果重写此方法,则重写该方法的方法应另外检查调用线程是否具有RuntimePermission(”modifyThreadGroup“)权限,如果所以,请静静地返回。这是为了确保授予该权限的代码(如JDK本身)可以处理任何线程。“我发现在相关方法中检查'modifyThread'和'modifyThreadGroup'(检查'exitVM'的地方)给出了期望的行为。 – markt

2

接受佩斯的响应后,我发现一些别人可能会觉得有用:作为一个例子,我使用给出的默认策略现有权限,我知道的线程将不得不(exitVM)实施的黑客攻击。从你链接的文档中:“需要更严格策略的应用程序应该重写此方法,如果重写此方法,则重写该方法的方法应另外检查调用线程是否具有RuntimePermission(”modifyThreadGroup“)权限,如果所以,请静静地返回,这是为了确保授予该权限的代码(如JDK本身)可以处理任何线程。“我发现在相关方法中检查'modifyThread'和'modifyThreadGroup'(检查'exitVM'的地方)给出了期望的行为。

相关问题