2013-03-22 15 views
7

Si prega di non inviare una risposta che dice "non si deve fare questo." Non ho intenzione di usarlo nel codice di produzione, ma solo per un po 'di divertimento hacking.Esiste un modo per eseguire codice non sicuro (disabilitare il gestore della sicurezza) in Java?

Rispondendo allo this question, volevo eseguire un codice Java arbitrario e pericoloso per il divertimento. Il codice in questione consiste nel trovare solo i foglia nodi di una Java TreeMap.

in corso i risultati di codice qui sotto in

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

Secondo this question, posso usare System.setSecurityManager(null) per aggirare la maggior parte di queste restrizioni. Ma non posso farlo perché l'errore si apre quando viene caricata la mia classe.

Sono già consapevole del fatto che posso fare tutto quello che voglio utilizzando la riflessione dopo la disattivazione del responsabile della sicurezza. Ma questo renderebbe il codice molto più brutto. In che modo gli sviluppatori Java di base scrivono i loro test unitari, ad esempio, se non possono impacchettare le cose in java.util?

Ho anche provato -Djava.security.manager=... ma questo causa un errore di inizializzazione JVM quando ho impostato a null, e non sono sicuro che altro posso impostarlo. Qualche idea?

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

Direi che gli sviluppatori principali sono sia felice ponendo le loro prove in diversi pacchetti (dal momento che dovrebbero essere testando l'interfaccia pubblica) o di avere un accumulo JVM senza quelle restrizioni di sicurezza. Dopo tutto, Oracle è la società che scrive il codice JVM. –

+0

forse prova ad ottenere la fonte (tè freddo o qualcosa del genere), introducendo di nascosto il tuo file nel pacchetto "corretto" e compilando il tutto? non so se questo potrebbe funzionare, ma potrebbe essere sufficiente per ingannare il sistema. questo è quello che proverei. –

+0

È possibile utilizzare il percorso di classe bootstrap. Crea il tuo barattolo che contiene tutto da rt.jar più questa classe. Questo è un brutto trucco, ma hai detto che vuoi hackerare. –

risposta

2

per rispondere semplicemente alla tua domanda, non c'è modo di consueto

le classi in Java. * Non sono limitate dal responsabile della sicurezza, essi sono limitati dal caricatore di classe.

todo ciò che si vuole, in qualche modo bisogno di trovare un modo per incidere la JVM. o fai come hai detto, fallo con la riflessione. o semplicemente creare una copia (clone di origine) di treemap nel proprio pacchetto.

0

Se si crea una java.lang.SecurityManager personalizzata con tutte le logiche di sicurezza eliminate e la si compila in una JVM personalizzata, si dovrebbe essere in grado di fare riferimento in seguito impostando la proprietà "java.security.manager" al proprio gestore personalizzato.

Dato che la proprietà viene letto dal Launcher prima che il programma si avvia, è necessario avere la vostra abitudine SecurityManager nella JVM approvato classpath piuttosto che il proprio programma (ad esempio in bundle nel file core rt.jar).

Per rispondere alla domanda su come gli sviluppatori core si occupano di questo: questi tipi di test verranno probabilmente eseguiti su una JVM personalizzata poiché non aderiscono alla tradizionale sicurezza di una JVM di produzione. Un esempio di tale stub può essere trovato here.

0

penso che si potrebbe provare a creare vaso per il pacchetto Java personalizzato e la messa a $ JRE_HOME/lib/ext e vedere la magia !!