SerialKiller is an easy-to-use look-ahead Java deserialization library to secure application from untrusted input.
When Java serialization is used to exchange information between a client and a server, attackers can replace the legitimate serialized stream with malicious data. Inspired by this article, SerialKiller inspects Java classes during naming resolution and allows a combination of blacklisting/whitelisting to secure your application.
Disclaimer: This library may (or may not) be 100% production ready yet. Use at your own risk!
Easy, isn't it? Let's look at a few details...
In your original code, you'll probably have something similar to:
ObjectInputStream ois = new ObjectInputStream(is);
String msg = (String) ois.readObject();
In order to detect malicious payloads or allow your application's classes only, we need to use SerialKiller instead of the standard java.io.ObjectInputStream. This can be done with a one-line change:
ObjectInputStream ois = new SerialKiller(is, "/etc/serialkiller.conf");
String msg = (String) ois.readObject();
The second argument is the location of SerialKiller's configuration file.
Finally, you may want to catch InvalidClassException exceptions to gracefully handle insecure object deserializations. Please note that this library does require Java 8.
SerialKiller config supports the following settings:
Example of serialkiller.conf
<?xml version="1.0" encoding="UTF-8"?>
<!-- serialkiller.conf -->
<config>
<refresh>6000</refresh>
<mode>
<!-- set to 'false' for blocking mode -->
<profiling>false</profiling>
</mode>
<blacklist>
<!--Section for Regular Expressions-->
<regexps>
<!-- ysoserial's BeanShell1 payload -->
<regexp>bsh\.XThis$</regexp>
<regexp>bsh\.Interpreter$</regexp>
<!-- ysoserial's C3P0 payload -->
<regexp>com\.mchange\.v2\.c3p0\.impl\.PoolBackedDataSourceBase$</regexp>
<!-- ysoserial's MozillaRhino1 payload -->
<regexp>org\.mozilla\.javascript\..*$</regexp>
[...]
</regexps>
<!--Section for full-package name-->
<list>
<!-- ysoserial's CommonsCollections1,3,5,6 payload -->
<name>org.apache.commons.collections.functors.InstantiateTransformer</name>
<name>org.apache.commons.collections.functors.ConstantTransformer</name>
<name>org.apache.commons.collections.functors.ChainedTransformer</name>
<name>org.apache.commons.collections.functors.InvokerTransformer</name>
[...]
</list>
</blacklist>
<whitelist>
<regexps>
<regexp>.*</regexp>
</regexps>
</whitelist>
</config>
This library has been dual-licensed to Apache License, Version 2.0 and GNU General Public License.