9

请不要发布“你不应该这样做”的答案。我不打算在生产代码中使用它,而只是为了一些黑客的乐趣。

在回答这个问题时,我想运行一些任意不安全的 Java 代码来取乐。有问题的代码只涉及查找 Java 的节点TreeMap

运行以下代码会导致

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util

根据这个问题,我可以System.setSecurityManager(null)用来绕过大部分这些限制。但我不能这样做,因为加载我的类时会弹出错误。

我已经知道在禁用安全管理器后我可以使用反射来做所有我想做的事情。但这会使代码更难看。核心 Java 开发人员如何编写他们的单元测试,例如,如果他们不能将东西打包到java.util.

我也尝试过-Djava.security.manager=...,但是当我将它设置为 时,这会导致 JVM 初始化错误null,而且我不确定我还能将它设置为什么。有任何想法吗?

package java.util;

import java.util.TreeMap.Entry;

public class TreeMapHax {

    static <K,V> List<Entry<K, V>> getLeafEntries(TreeMap<K, V> map) {      
        Entry<K, V> root = map.getFirstEntry();
        while( root.parent != null ) root = root.parent;

        List<Entry<K,V>> l = new LinkedList<Entry<K,V>>();
        visitInOrderLeaves(root, l);
        return l;
    }

    static <K,V> void visitInOrderLeaves(Entry<K, V> node, List<Entry<K, V>> accum) {       
        if( node.left != null ) visitInOrderLeaves(node.left, accum);       
        if( node.left == null && node.right == null ) accum.add(node);      
        if( node.right != null ) visitInOrderLeaves(node.right, accum);
    }

    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<String, Integer>();

        for( int i = 0; i < 10; i++ )
            map.put(Integer.toString(i), i);

        System.out.println(getLeafEntries(map));
    }

}
4

3 回答 3

3

简单地回答你的问题,没有通常的方法

java.* 中的类不受安全管理器的限制,它们受类加载器的限制。

做你想做的事,你需要找到一种方法来破解 jvm。或者就像你提到的那样,通过反思来做。或者只是在您自己的包中创建树图的副本(源克隆)。

于 2013-03-22T08:59:30.490 回答
0

我认为您可以尝试为您的自定义 Java 包创建 jar 并将其放入 $JRE_HOME/lib/ext 并看到魔法!

于 2013-03-22T11:58:43.267 回答
0

如果您创建了一个自定义java.lang.SecurityManager并删除了所有安全逻辑,并将其编译到自定义 JVM 中,您应该能够通过将“java.security.manager”属性设置为自定义管理器来引用它。

由于启动器在您的程序启动之前读取该属性,因此您必须将自定义 SecurityManager 放在 JVM 认可的类路径中,而不是您自己的程序中(例如捆绑在核心rt.jar文件中)。

回答您关于核心开发人员如何处理此问题的问题:此类测试可能会针对自定义 JVM 运行,因为它们不遵守生产 JVM 的传统安全性。可以在此处找到此类存根的一个示例。

于 2013-03-22T09:33:06.413 回答