Class.forName invocazione del costruttore e dell'input

9

Se una pagina web basata su Java accetta un parametro fornito dall'utente e crea un'istanza di un oggetto usando

Class.forName(parameter)
Qual è la peggiore conseguenza possibile?

L'utente malintenzionato ottiene le tracce dello stack. Dopo che l'oggetto è stato istanziato, viene lanciato su una classe proprietaria, quindi genererà un'eccezione in quel punto.

Esempio di conseguenza:

  • Enumera le classi sul classpath

Modifica: l'attaccante può anche specificare qualsiasi numero di stringhe passate al costruttore.

    
posta mhswende 06.06.2012 - 21:47
fonte

2 risposte

5

Questo lascia un sacco di spazio per abusi. In pratica, qualsiasi inizializzatore statico e qualsiasi costruttore con parametri stringa possono essere eseguiti: Questa è una vulnerabilità comune di < qualcosa > (ad esempio JSON) a parser Java, che consentono al blocco di dati non attendibili di specificare i nomi di classe.

I driver JDBC devono registrarsi nell'inizializzatore statico . Le classi che usano metodi nativi dovrebbero caricare la libreria nativa nel blocco di init statico. Inoltre esiste un anti-pattern singleton per creare l'istanza nel blocco statico. Quindi è possibile utilizzare la memoria, che non può essere GCed. E ovviamente qualcuno potrebbe aver scritto del codice che fa altre strane cose nel blocco statico di init.

Ci sono molte classi che hanno effetti collaterali nel loro costruttore . Ad esempio, l'istanziazione di un FileOutputStream con un nome file come parametro svuoterà quel file, assumendo che il processo java abbia il permesso di scrittura.

Questi esempi mi sono venuti in mente durante la lettura del post. Sono sicuro che ce ne sono molte altre.

Di più dovresti considerare se mostrare gli Stacktraces all'attaccante sia davvero necessario. È spesso una buona idea distribuire il minor numero possibile di informazioni in situazioni impreviste . Ad esempio, nella tua situazione, fa una differenza se un FileInputStream genera una IOException o una ClassCastException. Queste informazioni potrebbero rendere più semplice lo sfruttamento di un'altra vulnerabilità.

Al minimo è necessario selezionare TrustedInterface.class.isAssinableFrom(loadedClass) prima di richiamare il costruttore o utilizzare loadedClass.asSubclass(TrustedInterface.class) . Ma consiglio vivamente di utilizzare una whitelist di nomi di classe.

    
risposta data 08.06.2012 - 00:49
fonte
1

Class.forName() dal suo io non è in realtà un sink. Questa può essere una vulnerabilità, ma dipende da come viene utilizzato l'oggetto class restituito da questa chiamata di metodo.

L'uso di Class.forName() può portare a Riflessione non sicura in quanto un utente malintenzionato può essere in grado di creare un'istanza di classe di sua scelta e quindi invoca una chiamata al metodo sull'oggetto risultante.

    
risposta data 07.06.2012 - 23:28
fonte

Leggi altre domande sui tag