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
Â