Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: code formatting boxes

...

This non-compliant code deserializes a byte array without first validating what classes will be created and without using a SecurityManager.

Code Block
bgColor#FFcccc
languagejava
class DeserializeExample {
    public static Object deserialize(byte[] buffer) throws IOException, ClassNotFoundException {
        Object ret = null;
        try (ByteArrayInputStream bais = new ByteArrayInputStream(buffer)) {
            try (ObjectInputStream ois = new ObjectInputStream(bais)) {
                ret = ois.readObject();
            }
        }
        return ret;
    }
} 

 

Compliant Solution

This compliant solution is based on http://www.ibm.com/developerworks/library/se-lookahead/ :

Code Block
bgColor#ccccff
languagejava
class LookAheadObjectInputStream extends ObjectInputStream {
    public LookAheadObjectInputStream(InputStream inputStream) throws IOException {
        super(inputStream);
    }

    @Override
    protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
        switch (desc.getName()) {
            case "GoodClass1": break;
            case "GoodClass2": break;
            default:	
                throw new InvalidClassException("Unexpected serialized class", desc.getName());
        }
        return super.resolveClass(desc);
    }
}

class DeserializeExample {
    private static Object deserialize(byte[] buffer) throws IOException, ClassNotFoundException {
        Object ret = null;
        try (ByteArrayInputStream bais = new ByteArrayInputStream(buffer)) {
            try (LookAheadObjectInputStream ois = new LookAheadObjectInputStream(bais)) {
                ret = ois.readObject();
            }
        }
        return ret;
    } 
}

Risk Assessment

Whether a violation of this rule is exploitable depends on what classes are on the JVM's classpath.  (Note that is a property of the execution environment, not of the code being audited.) In the worst case, it could lead to remote execution of arbitrary code.

...