/
Insecure Deserialization

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:

https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html

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

 



Related content