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
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 jaxb. Oppure eseguire la deserializzazione in un ambiente strettamente controllato, con i responsabili della sicurezza che non consentiranno alcuna operazione imprevista.
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)
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
@MvG: http://osvdb.org/show/osvdb/96079 – h3xStream
- 1. È sicuro utilizzare os.environ.setdefault?
- 2. È "sicuro uso" sicuro per i siti live?
- 3. È possibile utilizzare jQuery per leggere i meta tag
- 4. rapidjson: codice funzionante per leggere il documento dal file?
- 5. DWScript è sicuro per i thread?
- 6. È int sicuro leggere da più thread?
- 7. È sicuro utilizzare ancora ASIHTTPRequest?
- 8. È sicuro utilizzare singleton ExecutorService
- 9. Quanto è sicuro utilizzare document.body.innerHTML.replace?
- 10. Carrierwave gem Percorso file sicuro Impossibile leggere l'errore del file
- 11. È sicuro utilizzare GetHashCode per confrontare identici tipi di Anonymous?
- 12. È sicuro creare cookie prima che il documento sia pronto?
- 13. È sicuro cancellare i file relay-bin di replica?
- 14. Leggere un documento PDF in Android
- 15. È sicuro utilizzare un repository git copiato?
- 16. È aperto(). Read() sicuro?
- 17. Quanto è sicuro utilizzare solo redis per implementare i flussi di attività?
- 18. Perché utilizzare SHA1 per i segreti di hashing quando SHA-512 è più sicuro?
- 19. MongoDB: è sicuro usare l'ID del documento "in pubblico"?
- 20. È possibile utilizzare python suds per leggere un file wsdl dal file system?
- 21. Qual è il modo pietonico per leggere i dati del file CSV come file di namedtuples?
- 22. Leggere i file Unicode C++
- 23. come utilizzare AVCaptureSession per leggere un video da un file?
- 24. È sicuro utilizzare updateApplicationContext per inviare il valore portachiavi
- 25. È sicuro utilizzare password_hash con caratteri Unicode?
- 26. È sicuro utilizzare le macro in R?
- 27. Leggere i primi byte di un file
- 28. Come utilizzare FileSystemObject per leggere il file in JavaScript
- 29. È possibile utilizzare read_csv per leggere solo righe specifiche?
- 30. È sicuro utilizzare l'API del database SQL Web HTML5?
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 –