Insecure Deserialization

Una posible mitigaciĂłn para una insegura deserializacion serĂ­a validar el contenido de esta previamente, comprobando que el objeto es de la clase que debe y posteriormente comprobando los atributos del mismo.

Riesgo de la vulnerabilidad

El peligro de que se deserialice el contenido sin validar dentro de la aplicación significa que podemos inyectar código malicioso, lo que permite incluso abrir una consola de comandos del sistema operativo con los privilegios que tenga el usuario que corre la aplicación. Pero encadenando este ataque con una escalada de privilegios, permitiría al atacante llegar a tener el control del sistema (pudiendo hacerse con contraseñas de servicios, usuarios, bases de datos). Si este esta en una red con otros sistemas, podría desencadenar en movimientos del atacante (pivoting) a otras máquina pudiendo comprometer aun más la Organización.

Nunca deserialices ningĂşn dato no confiable o sin validar.

RecomendaciĂłn

Se recomienda utilizar librerĂ­as de validaciĂłn, como la librerĂ­a SerialKiller.

Ejemplo con librerĂ­a:

CĂłdigo no recomendado:
ObjectInputStream ois = new ObjectInputStream(is); String msg = (String) ois.readObject()
CĂłdigo recomendado:
// Usando la librerĂ­a SerialKiller ObjectInputStream ois = new SerialKiller(is, "/etc/serialkiller.conf"); String msg = (String) ois.readObject();

Ejemplo sin librerĂ­a:

CĂłdigo no recomendado:
public EmployeeRequestVO deserializedEmployeeObject(EmployeeRequestVO employeeRequestVO) {         serializedEmployeeObject(employeeRequestVO);         EmployeeRequestVO employee = null;           ObjectInputStream ois;         try {             ois = new ObjectInputStream(new FileInputStream("emp.bin"));             employee = (EmployeeRequestVO) ois.readObject();             ois.close();         } catch (IOException | ClassNotFoundException e) {             e.printStackTrace();         }         return employee;     }
CĂłdigo recomendado:

Esta opción es más complicada de implementar ya que debemos crear una clase que valide el contenido de objeto. Para ello debemos extender la clase "ObjectInputStream", y comprobar que el "className" requerido con el aportado son el mismo. En caso de no serlo, deberá lanzar una excepción de error.

Referencias:

Deserialization - OWASP Cheat Sheet Series

GitHub - ikkisoft/SerialKiller: Look-Ahead Java Deserialization Library

Â