5

La serializzazione di Java Beans in XML utilizzando XMLEncoder e XMLDecoder sembra un approccio abbastanza accurato: molte classi di molte origini possono essere serializzate in modo affidabile, semplicemente utilizzando la loro interfaccia pubblica. L'uso di questo approccio alla serializzazione è persino suggerito in molti punti del riferimento dell'API. Ma il XML syntax usato per questo sembra abbastanza potente. Esistono meccanismi di sicurezza che impediscono attacchi provenienti da documenti dannosi? O l'uso di XMLDecoder sui documenti non attendibili dovrebbe essere evitato per motivi di sicurezza?È sicuro utilizzare XMLDecoder per leggere i file di documento?

risposta

9

La deserializzazione di bean con serializzazione XML può causare molte operazioni che la JVM può eseguire. Per darvi un brutto examle, si consideri il seguente documento che scriverà un certo file senza domande poste:

<?xml version="1.0" encoding="UTF-8" ?> 
<java version="1.4.0" class="java.beans.XMLDecoder"> 
    <object class="java.io.PrintWriter"> 
    <string>/tmp/Hacked.txt</string> 
    <void method="println"> 
     <string>You have been hacked!</string> 
    </void> 
    <void method="close"/> 
    </object> 
</java> 

Questo è più o meno la stessa di un metodo di

PrintWriter deserialize() { 
    PrintWriter obj = new PrintWriter("/tmp/Hacked.txt"); 
    obj.println("You have been hacked!"); 
    obj.close(); 
    return obj; 
} 

Per questo motivo, I fortemente consiglia rispetto a semplicemente leggendo i dati da fonti non attendibili utilizzando XMLDecoder.

O convalidare il documento in un sottoinsieme ben definito e innocuo del linguaggio XML oppure utilizzare i propri formati insieme a tecnologie come . Oppure eseguire la deserializzazione in un ambiente strettamente controllato, con i responsabili della sicurezza che non consentiranno alcuna operazione imprevista.

+1

Infatti. Linee guida 3-8 delle attuali linee guida di codifica sicura per il linguaggio di programmazione Java "Persistenza a lungo termine dei componenti JavaBeans supporta l'esecuzione di istruzioni Java". http://www.oracle.com/technetwork/java/seccodeguide-139067.html#3-8 –

3

NO, non è assolutamente sicuro da usare.

L'esempio MvG fornisce (nella risposta accettata) non dipinge l'immagine completa.

Date un'occhiata agli esempi che ho scritto il post Using XMLDecoder to execute server-side Java Code on an Restlet application (i.e. Remote Command Execution) blog dove mostro come:

  • processi di avvio,
  • file di classe di upload,
  • scrittura al lato server HTML OutputStream,
  • creare XSS e
  • innescare una shell remota

tutto da file XML/stringhe analizzati da XMLDecoder (e nell'esempio mostrato nel post del blog, tramite la classe ObjectRepresentation dell'API REST di Restlet)

+2

Per me, la mia risposta ha dimostrato l'esecuzione arbitraria del codice e tutti gli altri aspetti che descrivi sono solo sintomi di questo. Ma immagino che non tutti possano fare quella connessione, in particolare ai processi server, quindi è bene affermarlo esplicitamente. E aver trovato una struttura vulnerabile rende questo molto più tangibile. Hai contattato gli sviluppatori di Restlet a riguardo? – MvG

+0

@MvG: http://osvdb.org/show/osvdb/96079 – h3xStream

Problemi correlati