Why this matters
Deserializing untrusted data without validation can allow attackers to inject malicious objects, leading to remote code execution and security breaches.
Ensure that deserialization processes validate untrusted data before processing to prevent code execution vulnerabilities.
Deserializing untrusted data without validation can allow attackers to inject malicious objects, leading to remote code execution and security breaches.
Side-by-side examples engineers can pattern-match during review.
public class RequestProcessor {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletInputStream servletIS = request.getInputStream();
ObjectInputStream objectIS = new ObjectInputStream(servletIS);
Object input = objectIS.readObject();
}
}public class SecureObjectInputStream extends ObjectInputStream {
@Override
protected Class<?> resolveClass(ObjectStreamClass osc) throws IOException, ClassNotFoundException {
List<String> approvedClasses = new ArrayList<String>();
approvedClasses.add(AllowedClass1.class.getName());
approvedClasses.add(AllowedClass2.class.getName());
if (!approvedClasses.contains(osc.getName())) {
throw new InvalidClassException("Unauthorized deserialization", osc.getName());
}
return super.resolveClass(osc);
}
}
public class RequestProcessor {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletInputStream servletIS = request.getInputStream();
ObjectInputStream objectIS = new SecureObjectInputStream(servletIS);
Object input = objectIS.readObject();
}
}public class RequestProcessor {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletInputStream servletIS = request.getInputStream();
ObjectInputStream objectIS = new ObjectInputStream(servletIS);
Object input = objectIS.readObject();
}
}public class SecureObjectInputStream extends ObjectInputStream {
@Override
protected Class<?> resolveClass(ObjectStreamClass osc) throws IOException, ClassNotFoundException {
List<String> approvedClasses = new ArrayList<String>();
approvedClasses.add(AllowedClass1.class.getName());
approvedClasses.add(AllowedClass2.class.getName());
if (!approvedClasses.contains(osc.getName())) {
throw new InvalidClassException("Unauthorized deserialization", osc.getName());
}
return super.resolveClass(osc);
}
}
public class RequestProcessor {
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
ServletInputStream servletIS = request.getInputStream();
ObjectInputStream objectIS = new SecureObjectInputStream(servletIS);
Object input = objectIS.readObject();
}
}From the same buckets as this rule.