In my view the issue is not located in Java serialization, but insecure programming in some common open source libraries.
Attributing this exploit to Java Serialization is wrong, the exploit requires door opening non-jdk code to be present on the server.
Unfortunately some libraries accidentally do this, however its very unlikely this is a wide spread (mis-) programming pattern.
How can a class at server side open the door ?
- the class has to define readObject()
- the readObject() method has to be implemented in a way that allows to execute code sent from remote
I struggle to imagine a sane use case on why one would do something along the line of
"readObject(ObjectInputStream in) { Runtime.exec(in.readString()); }"
or
"readObject(ObjectInputStream in) { define_and_execute_class(in.readBytes()); }"
Anyway, it happened. Again: something like the code above must be present on the class path at server side, it cannot be injected from outside.
Fixing this for fast-serialization
- fast-serialization 2.43 introduces a delegate interface, which enables blacklisting/whitelisting of classes, packages or whole package trees. By narrowing down classes being allowed for serialization, one can assure only expected objects are deserialized.
- if you cannot upgrade to fst 2.43 for backward compatibility reasons, at least register a custom serializer for the problematic classes (see exploit details). As registered custom serializers are processed by fast-serialization before falling back to JDK serialization emulation, throwing an exception in the read or instantiate method of the custom serializer will effectively block the exploit.
- There is no significant performance impact as this is executed on initialization only
Hotfixing stock JDK Serialization implementation
(Verfied for JDK 1.8 only)
Use a subclass of ObjectInputStream instead of the original implementation and put in a blacklisting/whitelisting by overriding this method in ObjectInputStream:
(maybe also check resolveProxyClass, I'm not sure wether this also can get exploited [probably not]).
This will have a performance impact, so its crucial to have a efficient implementation of blacklisting/whitelisting here.