Advertencia sobre bibliotecas de Java y debilidades de seguridad de deserialización
Esto se debe principalmente a lo que es calificado como una locura en los métodos utilizados en Java. En este contexto, los científicos de las universidades de Francia, Alemania, Luxemburgo y Suecia se sumergieron profundamente en las vulnerabilidades de deserialización de Java conocidas y ahora han resurgido con sus hallazgos. En resumen, han llamado la atención sobre las formas en que las bibliotecas pueden introducir accidentalmente graves fallas de seguridad.
La serialización se utiliza para convertir un objeto de datos en la memoria en una serie de bytes para almacenamiento o transmisión. La deserialización invierte ese proceso al convertir un flujo de datos nuevamente en un objeto en la memoria.
En Java, esto se implementa mediante la interfaz java.io.Serializable. Pero la deserialización no es necesariamente segura porque la reconstrucción del objeto a partir de su flujo de bytes no involucra al constructor, el código modelo que inicialmente construye el objeto para que tenga las funciones y los métodos que debería tener. Si el constructor tenía comprobaciones de validación, no se ejecutan. Por lo tanto, es posible que la deserialización cree objetos que no son válidos o que tienen datos alterados.
Los errores de deserialización de Java pueden ser bastante graves. Por ejemplo, Log4Shell, la falla de ejecución remota de código que afecta a la biblioteca de registro de Apache Log4j fue posible gracias a la deserialización de Java. En noviembre de 2016, un ataque de ransomware comprometió más de dos mil computadoras administradas por la Agencia de Transporte Municipal de San Francisco (SFMTA) a través de una vulnerabilidad de deserialización de colecciones de Apache Commons.
Todo lo anterior implica que, para tener códigos adecuados, lo mejor es contar con sistemas desarrollados por expertos que se hayan actualizado en estos temas a través de un curso de Java. En las siguientes notas mostraremos las implicaciones en la seguridad del código.