Antes de hablar sobre deserialización insegura en detalle, es crucial entender el concepto básico.
Serialización
Piensa en la serialización como preparar tu mochila por la mañana. Tienes libros, cuadernos, botella de agua y tienes que organizarlo en tu mochila. La seriialización es coger diferentes piezas de información y ponerlas juntas para hacer que sean fáciles de guardar o mandar.

En programación, la serialización es el proceso de transformar el estado de un objeto en formato legible por humanos o binario que puede ser guardado o transmitido y reconstruído cuando se requiera. Esta capacidad es esencial en aplicaciones donde la información debe ser transferida entre partes diferentes de un sistema o a través de la red. En PHP este proceso lo realiza la función serialize().
Ejemplo
<?php $noteArray = array("title" => "My THM Note", "content" => "Welcome to THM!"); $serialisedNote = serialize($noteArray); // Converting the note into a storable format file_put_contents('note.txt', $serialisedNote); // Saving the serialised note to a file ?>
El siguiente output muestra la string serializada en el archivo note.txt, el cual incluye detalles de la estructura y contenido de la nota.
Serialised Note: a:2:{s:5:"title";s:12:"My THM Note";s:7:"content";s:12:"Welcome to THM!";}
Deserialización
Imagina que llegas a la escuela y necesitas lo que has guardado en la mochila esta mañana. La deserialización es como desempaqueta tu mochila cuando llegas a clase. La deserialización es el proceso de convertir la información formateada de vuelta en un objeto. Es crucial para recuperar información de archivos, bases de datos o a través de la red.

Siguiendo el anterior ejemplo, aquí está cómo deserializaríamos la nota en PHP:
<?php $serialisedNote = file_get_contents('note.txt'); // Reading the serialised note from the file $noteArray = unserialize($serialisedNote); // Converting the serialised string back into a PHP array echo "Title: " . $noteArray['title'] . "<br>"; echo "Content: " . $noteArray['content']; ?>
Este código lee la nota serializada de un archivo y la convierte de vuelta en un array, reconstruyendo la nota original.
Incidentes Específicos que Involucran Vulnerabilidades de Serialización
Hablemos de incidentes específicos donde las vulnerabilidades de serialización jugaron un rol crítico en las brechas de ciberseguridad.
Log4j Vulnerability CVE-2021-44228
- Incidente: La vulnerabilidad Log4j, o Log4Shell, es una debilidad de seguridad crítica encontrada en la librería Log4j de Apache2, usada ampliamente en aplicaciones Java. Esta vulnerabilidad permite a los atacantes ejecutar código arbitrario en los sistemas afectados explotando la funcionalidad de deserialización insegura de la librería.
- Impacto: El hecho de permitir a los atacantes ejecutar código arbitrario hizo que los atacantes pudieran comprometer infraestructura crítica, llevando a acceso no autorizado, disrupción del servicio y ataques de cadena de suministro.
WebLogic Server Remote Code Execution CVE-2015-4852
- Incidente: Esta vulnerabilidad estaba relacionada con cómo el Servidor WebLogic de Oracle mandaba la información al protocolo T3. Los atacantes podían mandar objetos maliciosos al servidor, que al deserializarlo llevaba a RCE.
- Impacto: Esta vulnerabilidad fue ampliamente explotada para ganar acceso no autorizado a sistemas, desplegar ransomware o robar informaciñon. Afectó a las versiones de WebLogic server que no deshabilitó el servicio vulnerable o pparcheó el problema.
Jenkins Java Deserialisation CVE-2016-0792
- Incidente: Jenkins es un servidor de automatización popular usado en el desarrollo de software. Experimentó una vulnerabilidad crítica que involucraba la deserialización Java. Los atacantes podían mandar payloads serializados a Jenkins CLI, la cual al deserializar permitía RCE.
- Impacto: Permitió a atacantes ejecutar comandos de shell, potencialmente tomando posesión del servidor Jenkins.
