2013-03-22 5 views
7

"これはしないでください"という回答を投稿しないでください。私はこれをプロダクションコードで使用する予定はありませんが、ハッキングの面白さのためにのみ使用します。Javaで安全でないコード(セキュリティマネージャを無効にする)を実行する方法はありますか?

this questionという回答には、安全でない任意のJavaコードを実行したかったのです。問題のコードは、のリーフのノードがJavaのTreeMapであることを示しています。

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

実行以下のコードの結果this questionによると、私の周りこれらの制限のほとんどを得るためにSystem.setSecurityManager(null)を使用することができます。しかし、私はクラスがロードされると、エラーがポップアップするので、これを行うことはできません。

セキュリティマネージャを無効にした後、私が反射を使用したいすべてを行うことができることは既に認識しています。しかしそれはコードをもっと醜いものにするでしょう。 コアのJava開発者は、例えばjava.utilのものをパッケージ化できない場合、どのように単体テストを書くのですか?

私も-Djava.security.manager=...を試してみましたが、私はnullに設定したときに、これはJVMの初期化エラーが発生し、私はそれを設定することができます他に何かわかりません。何か案は?単にあなたの質問に答えるために

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)); 
    } 

} 
+1

私はコア開発者が(パブリックインターフェイスをテストする必要があるため)異なるパッケージにテストを配置したり、セキュリティ制限のないJVMビルドを行っていることは間違いありません。結局のところ、OracleはJVMコードを書く会社です。 –

+0

おそらく、ソース(紅茶など)を入手し、ファイルを「正しい」パッケージに没入させて、すべてをコンパイルしてみてください。私はそれが動作するかどうかは分かりませんが、システムを騙すのに十分かもしれません。それは私が試みるものです。 –

+0

ブートストラップクラスパスを使用できます。 rt.jarとこのクラスのすべてを含む独自のjarファイルを作成します。これは醜いハックですが、あなたはハックしたいと言いました。 –

答えて

2

は、全く通常の方法

、Javaのクラスはありません。*はセキュリティマネージャ、それらはクラスローダによって制限されている でないように制限されています。

あなたが望むものは、何とかjvmをハックする方法を見つける必要があります。 またはあなたが言及したとおりに、それを反映させてください。 または自分のパッケージにtreemapのコピー(ソースクローン)を作成するだけです。

0

すべてのセキュリティロジックがスタブアウトされたカスタムjava.lang.SecurityManagerを作成し、それをカスタムJVMにコンパイルする場合は、後で「java.security.manager」プロパティをカスタムマネージャに設定して参照できるようにする必要があります。

プログラムが起動する前にプロパティがLauncherによって読み取られているため、独自のプログラムではなく、JVM承認クラスパスにカスタムSecurityManagerが必要です(たとえば、コアrt.jarファイルにバンドルされています)。

コア開発者がこれをどのように処理するかについての質問に答えてください。これらのテストは、プロダクションJVMの従来のセキュリティを遵守していないため、カスタムJVMに対して実行される可能性があります。そのようなスタブの一例はhereです。

0

カスタムJavaパッケージのjarファイルを作成し、$ JRE_HOME/lib/extに置いて試してみてください!

関連する問題